######################
#子查询 (嵌套select)
######################
-- 1.内层select首先执行
-- 2.子查询最好都要用as取个别名
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; -- 第二个子查询的别名
-- 3.标量子查询:一行一列,从而可以用=<>,可以在任何位置使用
SELECT product_id, product_name, sale_price
FROM Product WHERE sale_price >
(SELECT AVG(sale_price) FROM Product);-- 标量子查询
#使用标量子查询的注意事项
#一定不能返回多行结果
-- 4.关联子查询 :加上where
-- 在细分的组内进行比较时,需要使用关联子查询。
#错误示范
SELECT product_id, product_name, sale_price
FROM Product
WHERE sale_price > (SELECT AVG(sale_price) FROM Product
GROUP BY product_type); -- 会出错,因为这个子查询返回多行
#正确示范 :关联子查询
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 -- p2尽在子查询中有效
and sale_price > (SELECT AVG(sale_price) FROM Product AS P2
GROUP BY product_type);