mysql子查询(subquery) - 前端笔记-子查询就是指一个“正常查询语句”中的某个部分(比如select部分,from部分, where部分)又出现了查询的一种查询形式,比如: select * from XX表名 .....

学习笔记

点滴记忆
回忆过往
首页>> web后端 >>mysql子查询(subquery) - 前端笔记
2020-3-8
分类: web后端

mysql子查询(subquery)

文章作者:痴迷

子查询就是指一个“正常查询语句”中的某个部分(比如select部分,from部分, where部分)又出现了查询的一种查询形式,比如: select  *  fr......

子查询就是指一个“正常查询语句”中的某个部分(比如select部分,from部分, where部分)又出现了查询的一种查询形式,比如:

select  *  from  XX表名  where  price >= (一个子查询语句)

此时,子查询所在上“上层查询”,就被称为主查询

一,标量子查询
    标量子查询就是指子查询的结果是“单个值”(一行一列)的查询。

-- 子查询:
找出产品表中价格大于北京产地的产品平均价的所有产品。
select * from product where price > (
        #查询出北京产地所有产品的平均价
    select avg(price) from product where chandi='北京'
    );

课堂练习:
找出所有奢侈品!
    奢侈品的定义为:其价格超过贵重品的平均价!
        贵重品的定义为:超过所有商品的平均价!
select * from product where price > (
    #找出贵重品的平均价
    select avg(price) from product where price > (
        #去找出所有商品的平均价
        select avg(price) from product
    )
);






二,列子查询

列子查询查出的结果为“一列数据”,类似这样:


列子查询:
查出出产贵重商品(假设价格超过5000即为贵重商品)的那些产地的所有商品。
select * from product where chandi in(
    #找出出产贵重品的那些产地
    select chandi from product where price > 5000
);



三,行子查询

行子查询查出的结果通常是一行,类似这样:

-- 行子查询
找出跟单价最高的商品同品牌同产地的所有商品。
另一个分析思路:
1,先找出单价最高的商品的品牌和产地
    select pinpai, chandi from product where price = (
            select max(price) from product
        )
2, 然后,在上述“已知”的产地和品牌的情况,找同产地和品牌的“所有商品”
select * from product where row(pinpai, chandi) = (
    select pinpai, chandi from product where price = (
        select max(price) from product
    )
);



四,表子查询

当一个子查询查出的结果是“多行多列”的时候,就是表子查询。

表子查询的结果相当于一个表,可以直接当做一个表来使用。


-- 表子查询:
查出商品价格大于4000的所有商品的数量和均价
#1先找出价格大于4000的所有商品:
select * from product where price > 4000;
#2将上述查询结果(是多行多列的)当做一个表(表子查询),
#去对这些数据求出总数量和均价
select count(*) as 总数, avg(price) as 平均价 from (
    select * from product where price > 4000
as t;
当然,本需求,不用子查询,也可以实现,如下:
select count(*) as 总数, avg(price) as 平均价 from product where price>4000;


五,查询关键字

-- any的使用:
举例:找出在北京生产的但价格比在深圳生产的任一商品贵的商品。
select * from product where chandi = '北京' and price > any(
    #找出在深圳生产的所有产品的价格
    select price from product where chandi = '深圳'
);

-- all 的使用:
示例:找出在北京生产的但价格比在深圳生产的所有商品都贵的商品。
select * from product where chandi = '北京' and price > all(
    #找出在深圳生产的所有产品的价格
    select price from product where chandi = '深圳'
);


六,exists子查询

该子查询如果“有数据”, 则该exists()的结果为“true 即相当于 where  true (恒真)

该子查询如果“没有数据”,则该exists()的结果为“false,即相当于where  false(恒假)

-- exists子查询 示例:
1,查询商品分类名称中带“电”字的所有商品;
select * from product where exists(
    select * from product_type where protype_name like '%电%' and product_type.protype_id = product.protype_id
);
2,查询联想品牌的产品都有哪些分类;
select * from product_type where exists(
    select * from product where pinpai = '联想' and product.protype_id = product_type.protype_id
);
特别注意:
通常,有意义exists子查询不能单独执行
对比:之前的4种子查询都可以单独执行









×

感谢您的支持,我们会一直保持!

扫码支持
请土豪扫码随意打赏

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

打赏作者
版权所有,转载注意明处:前端笔记 » mysql子查询(subquery)

发表评论

路人甲 表情
Ctrl+Enter快速提交

网友评论(0)