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 操作符有以下注意事项:

  1. 必须有不小于 2 个的 SELECT 才能使用 UNION 操作符;
  2. 被组合的 SELECT 必须拥有相同的列、表达式、聚集函数;
  3. 列与列之间的数据类型需要时兼容的。

UNION 操作符使用方式是放在需要组合的 SELECT 的中间,例如:

这个结果就是从以下 2 个结果组合的:


不过,其实这个也可以用 WHERE 来过滤,也能起到相同的效果。具体使用哪种写法,还要具体问题具体分析。

是否去重

UNION 操作符返回的是去重后的数据,如果我不希望去重的话可以为 UNION 指定一个 ALL 参数即可。

组合查询排序

对组合查询的结果当然可以排序,不过对被组合的每个 SELECT 进行排序是没有意义的,一组合就又乱序了。因此在组合查询时只能有 1 个 ORDER BY,位于最后一行表示对分组查询的整体结果进行排序。

参考资料

《MySQL Crash Course》[英] Ben Forta 著,刘晓霞 钟鸣 译,人民邮电出版社
菜鸟教程——MySQL 教程

posted @ 2020-05-14 17:37  乌漆WhiteMoon  阅读(336)  评论(0编辑  收藏  举报