什么是子查询

为什么要使用子查询

子查询的分类

怎样使用子查询

关联子查询

要使用的数据表

image.png

1. 什么是子查询?

子查询顾名思义就是在正常查询之前先查询出来一条数据或者一个表。

子查询的sql必须位于()内

2. 为什么要使用子查询?

优点:

子查询可以帮助去重

子查询相对连接查询比较容易理解

缺点:

子查询影响性能,开发过程中如果可以使用表连接代替的话,就要用表连接进行代替。代替的时候要记得加入去重。

3. 子查询的分类

from子查询:

一般使用表子查询情况比较多

where子查询:

一般使用标量子查询的情况比较多

exist子查询

4.怎样使用子查询?

一般子查询都是使用from和where配合查询

4.1 使用from子查询的例子:

SELECT

product_type,

cnt_product

FROM

( SELECT product_type, COUNT(*) AS cnt_product FROM Product GROUP BY product_type ) AS ProductSum;

查询结果

image.png

4.2 使用嵌套子查询

如果一层子查询还是筛选不出来想要的结果的情况下,可以使用嵌套多一层子查询来进行条件的筛选

Q:在上面子查询的基础上Q,查询产品等于4的商品

SELECT
product_type,
cnt_product
FROM
( SELECT * FROM
( SELECT product_type, COUNT(*) AS cnt_product FROM Product GROUP BY product_type )
AS ProductSum WHERE cnt_product = 4 ) AS ProductSum2;

运行结果:

image.png

4.3 标量子查询

标量子查询就是指通过其它的表来查出一个结果,根据这个结果再查询其它的数据

标量子查询必须满足子查询的结果唯一

Q:查询出销售单价高于平均销售单价的商品

如果直接再where后面加聚合函数的话是不可以的。

-- 在WHERE子句中不能使用聚合函数
SELECT
product_id,
product_ NAME,
sale_price
FROM
Product
WHERE
sale_price > AVG( sale_price );
A:这种情况下就需要使用标量子查询来进行处理
SELECT
product_id,
product_name,
sale_price
FROM
Product
WHERE
sale_price > ( SELECT AVG( sale_price ) FROM Product );
查询结果:
image.png
补充:

标量子查询的书写位置不仅可以where后面,还可以在select、group by、having后面使用

5. 关联子查询

关联子查询就是通过表连接的方式,用子查询做临时表,把要查的数据进行匹配。

换句话说就是,如果需要标量子查询,但是有多条数据的情况下使用关联子查询。

Q:查询办公用品、衣服和厨房用具三类商品中高于该类商品的平均销售单价的商品。

如果使用之前的标量子查询的话会报错,因为标量只能根据一条数据进行标量

-- 发生错误的子查询

SELECT product_id, product_name, sale_price

FROM Product

WHERE sale_price > (SELECT AVG(sale_price)

FROM Product

GROUP BY product_type);

A:使用关联子查询进行查询

SELECT
product_type,
product_name,
sale_price
FROM
Product AS P1
WHERE
sale_price > ( SELECT AVG( sale_price ) FROM Product AS P2
-- **************关键部分*******************
WHERE P1.product_type = P2.product_type -- *
-- *****************************************
GROUP BY product_type );

在where语句中加的关联就表示在同一品类中,商品的单价和商品的平均价进行比较

补充:

关联子查询的错误写法:

-- 错误的关联子查询书写方法

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

这种写法的错误原因是数据库先执行的是子查询,这个时候并没有P2临时表所以会报错。