美文网首页SQL大法好
SQL关联子查询

SQL关联子查询

作者: 羋学僧 | 来源:发表于2021-07-21 20:57 被阅读0次

简单易懂教你学会SQL关联子查询

初学SQL的人都会觉得SQL的关联子查询难以理解,为什么?这是有原因的。

关联子查询的执行逻辑和通常的SELECT语句的执行逻辑完成不一样。这就是SQL关联子查询难以理解的原因。

我们首先来看看正常情况下SELECT的书写顺序和执行顺序:

书写顺序:

SELECT==》FROM ==》WHERE==》GROUP BY==》HAVING==》ORDER BY

执行顺序:

FROM==》WHERE==》GROUP BY==》HAVING ==》SELECT==》ORDER BY

以下以Product表为例:

执行以下代码说明执行过程:

SELECT product_type,count(*)
FROM Product
WHERE sale_price > 100
GROUP BY product_type
HAVING count(*) > 1
ORDER BY product_type

执行过程如下:

1、FROM product

指定从Product表获取数据。

2、WHERE sale_price > 100

筛选销售价大于100的:

3、GROUP BY product_type

以product_type列分组:


4、HAVING count(*) > 1
筛选出组内数据行大于1的

5、SELECT product_type,count(*)
筛选出product_type,count(*)列

6、ORDER BY product_type
以 product_type列排序

上面我们说明了SELECT语句的书写和执行过程。我们再来看看以下“选取出各

商品种类中高于该商品种类的平均销售单价的商品。” 的关联子查询SELECT语句:

按照我们正常的select语句执行逻辑,应该从WHERE字句中的括号内的子查询开始,子查询也是一个SELECT语句,应该这样开始执行:

  1. FROM Product AS P2 :指定从Product获取数据。
  2. WHERE P1.product_type = P2.product_type :

这里的P1和P2都是指向Product表,都是它的别名,所以P1.product_type 与 P2.product_type必然是相等的,所以这个WHERE字句是废话。

既然是废话,我们删除这句废话看看:

SELECT product_type , product_name, sale_price
FROM Product AS P1
WHERE sale_price > (
SELECT AVG(sale_price)
FROM Product AS P2
GROUP BY product_type);

这个语句是错误的,原因是sale_price是一行数据,子查询的结果是3行数据,无法进行比较。更无法得到我们想要的“选取出各商品种类中高于该商品种类的平均销售单价的商品。”这个结果。

实际上,‘WHERE P1.product_type = P2.product_type’这个语句是关联子查询,关联子查询的执行逻辑和正常的SELECT语句执行逻辑完全不同,这就是它的诡异之处了(不知道规定它的人是怎么想的,搞那么复杂的逻辑)。

下面,我们来说明一下上面的关联子查询代码的执行过程:

记住,关联子查询和正常的SELECT语句完全不同。

  1. 先执行主查询
SELECT product _type , product_name, sale_price
FROM Product AS P1

结果:

  1. 从主查询的product _type先取第一个值=‘衣服’,通过WHERE P1.product_type = P2.product_type传入子查询,子查询变成:
SELECT AVG(sale_price)
FROM Product AS P2
WHERE P2.product_type = ‘衣服’
GROUP BY product_type);

第一次子查询结果:

从子查询得到的结果AVG(sale_price)=2500,返回主查询:

SELECT product_type , product_name, sale_price
FROM Product AS P1
WHERE sale_price > 2500 AND product_type = ‘衣服’

第一次整个语句的结果:


然后,product _type取第二个值,得到整个语句的第二结果,依次类推,把product _type全取值一遍,就得到了整个语句的结果集。结果如下:

事实上,所有关联子查询的执行过程都和上面的过程一样。


总结:

1、关联子查询的执行逻辑完全不同于正常的SELECT语句。

2、关联子查询执行逻辑如下:

(1)先从主查询的Product表中product _type列取出第一个值,进入子查询中,得到子查询结果,然后返回父查询,判断父查询的where子句条件,则返回整个语句的第1条结果。

(2)重复上述操作,直到所有主查询中的Product表中product _type列记录取完为止。得出整个语句的结果集,就是最后的答案。

相关文章

  • SQL关联子查询

    简单易懂教你学会SQL关联子查询 初学SQL的人都会觉得SQL的关联子查询难以理解,为什么?这是有原因的。 关联子...

  • 数据库笔记-SQL子查询

    子查询:关联查询和非关联查询 子查询是「查询」中的「查询」,就是「嵌套查询」。 以 NBA 的SQL数据库文件为例...

  • 速度问题

    sql里的关联子查询和交叉联接都是比较浪费时间的。 非关联子查询(Noncorrelated subquery) ...

  • 一文详解 SQL 关联子查询

    本文主要介绍什么是关联子查询以及如何将关联子查询改写为普通语义的sql查询。 在背景介绍中我们将讲讲常见的关联子查...

  • sql --子查询 && 关联子查询

    视图表 && 子查询子查询,即嵌套在其他查询中的查询,其结果集作为一个临时表使用,操作结束后释放临时表,和视图类似...

  • 数据分析之SQL子查询

    文章阅读路线: SQL子查询概念 独立子查询实例 相关子查询实例 SQL子查询常见玩伴 1.SQL子查询概念 子查...

  • 深入解析,快速教会你 SQL 子查询优化!

    子查询 (Subquery)的优化一直以来都是 SQL 查询优化中的难点之一。关联子查询的基本执行方式类似于 Ne...

  • MySQL的多表关联查询

    一、多表关联查询 多表关联查询是使用一条SQL语句,将关联的多张表的数据查询出来。 1.1 交叉查询 交叉查询就是...

  • SQL必知必会(子查询)

    一、什么是关联子查询,什么是非关联子查询 子查询虽然是一种嵌套查询的形式,不过我们依然可以依据子查询是否执行多次,...

  • 复杂SQL的子查询性能问题

    复杂SQL的子查询中的多表关联,执行计划中表连接顺序不一样,导致sql执行效率降低。 案例1: 问题背景:测试环境...

网友评论

    本文标题:SQL关联子查询

    本文链接:https://www.haomeiwen.com/subject/ddcsmltx.html