MySQL:子查询和组合查询
禁止码迷,布布扣,豌豆代理,码农教程,爱码网等第三方爬虫网站爬取!
子查询
所谓子查询,其实就是对检索的结果进行检索,也就是一种查询的嵌套,即我在查询到的数据中再次查询想要的数据。
子查询过滤
因为子查询是对检索的结果进行检索,可以理解为限定条件的查询,那么子查询应当有过滤功能。
这段代码发生了什么?可以被拆分为 2 步:
当然子查询是可以一直嵌套的,不仅局限于 2 层而已。
子查询计算字段
可以利用计算字段的构造实现子查询,即将查询的结果作为一个新的字段进行操作。
这个时候的子查询会因为检索出来的行数而重复执行多次,也就是每检索一次就使用一次子查询。
- 使用计算字段实现子查询必须使用完全限定列名,否则会因为嵌套而产生二义性。
组合查询
前面我们讨论过一个检索中使用多个 SELECT 语句的检索方式,也就是子查询,子查询中 SELECT 是一种嵌套关系。现在看看组合查询,所谓组合查询就是执行多个 SELECT,然后将这些查询结果进行合并,最后返回一个结果。组合查询有 2 种比较常见的用法,一种是对单个表进行了多次查询,一种是单个查询中操作了不同的表,对此可以进行合并。
创建组合查询
要创建组合查询就需要使用 UNION 操作符来实现,用这个操作符可以合并几个 SELECT 返回的结果。语法框架为:
SELECT expression1, expression2, ... expression_n
FROM tables
[WHERE conditions]
UNION [ALL | DISTINCT]
SELECT expression1, expression2, ... expression_n
FROM tables
[WHERE conditions];
UNION 操作符有以下注意事项:
- 必须有不小于 2 个的 SELECT 才能使用 UNION 操作符;
- 被组合的 SELECT 必须拥有相同的列、表达式、聚集函数;
- 列与列之间的数据类型需要时兼容的。
UNION 操作符使用方式是放在需要组合的 SELECT 的中间,例如:
这个结果就是从以下 2 个结果组合的:
不过,其实这个也可以用 WHERE 来过滤,也能起到相同的效果。具体使用哪种写法,还要具体问题具体分析。
是否去重
UNION 操作符返回的是去重后的数据,如果我不希望去重的话可以为 UNION 指定一个 ALL 参数即可。
组合查询排序
对组合查询的结果当然可以排序,不过对被组合的每个 SELECT 进行排序是没有意义的,一组合就又乱序了。因此在组合查询时只能有 1 个 ORDER BY,位于最后一行表示对分组查询的整体结果进行排序。
参考资料
《MySQL Crash Course》[英] Ben Forta 著,刘晓霞 钟鸣 译,人民邮电出版社
菜鸟教程——MySQL 教程