mysql 什么是子查询_MySQL 子查询

什么是子查询

为什么要使用子查询

子查询的分类

怎样使用子查询

关联子查询

要使用的数据表

dafd0f85e4d4

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;

查询结果

dafd0f85e4d4

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;

运行结果:

dafd0f85e4d4

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 );

查询结果:

dafd0f85e4d4

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临时表所以会报错。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值