ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

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

2021-07-14 19:59:15  阅读:175  来源: 互联网

标签:product price sale 查询 SQL 易懂 type SELECT


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

目录

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语句,应该这样开始执行:

  1. from product as p2 : 指定从Product获取数据
  2. 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列记录取完为止。得出整个语句的结果集,就是最后的答案。

标签:product,price,sale,查询,SQL,易懂,type,SELECT
来源: https://blog.csdn.net/qq_24099547/article/details/118734973

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有