查询语句 DQL
2021-4-4
| 2023-8-2
0  |  阅读时长 0 分钟
type
status
date
slug
summary
tags
category
icon
password
Property

简单查询

语法格式:
 

通配符*

如果给定一个通配符*,则返回表中所有列:
notion image

DISTINCT去除重复

使用DISTINCT关键字,指示MySQL只返回不同的值。
notion image
不能部分使用DISTINCTDISTINCT关键字应用于所有列而不仅是前置它的列。如果给出select distinct deptno,ename from emp除非指定的两个列都不同,否则所有行都将被检索出来。
notion image

执行算术计算

notion image

as 使用别名

notion image
 
notion image
notion image
 
 

Concat拼接字段

拼接(concatenate) 将值联结到一起构成单个值。多数DBMS使用+||来实现拼接,MySQL则使用Concat()函数来实现
notion image

使用完全限定的表名

也可以使用完全限定的名字来引用列(同时使用表名和列字)
notion image
表名也可以是完全限定的:
notion image
 

条件查询

notion image
 
notion image
 
 

Between and

 
between and除了可以使用在数字方面之外,还可以使用在字符串方面:
notion image
notion image

is null/is not null

找出哪些人津贴为NULL?在数据库当中NULL不是一个值,代表什么也没有,为空。空不是一个值,不能用等号衡量,必须使用 is null或者is not null
notion image
notion image
notion image

and和or的优先级

notion image
notion image

in等同于or

IN操作符用来指定条件范围,范围中的每个条件都可以进行匹配。IN取合法值的由逗号分隔的清单,全都括在圆括号中。
notion image
notion image
 
为什么要使用IN操作符?其优点如下:
  • 在使用长的合法选项清单时,IN操作符的语法更清楚且更直观
  • 在使用IN时,计算的次序更容易管理(因为使用的操作符更少)
  • IN操作符一般比OR操作符清单执行更快
  • IN的最大优点是可以包含其他SELECT语句,使得能够更动态地建立WHERE子句
 

not in: 不在这几个值当中

notion image

模糊查询like

在模糊查询当中,必须掌握两个特殊的通配符,一个是%,一个是_
%代表任意多个字符,_代表任意1个字符。
notion image
notion image
 
notion image
 
注意尾空格:尾空格可能会干扰通配符匹配。例如,在保存词SCOTT时, 如果它后面有一个或多个空格, 则子句select ename from emp where ename like '%T';将不会匹配它们,因为在最后的T后有多余的字符。解决这个问题的一个简单的办法是在搜索模式最后附加一个%。一个更好的办法是使用函数去掉首尾空格
 
注意NULL:虽然似乎%通配符可以匹配任何东西,但有一个例外,即NULL
 
使用通配符的技巧
MySQL的通配符很有用,但这种功能是有代价的:通配符搜索的处理一般要比其他搜索所花时间更长,这里给出一些使用通配符要记住的技巧:
  • 不要过度使用通配符。如果其他操作符能达到相同的目的,应该使用其他操作符
  • 在确实需要使用通配符时,除非绝对有必要,否则不要把它们用在搜索模式的开始处。把通配符置于搜索模式的开始处,搜索起来是最慢的
  • 仔细注意通配符的位置。如果放错地方,可能不会返回想要的数
 
 

MySQL正则表达式

正则表达式的作用是匹配文本,将一个模式(正则表达式)与一个文本串进行比较。MySQL用WHERE子句对正则表达式提供了初步的支持,允许指定正则表达式,过滤SELECT检索出的数据。
MySQL仅支持多数正则表达式实现的一个很小的子集。
 

基本字符匹配

它告诉MySQL:REGEXP后所跟的东西作为正则表达式(与文字正文800匹配的一个正则表达式)处理
notion image
 
LIKE匹配整个列。如果被匹配的文本在列值中出现,LIKE将不会找到它,相应的行也不被返回(除非使用通配符)。而REGEXP在列值内进行匹配,如果被匹配的文本在列值中出现,REGEXP将会找到它,相应的行将被返回。这是一个非常重要的差别。
那么,REGEXP能不能用来匹配整个列值(从而起与LIKE相同的作用)?答案是肯定的,使用^$定位符(anchor)即可
notion image
 
notion image
 
 
MySQL中的正则表达式匹配(自版本3.23.4后)不区分大小写(即,大写和小写都匹配)。为区分大小写,可使用BINARY关键字:
 

进行OR匹配

notion image
 

匹配几个字符之一

如果只想匹配特定的字符,可通过指定一组用[]括起来的字符来完成
notion image

