MySQL:子查询和组合查询

禁止码迷,布布扣,豌豆代理,码农教程,爱码网等第三方爬虫网站爬取!

子查询#

所谓子查询,其实就是对检索的结果进行检索,也就是一种查询的嵌套,即我在查询到的数据中再次查询想要的数据。

子查询过滤#

因为子查询是对检索的结果进行检索,可以理解为限定条件的查询,那么子查询应当有过滤功能。

这段代码发生了什么?可以被拆分为 2 步:

当然子查询是可以一直嵌套的,不仅局限于 2 层而已。

子查询计算字段#

可以利用计算字段的构造实现子查询,即将查询的结果作为一个新的字段进行操作。

这个时候的子查询会因为检索出来的行数而重复执行多次,也就是每检索一次就使用一次子查询。

  • 使用计算字段实现子查询必须使用完全限定列名,否则会因为嵌套而产生二义性。

组合查询#

前面我们讨论过一个检索中使用多个 SELECT 语句的检索方式,也就是子查询,子查询中 SELECT 是一种嵌套关系。现在看看组合查询,所谓组合查询就是执行多个 SELECT,然后将这些查询结果进行合并,最后返回一个结果。组合查询有 2 种比较常见的用法,一种是对单个表进行了多次查询,一种是单个查询中操作了不同的表,对此可以进行合并。

创建组合查询#

要创建组合查询就需要使用 UNION 操作符来实现,用这个操作符可以合并几个 SELECT 返回的结果。语法框架为:

Copy Highlighter-hljs
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 @   乌漆WhiteMoon  阅读(371)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示
CONTENTS