type
status
date
slug
summary
tags
category
icon
password
Property
简单查询
语法格式:
通配符*
如果给定一个通配符
*
,则返回表中所有列:DISTINCT
去除重复
使用
DISTINCT
关键字,指示MySQL
只返回不同的值。不能部分使用
DISTINCT
:DISTINCT
关键字应用于所有列而不仅是前置它的列。如果给出select distinct deptno,ename from emp
除非指定的两个列都不同,否则所有行都将被检索出来。执行算术计算
as 使用别名
Concat拼接字段
拼接(concatenate) 将值联结到一起构成单个值。多数DBMS使用
+
或||
来实现拼接,MySQL则使用Concat()
函数来实现使用完全限定的表名
也可以使用完全限定的名字来引用列(同时使用表名和列字)
表名也可以是完全限定的:
条件查询
Between and
between and
除了可以使用在数字方面之外,还可以使用在字符串方面:is null/is not null
找出哪些人津贴为NULL?在数据库当中NULL不是一个值,代表什么也没有,为空。空不是一个值,不能用等号衡量,必须使用
is null
或者is not null
:and和or的优先级
in等同于or
IN操作符用来指定条件范围,范围中的每个条件都可以进行匹配。IN取合法值的由逗号分隔的清单,全都括在圆括号中。
为什么要使用IN操作符?其优点如下:
- 在使用长的合法选项清单时,IN操作符的语法更清楚且更直观
- 在使用IN时,计算的次序更容易管理(因为使用的操作符更少)
- IN操作符一般比OR操作符清单执行更快
- IN的最大优点是可以包含其他SELECT语句,使得能够更动态地建立WHERE子句
not in: 不在这几个值当中
模糊查询like
在模糊查询当中,必须掌握两个特殊的通配符,一个是
%
,一个是_
%
代表任意多个字符,_
代表任意1个字符。注意尾空格:尾空格可能会干扰通配符匹配。例如,在保存词
SCOTT
时, 如果它后面有一个或多个空格, 则子句select ename from emp where ename like '%T';
将不会匹配它们,因为在最后的T后有多余的字符。解决这个问题的一个简单的办法是在搜索模式最后附加一个%
。一个更好的办法是使用函数去掉首尾空格注意NULL:虽然似乎
%
通配符可以匹配任何东西,但有一个例外,即NULL
使用通配符的技巧
MySQL
的通配符很有用,但这种功能是有代价的:通配符搜索的处理一般要比其他搜索所花时间更长,这里给出一些使用通配符要记住的技巧:- 不要过度使用通配符。如果其他操作符能达到相同的目的,应该使用其他操作符
- 在确实需要使用通配符时,除非绝对有必要,否则不要把它们用在搜索模式的开始处。把通配符置于搜索模式的开始处,搜索起来是最慢的
- 仔细注意通配符的位置。如果放错地方,可能不会返回想要的数
MySQL正则表达式
正则表达式的作用是匹配文本,将一个模式(正则表达式)与一个文本串进行比较。MySQL用WHERE子句对正则表达式提供了初步的支持,允许指定正则表达式,过滤SELECT检索出的数据。
MySQL仅支持多数正则表达式实现的一个很小的子集。
基本字符匹配
它告诉MySQL:REGEXP后所跟的东西作为正则表达式(与文字正文800匹配的一个正则表达式)处理
LIKE
匹配整个列。如果被匹配的文本在列值中出现,LIKE将不会找到它,相应的行也不被返回(除非使用通配符)。而REGEXP在列值内进行匹配,如果被匹配的文本在列值中出现,REGEXP
将会找到它,相应的行将被返回。这是一个非常重要的差别。那么,
REGEXP
能不能用来匹配整个列值(从而起与LIKE相同的作用)?答案是肯定的,使用^
和$
定位符(anchor)即可MySQL中的正则表达式匹配(自版本3.23.4后)不区分大小写(即,大写和小写都匹配)。为区分大小写,可使用
BINARY
关键字:进行OR匹配
匹配几个字符之一
如果只想匹配特定的字符,可通过指定一组用
[]
括起来的字符来完成匹配范围
集合可用来定义要匹配的一个或多个字符。例如,下面的集合将匹配数字0到9:
[0123456789]
为简化这种类型的集合,可使用-来定义一个范围。下面的式子功能上等同于上述数字列表:
[0-9]
。范围不限于完整的集合,[1-3]和[6-9]也是合法的范围。此外,范围不一定只是数值的,[a-z]匹配任意字母字符。匹配特殊字符
为了匹配特殊字符,必须用
\\
为前导。\\-
表示查找-
,\\.
表示查找.
\\
也用来引用元字符\
或\\?
多数正则表达式实现使用单个反斜杠转义特殊字符,以便能使用这些字符本身。但MySQL要求两个反斜杠(MySQL自己解释一个,正则表达式库解释另一个)匹配字符类
匹配多个实例
定位符
^[0-9\\.]
只在.或任意数字为串中第一个字符时才匹配它们。^
有两种用法:在集合中(用[]
定义),用它来否定该集合,否则,用来指串的开始处。LIKE
和REGEXP
的不同在于,LIKE
匹配整个串而REGEXP
匹配子串。利用定位符,通过用^
开始每个表达式,用$
结束每个表达式,可以使REGEXP
的作用与LIKE
一样。排序查询
区分大小写和排序顺序
在对文本性的数据进行排序时,A与a相同吗?a位于B之前还是位于Z之后?这些问题不是理论问题,取决于数据库如何设置。
在字典(dictionary)排序顺序中,A被视为与a相同,这是MySQL(和大多数数据库管理系统)的默认行为。但是,许多数据库管理员能够在需要时改变这种行为(如果数据库包含大量外语字符,可能必须这样做)。如果确实需要改变这种排序顺序,用简单的ORDER BY子句做不到,必须请求数据库管理员的帮助。
在同时使用
order by
和where
子句时,应该让order by
位于where
之后,否则将会产生错误聚合函数
聚合函数:
count
计数、sum
求和、avg
平均值、max
最大值、min
最小值所有的聚合函数都是对“某一组”数据进行操作的:
聚合函数还有另一个名字:多行处理函数,特点:输入多行,最终输出的结果是1行
聚合函数自动忽略NULL
找出工资高于平均工资的员工?
思考以上的错误信息:无效的使用了分组函数?
原因:SQL语句当中有一个语法规则,分组函数不可直接使用在
where
子句当中。因为group by
是在where
执行之后才会执行的。解决方案
count(*)
和count(具体的某个字段)
,有什么区别?分组函数也能组合起来用:
单行处理函数
单行处理函数:输入一行,输出一行
ifnull函数
所有数据库都是这样规定的,只要有NULL参与的运算结果一定是NULL
文本处理函数
日期和时间处理函数
数值处理函数
分组查询
group by
:按照某个字段或者某些字段进行分组
having
:having
是对分组之后的数据进行再次过滤
注:分组函数一般都会和
group by
联合使用,这也是为什么它被称为分组函数的原因。并且任何一个分组函数(count sum avg max min)都是在group by语句执行结束之后才会执行的。当一条
sql
语句没有group by
的话,整张表的数据会自成一组。多个字段能不能联合起来一块分组?
找出每个部门的最高薪资,要求显示薪资大于2900的数据
HAVING和WHERE的差别:这里有另一种理解方法,WHERE在数据分组前进行过滤,HAVING在数据分组后进行过滤。这是一个重
要的区别,WHERE排除的行不包括在分组中。这可能会改变计算值,从而影响HAVING子句中基于这些值过滤掉的分组。
找出每个部门的平均薪资,要求显示薪资大于2000的数据
分页查询
limit
是mysql
特有的,其他数据库中没有,不通用(Oracle
中有一个相同的机制,叫做rownum
)limit
取结果集中的部分数据,这时它的作用。案例:找出工资排名在第4到第9名的员工?
union
union
可以将查询结果集相加案例:找出工作岗位是SALESMAN和MANAGER的员工?
两张不相干的表中的数据拼接在一起显示?