匹配范围

集合可用来定义要匹配的一个或多个字符。例如,下面的集合将匹配数字0到9:[0123456789]
为简化这种类型的集合,可使用-来定义一个范围。下面的式子功能上等同于上述数字列表:[0-9]。范围不限于完整的集合,[1-3]和[6-9]也是合法的范围。此外,范围不一定只是数值的,[a-z]匹配任意字母字符。
 

匹配特殊字符

为了匹配特殊字符,必须用\\为前导。\\-表示查找-\\.表示查找.
\\也用来引用元字符
notion image
\\\? 多数正则表达式实现使用单个反斜杠转义特殊字符,以便能使用这些字符本身。但MySQL要求两个反斜杠(MySQL自己解释一个,正则表达式库解释另一个)

匹配字符类

notion image

匹配多个实例

notion image
notion image
 

定位符

notion image
notion image
^[0-9\\.]只在.或任意数字为串中第一个字符时才匹配它们。
^有两种用法:在集合中(用[]定义),用它来否定该集合,否则,用来指串的开始处。
LIKEREGEXP的不同在于,LIKE匹配整个串而REGEXP匹配子串。利用定位符,通过用^开始每个表达式,用$结束每个表达式,可以使REGEXP的作用与LIKE一样。
 
 

排序查询

 
notion image
 
notion image
 
notion image
 
区分大小写和排序顺序
在对文本性的数据进行排序时,A与a相同吗?a位于B之前还是位于Z之后?这些问题不是理论问题,取决于数据库如何设置。
在字典(dictionary)排序顺序中,A被视为与a相同,这是MySQL(和大多数数据库管理系统)的默认行为。但是,许多数据库管理员能够在需要时改变这种行为(如果数据库包含大量外语字符,可能必须这样做)。如果确实需要改变这种排序顺序,用简单的ORDER BY子句做不到,必须请求数据库管理员的帮助。
在同时使用order bywhere子句时,应该让order by位于where之后,否则将会产生错误
 
 

聚合函数

聚合函数count计数、sum求和、avg平均值、max最大值、min最小值
notion image
所有的聚合函数都是对“某一组”数据进行操作的:
聚合函数还有另一个名字:多行处理函数,特点:输入多行,最终输出的结果是1行
 
聚合函数自动忽略NULL
notion image
找出工资高于平均工资的员工?
思考以上的错误信息:无效的使用了分组函数?
原因:SQL语句当中有一个语法规则,分组函数不可直接使用在where子句当中。因为group by是在where执行之后才会执行的。
 
解决方案
notion image
 
count(*)count(具体的某个字段),有什么区别?
 
分组函数也能组合起来用:
notion image

单行处理函数

单行处理函数:输入一行,输出一行

ifnull函数

notion image
 
所有数据库都是这样规定的,只要有NULL参与的运算结果一定是NULL
notion image
 
 
 
notion image
 
 

文本处理函数

notion image
 

日期和时间处理函数

 

数值处理函数

 
 

分组查询

  • group by:按照某个字段或者某些字段进行分组
  • having : having是对分组之后的数据进行再次过滤
notion image
 
注:分组函数一般都会和group by联合使用,这也是为什么它被称为分组函数的原因。并且任何一个分组函数(count sum avg max min)都是在group by语句执行结束之后才会执行的。
当一条sql语句没有group by的话,整张表的数据会自成一组。
 
notion image
 
 
 
多个字段能不能联合起来一块分组?
notion image
 
 
 
找出每个部门的最高薪资,要求显示薪资大于2900的数据
notion image
 
 
 
notion image
 
HAVING和WHERE的差别:这里有另一种理解方法,WHERE在数据分组前进行过滤,HAVING在数据分组后进行过滤。这是一个重 要的区别,WHERE排除的行不包括在分组中。这可能会改变计算值,从而影响HAVING子句中基于这些值过滤掉的分组。
 
找出每个部门的平均薪资,要求显示薪资大于2000的数据
notion image
notion image
 
 
 

分页查询

limitmysql特有的,其他数据库中没有,不通用(Oracle中有一个相同的机制,叫做rownum
limit取结果集中的部分数据,这时它的作用。
 
 
notion image
 
 
案例:找出工资排名在第4到第9名的员工?
notion image
 
 
 
 

union

union可以将查询结果集相加
案例:找出工作岗位是SALESMAN和MANAGER的员工?
notion image
notion image
notion image
两张不相干的表中的数据拼接在一起显示?
notion image
 
notion image
 
  • MySQL
  • 表的操作 DDL数据操作 DML
    目录