学习目标:

    1.理解什么是多行子查询?

    2.多行子查询的几种情形及使用场景。

    3.多行子查询用在where子句中的比较符

    4.select子句中使用子查询

    5.from子句中使用子查询

    一、新知学习

    1.什么是多行子查询?

    返回多行单列或多行多列的查询结果。

    2.使用场景:多行单列多用于where子句,

    比较符: in 决不能用“=”,可以替换”=”

    all、any|some,不能使用单值比较符“> < ……”

    1. -- 1.查询“江汉路”、“司门口”和“西北湖”地区的商品信息,
    2. -- 要求输出商品标题、商品团购价和区域编号。
    3. -- 分析:
    4. -- 1.2 主查询:在product表中查询areaID是子查询的结果的
    5. -- 商品信息
    6. SELECT p.title 商品标题, p.currentPrice 商品团购价, p.areaID 区域编号
    7. FROM product p
    8. WHERE p.areaID in -- 不能用 =[Err] 1242 - Subquery returns more than 1 row
    9. -- 1.1 子查询:在area表中查询“江汉路”、“司门口”和
    10. -- “西北湖”地区的areaID
    11. (SELECT a.areaID -- 返回多行1
    12. FROM area a
    13. WHERE a.areaName in('江汉路','司门口','武广'));
    14. -- 2.查询所有男性顾客所购商品信息,要求输出商品标题和商品团购价,
    15. -- 并按照团购价升序排列。
    16. SELECT p.title 商品标题,p.currentPrice 商品团购价
    17. from product p
    18. WHERE p.productID in (
    19. -- 2.3查询男性客户所订购的商品ID
    20. SELECT od.productID
    21. FROM ordersdetail od
    22. WHERE od.ordersID in
    23. -- 2.2依据2.1的结果在orders表查询男性订单编号
    24. (SELECT o.ordersID
    25. FROM orders o
    26. WHERE o.customerID in
    27. -- 2.1找男性客户的customerID
    28. (SELECT c.customerID
    29. FROM customer c
    30. where c.gender='男')))
    31. order by p.currentPrice;
    1. -- ALL 用法 >ALL(子查询) 大于所有值
    2. -- <ALL(子查询) 小于所有值
    3. -- 查询团购价比所有服装类商品团购价都高的商品信息,
    4. -- 要求输出商品标题和商品团购价。
    5. SELECT p.title 商品标题,p.currentPrice 商品团购价
    6. FROM product p
    7. WHERE p.currentPrice >ALL (
    8. (SELECT p.currentPrice -- 多行子查询不能用 >
    9. from product p
    10. WHERE p.categoryID in
    11. (select cg.categoryID
    12. from category cg
    13. WHERE cg.categoryName='火锅')));
    14. -- !=ALL 就是NOT in 不在其中的
    15. -- =ALL 永远为空值
    16. SELECT p.title 商品标题,p.currentPrice 商品团购价
    17. FROM product p
    18. WHERE p.currentPrice = ALL (
    19. (SELECT p.currentPrice -- 多行子查询不能用 >
    20. from product p
    21. WHERE p.categoryID in
    22. (select cg.categoryID
    23. from category cg
    24. WHERE cg.categoryName='火锅')));
    25. -- ANY|SOME >ANY 大于最小的值
    26. SELECT p.title 商品标题,p.currentPrice 商品团购价
    27. FROM product p
    28. WHERE p.currentPrice >ANY (
    29. (SELECT p.currentPrice -- 多行子查询不能用 >
    30. from product p
    31. WHERE p.categoryID in
    32. (select cg.categoryID
    33. from category cg
    34. WHERE cg.categoryName='火锅')));
    35. -- <ANY 小于最大的
    36. SELECT p.title 商品标题,p.currentPrice 商品团购价
    37. FROM product p
    38. WHERE p.currentPrice <ANY (
    39. (SELECT p.currentPrice -- 多行子查询不能用 >
    40. from product p
    41. WHERE p.categoryID in
    42. (select cg.categoryID
    43. from category cg
    44. WHERE cg.categoryName='火锅')));
    45. -- =ANY 等价于 IN
    46. SELECT p.title 商品标题,p.currentPrice 商品团购价
    47. FROM product p
    48. WHERE p.currentPrice =ANY (
    49. (SELECT p.currentPrice -- 多行子查询不能用 >
    50. from product p
    51. WHERE p.categoryID in
    52. (select cg.categoryID
    53. from category cg
    54. WHERE cg.categoryName='火锅')));
    55. -- !=ANY 等价于NOT in
    56. SELECT p.title 商品标题,p.currentPrice 商品团购价
    57. FROM product p
    58. WHERE p.currentPrice !=ANY (
    59. (SELECT p.currentPrice -- 多行子查询不能用 >
    60. from product p
    61. WHERE p.categoryID in
    62. (select cg.categoryID
    63. from category cg
    64. WHERE cg.categoryName='火锅')));

    3.From子句使用多行多列子查询(表):

    1. -- FROM 子句使用子查询(多行多列--虚拟表)
    2. -- 为帮助商家提升定价能力,优化产品销售策略,
    3. -- 美淘网平台在向每位商家提供产品信息的同时,
    4. -- 还提供了该类商品的平均团购价。
    5. -- 1.1 product表,按categoryID分类统计商品的平均currentPrice
    6. -- 多行子查询数据不全,看成一张表
    7. SELECT c.categoryName ,t.`平均团购价`
    8. FROM category c
    9. NATURAL JOIN -- 将子查询看作表进行联接补充数据
    10. (SELECT p.categoryID , AVG( p.currentPrice) 平均团购价 -- 此处一定要把表达式取别名
    11. FROM product p
    12. GROUP BY p.categoryID) t;

    4.Select子句中使用子查询(单个值)

    1. SELECT
    2. (SELECT COUNT(*) 商品数
    3. FROM product p) 商品数,
    4. (SELECT COUNT(DISTINCT productID) 已订购商品个数
    5. FROM ordersdetail ) 已订购商品个数,
    6. (SELECT SUM(quantity) 已订购商品件数
    7. FROM ordersdetail ) 已订购商品件数

    小结:

    画板