简单易懂教你学会SQL关联子查询
2021/7/15 2:07:13
本文主要是介绍简单易懂教你学会SQL关联子查询,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
关联子查询的执行逻辑和通常的SELECT语句的执行逻辑完成不一样。这就是SQL关联子查询难以理解的原因。
目录
- 1.sql的执行顺序
- 2.关联子查询时的查询顺序
- 2.1 例子
- 2.2 关联子查询的执行过程
1.sql的执行顺序
我们首先来看看正常情况下SELECT的书写顺序和执行顺序:
- 书写顺序:
SELECT > FROM > WHERE > GROUP BY > HAVE > ORDER BY - 执行顺序:
FROM > WHERE > GROUP BY > HAVE > 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列排序
2.关联子查询时的查询顺序
2.1 例子
需求:“选取出各商品种类中高于该商品种类的平均销售单价的商品。”
关联子查询SELECT语句:
select * from product as p1 where p1.sale_price > ( select avg(sale_price) from product as p2 where p2.product_type = p1.product_type group by p2.product_type )
按照正常的select语句执行逻辑,应该从where子句中括号内的子查询开始,子查询也是一个select语句,应该这样开始执行:
- from product as p2 : 指定从Product获取数据
- where p2.product_type = p1.product_type:
此处的p1和p2都是指向Product表,都是它的别名,所以P1.product_type和p2.product_type必然是相等的,所以这个where子句是废话
但是我们如果删除这个废话后:
select * from product as p1 where p1.sale_price > ( select avg(sale_price) from product as p2 group by p2.product_type )
报异常:返回的结果多余1条
原因是p1.sale_price是一行数据,但是子查询的结果是3条数据,无法进行比较,更无法得到我们想要的“选取出各商品种类中高于该商品种类的平均销售单价的商品。”这个结果。
实际上,where p2.product_type = p1.product_type正是关联子查询,关联子查询的执行逻辑和正常的select语句执行的逻辑完全不同,这就是它的诡异之处
2.2 关联子查询的执行过程
1.先执行主查询
SELECT product _type , product_name, sale_price FROM Product AS P1
结果:
2.从主查询中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关联子查询的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-06数据结构和算法面试题详解与实战
- 2024-11-06数据结构与算法面试题详解及练习
- 2024-11-06网络请求面试题详解及实战技巧
- 2024-11-06数据结构和算法面试真题详解及备考指南
- 2024-11-06数据结构与算法面试真题解析与练习指南
- 2024-11-06网络请求面试真题详解及实战攻略
- 2024-11-06数据结构和算法大厂面试真题详解与实战
- 2024-11-06数据结构与算法大厂面试真题详解及入门攻略
- 2024-11-06网络请求大厂面试真题详解及应对策略
- 2024-11-06TS大厂面试真题解析与实战指南