1. 多表查询
1.子查询:嵌套在其他查询中的查询
位置可以在主查询select之后,或者过滤条件where之后。
2.标量子查询:只返回一行一列(即一个单元格的数据)的子查询。相当于是一个常数。
3.看结构好像不容易理解,直接看代码吧
有子查询的语句涉及两张表,这两张表可以是一样的,也可以是不一样的。
举例:
(1) 先用两张一样的表,要过滤出一行中的某一列(某个单元格)
如果已知筛选条件:saleprice的价格是大于15,代码:
SELECT * FROM milk_tea AS m1 WHERE m1.sale_price > 15;#2
#1,如果已知筛选条件:saleprice的价格是大于15
结果:
如果未知具体的筛选条件,比如只知道,saleprice 的价格大于milk_tea表中的奶茶的价格,同时不知道这个奶茶的价格,那怎么写,用查询语句代替具体的价格,代码:
SELECT *
FROM milk_tea AS m1
WHERE m1.sale_price > (
SELECT
m.sale_price
FROM milk_tea AS m
WHERE m.prod_name = '奶茶');#2
结果:
(2) 增加一个常数列,但是这个常数就是奶茶的价格
#1如果一已知奶茶价格是15,那么可以这样写:
SELECT m.* , 15 AS '奶茶价格' FROM milk_tea AS m;
结果:
#2 如果未知奶茶价格是15,代码:
SELECT m.*
, (SELECT m.sale_price
FROM milk_tea AS m
WHERE m.prod_name = '奶茶') AS '奶茶价格'
FROM milk_tea AS m;
结果:
(3) 不同表之间子查询
用Having过滤,用prod_info表中的数据进行展示,
#1 如果已知具体的过滤条件AVG(p.sale_price) > 15
代码:
SELECT p.class , AVG(p.sale_price)
FROM prod_info AS p
HAVING AVG(p.sale_price) > 15;
结果:
#2 如果未知具体的过滤条件
只知道要查询平均销售价格>milk_tea表中的奶茶价格
SELECT p.class , AVG(p.sale_price)
FROM prod_info AS p
GROUP BY p.class
HAVING AVG(p.sale_price) > (SELECT m.sale_price
FROM milk_tea AS m
WHERE m.prod_name = '奶茶');
结果:
(4)查询日用品类别中 销售价格大于均价的产品
step1,求出均价,作为标量子查询
step2,将这个标量子查询放进销售价格的查询语句中
代码:
step1 如果单独求均价,这样:
SELECT p.class , AVG(p.sale_price)
FROM prod_info AS p
WHERE p.class = '日用品';
结果: