- 基本格式
--asc升 序、desc降序
--限制查询的输出结果行
SQL select_expr
-
为字段取别名
-
使用谓语过滤记录
利用可过滤重复的行
SQL where
通过 子句可以实现很多复杂的条件查询,需要配合运算符确定查询条件
语法:
-
带 in 关键字的查询
关键字可以判断某个字段的值是否在指定的集合中
使用 搜索条件相当于用 连接两个比较条件
如 相当于表达式
也可使用 查询不在范围内的数据
-
带 between and 的范围查询
使用 搜索条件相当于用 连接两个比较条件
如 相当于表达式
检索条件指定排除某个范围的值,一般可以用 关键字来实现
-
带 like 的字符匹配查询
like 可以用于实现模糊查询,包含两种通配符 和
可以匹配一个或多个字符,可以代表任意长度的字符串,长度可以为0
只匹配一个字符
-
用 is null 关键字查询空值
一个字段值是空值或者不是空值,要么表示为 或 ;不能表示为 或
如果写成 或 ,系统的运行结果都直接处理为 值,按照 处理而不报错
通用格式
-
带 and 的多条件查询
利用指定的条件选择结果集中的行
条件表达式中字符型和日期类型值要放到单引号中
并列的条件不能出现逗号
-
带 or 的多条件查询
可以用来连接两个条件表达式
{% note info simple %}如果第一个条件和第二个条件都成立,则 AND 运算符显示一条记录。
如果第一个条件和第二个条件中只要有一个成立,则 OR 运算符显示一条记录。{% endnote %}
-
特殊运算符
相当于
相当于 。 是 的别名
不等同于 ,不等于其中某一个
、 可以配合其他运算符一起使用
SQL group by & having
子句可以将查询结果按属性列或属性列组合在行的上方进行分组,每组在属性列或属性列组合上具有相同的聚合值。
将一列或多列定义成为一组,是组内所有的行在那些列中的数值相同。出现查询的 列表中的每一列都必须同时出现在 子句中
-
使用 group by 关键词来分组
单独使用 关键词,查询结果只显示每组的一条记录。
-
group by 关键字与 group_concat() 函数一起使用
可以将每个组中的所有字段都显示出来。
-
group by 关键字与 having 一起使用
子句通常与 子句结合使用, 子句指定在应用 子句的筛选后要进一步应用的筛选。
SQL order by
使用 order by 子句可以对查询的结果进行升序(asc)或降序(desc)排列。
事项和原则:
- 默认情况下,结果集按照升序排列
- order by 子句包含的列并不一定出现在选择的列表中
- order by 子句可以通过制定列名、函数值和表达式的值进行排序
- order by 子句不可以使用text、ntext或image类型的列
- 在order by 子句中可以同时出现多个排序项
SQL limit
是用来限制查询结果的数量的子句。可以指定查询结果从哪条记录开始显示,还可以指定一共显示多少条记录。 可以指定初始位置。
MySQL常用的聚合函数包括 等
用来统计数据的条数
用来计算字段的值的总和
用来计算字段的值的平均值
用来查询字段的最大值
用来查询字段的最小值
SQL count()
函数对于“*”以外的任何参数,返回所选择聚合中非null值的行的数目
对于参数“*”,返回选择聚合所有行的数目,包含null值的行
SQL sum() / ayg()
函数可以求出表中某个字段取值的总和
函数可以求出表中某个字段去值的平均值
SQL max() / min()
函数可以求出表中某个字段取值的最大值
函数可以求出表中某个字段取值的最小值
SQL with rollup
可以在分组统计数据的基础上在进行相同的总日统计
被显示定义的与连接有关的关键字如下:
- :内连接,结果只包含满足条件的列
- :左外连接,结果只包含满足条件的行及左侧表中的全部行
- :右外连接,结果只包含满足条件的行及右侧表中的全部行
- :结果只包含两个表中的所有行的组合,指明两表间的笛卡尔积操作
内连接
内连接查询是通过比较数据源表间共享列的值,从多个源表检索符合条件的行的操作。可以使用等号运算符的连接,也可以连接两个不相等的列的值。
左外连接
左外连接是指将左表中的数据分别与右表中的每条数据进行连接和结合,返回的结果除内连接的数据外,还包括左表中不符合条件的数据,并在右表的相应列中添加 值。
右外连接
右外连接包含 子句中最右侧表的所有行。如果右侧表中的行与左侧表中的行不匹配,将为结果集中来自左侧表的所有列分配 值。
交叉连接
交叉连接是在没有 子句的情况下,产生的表的笛卡尔积。两个表作交叉连接时,结果集大小为二者行数之积。
连接多个表
对于三个以上关系表的连接查询,一般遵循下列规则:
连接n个表至少需要n-1个连接条件,比避免笛卡尔积的出现
为了缩小结果集,采用多余n-1个连接条件或使用其他条件都是允许的
合并多个结果集
操作可以将多个 语句的返回结果组合到一个结果集中。
使用 合并两个查询结果集时,所有查询中的列数和列的顺序必须相同且数据类型必须兼容。
语法格式如下:
格式参考说明:
- select_statement:select 语句
- union:指定组合多个结果集并返回为单个结果集
- all:将所有行合并到结果中,包括重复的行。如果不指定,将删除重复的行
连接查询
-
子查询的执行过程
MySQL对嵌套查询的处理过程是从内层向外层处理,即先处理最内层的子查询,然后把查询的结果用于其外查询的查询条件,再层层向外求解,最后得出查询结果。
-
子查询连接的关系
一般情况下,包含子查询的查询语句可以写成连接查询的方式。因此,通过子查询也可以实现多表之间的查询。在有些方面,多表连接的性能要优于子查询,原因是连接不需要查询优化器执行排序等额外的操作。
-
子查询中的常见运
子查询中可以包括 、、、、 等逻辑运算符,也可以包含比较运算符,如 和 等。
-
子查询的类型:
● 返回一个表的子查询是表子查询。 ● 返回带有一个或多个值的一行的子查询是行子查询。 ● 返回一行或多行,但每行上只有一个值的是列子查询。 ● 只返回一个值的是标量子查询。从定义上讲,每个标量子查询都是一个列子查询和行子查询。
-
使用子查询时应该注意如下的事项:
● 子查询需要用括号括起来。子查询中也可以再包含子查询,嵌套可以多至32层。
● 当需要返回一个值或一个值列表时,可以利用子查询代替一个表达式。也可以利用子查询返回含有多个列的结果集替代表或连接操作相同的功能。 ● 子查询不能够检索数据类型为 、 和 的列。 ● 子查询使用 时,只能在外层使用,不能在内层使用。
表达式
在MySQL语句中,可以把子查询的结果当成一个普通的表达式来看待,用在其外查询的选择条件中。此时子查询必须返回一个值或一个单个列值列表,此时的子查询可以替换 子句中包含 关键词的表达式。
派生表
利用子查询生成一个派生表,用于替代 子句中的数据源表,派生表可以定义一个别名,即子查询的结果集可以作为外层查询的源表。实际上是在 子句中使用子查询作为派生表数据源。
where 子查询
语句中的子查询实际上是将子查询的结果作为该语句条件中的一部分,然后利用这个条件过滤本层查询的数据。
-
比较运算符
比较运算符包括
-
in / not in
运算符可以检测结果集中是否存在某个特定的值,如果检测成功就执行外部的查询。
-
exists / not exists
使用 关键字时,内层查询语句不返回查询的记录,而是返回一个真假值。
当返回值为 时,外层查询语句将进行查询;当返回 时,外层查询语句不进行查询或查询不出任何记录。
-
对比较算法进行限制
、和运算都是比较运算的进一步限制。使用 时,当所有值都满足比较的关系时才返回 。 或 时同义词,表示表达式只要与子查询结果集中的某个值满足比较的关系时就返回
增、更、删
利用子查询修改数据,就是利用一个嵌套在、或 语句的子查询成批地增加、更新和删除表中的数据。
-
插入
语句中的 子句可用于讲一个或多个其他的表或视图的值添加到表中。使用 子查询可同时插入多行。
-
更新
语句中的 子查询可用于将一个或多个其他的表或视图的值进行更新。使用 子查询可同时更新多行数据。实际上是通过将子查询的结果作为更新条件表达式中的一部分。
模糊查询
-
字符 / 字符串开头
使用字符可以匹配以特定字符或字符串开头的记录。
-
字符 / 字符串结尾
使用字符可以匹配以特定字符或字符串结尾的记录。
-
符号“.”
用正则表达式来查询时,可以使用来替代字符串中的任意一个字符。
-
匹配指定字符串
正则表达式可以匹配字符串。如果指定多个字符串,需要用符号隔开,只要匹配这些字符中的任意一个即可。