子查询就是指一个“正常查询语句”中的某个部分(比如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种子查询都可以单独执行
用心去记录前端旅途上的点点滴滴,用每一滴汗水换回所有付出所得的喜悦!
发表评论