学习目标:

    1. 掌握select语句的基本语法
    2. 熟练使用聚合函数计算
    3. 能理解分组需求进行分组计算
    4. 掌握表的多种连接方式
    5. 能根据数据模型进行多表联接查询

    一、select基本语句

    1. -- select语句
    2. select distinct 列|表达式|函数 -- 4 什么
    3. FROM 数据源 -- 1 从哪里
    4. WHERE 表达式 -- 2 选择条件 的行
    5. GROUP BY 分组 -- 3 建立分组的字段
    6. HAVING 分组后的结果过滤 -- 5
    7. ORDER BY 排序关键字 -- 6 asc、降序 desc
    8. LIMIT n[,m]

    二、常用的聚合函数

    1. 求和 sum(expr)
    2. 求平均值 AVG( expr)
    3. 求最大值 MAX(expr)
    4. 求最小值 MIN(expr)
    5. 计数 count(*) 所有的行数 、 count(列名) 指定列中非空的数量

    三、查询应用

    2.1 美淘网联接查询 - 图1

    1.获取服装类商品的最高团购价、最低团购价、平均团购价、数量 以及销售数量合计。(服装类商品的ategoryID18)。

    分三步:

    1. 第一步: From 打开Product
    2. select *
    3. from product
    4. 第二步:Where 选择满足条件的行
    5. select *
    6. from product p
    7. where p.categoryID = 15 -- like
    8. 第三步:select 查询的聚合函数
    9. SELECT
    10. MAX(p.currentPrice),
    11. MIN(p.currentPrice),
    12. AVG(p.currentPrice),
    13. COUNT(*),
    14. SUM(p.salesCount) -- 3
    15. FROM
    16. product p
    17. WHERE
    18. p.categoryID = 15 -- like
    19. 第四步:美化SQL,完善标题
    20. SELECT
    21. MAX(p.currentPrice) 最高团购价,
    22. MIN(p.currentPrice) 最低团购价,
    23. AVG(p.currentPrice) 平均团购价 ,
    24. COUNT(*) 数量,
    25. SUM(p.salesCount) 销售数量合计 -- 3
    26. FROM
    27. product p
    28. WHERE
    29. p.categoryID = 15; -- like

    2.1 美淘网联接查询 - 图2

    2.显示不同类型的商品数量和平均团购价, 按照商品数量升序排列,如果商品数量相同,则按平均团购价降序排列。

    1. 第一步:from 打开表
    2. select * from product
    3. 第二步:group by 建立每种类型的分组
    4. select *
    5. from product p
    6. group by p.categoryID
    7. 第三步:select 分组计算
    8. SELECT
    9. p.categoryID 类型 ,
    10. COUNT(*) 商品数量,
    11. AVG(p.currentPrice) 平均团购价 -- 3
    12. FROM
    13. product p -- 1
    14. GROUP BY
    15. p.categoryID -- 2
    16. 第四步:order by 对查询结果排序
    17. SELECT
    18. p.categoryID 类型 ,
    19. COUNT(*) 商品数量,
    20. AVG(p.currentPrice) 平均团购价 -- 3
    21. FROM
    22. product p -- 1
    23. GROUP BY
    24. p.categoryID -- 2
    25. ORDER BY
    26. COUNT(*),
    27. AVG(p.currentPrice) DESC; -- 4
    28. 第五步:美化和完善标题

    2.1 美淘网联接查询 - 图3

    3.显示有商家信息的每一种类型的商品数量和平均团购价,按照商品数量升序排列,如果商品数量相同,则按照平均团购价降序排列,但仅显示平均团购价大于100元的分组信息。

    1. SELECT
    2. categoryID 类型,
    3. COUNT(*) 数量,
    4. AVG(p.currentPrice) 平均团购价
    5. FROM
    6. product p
    7. WHERE
    8. p.shopID IS NOT NULL
    9. GROUP BY
    10. categoryID
    11. HAVING
    12. AVG(p.currentPrice) > 100
    13. ORDER BY
    14. COUNT(*),
    15. AVG(p.currentPrice);

    2.1 美淘网联接查询 - 图4

    四、联接查询

    1.数据模型

    2.1 美淘网联接查询 - 图5

    2.内连接(等值连接、自然连接)

    1. -- 1.使用笛卡尔积,where筛选满足条件行
    2. SELECT *-- DISTINCT c.customerName
    3. FROM customer c,orders o
    4. where c.customerID = o.customerID; -- 等值连接
    5. -- 2.使用join……on 条件表达式
    6. SELECT *
    7. FROM customer c
    8. INNER JOIN orders o
    9. ON c.customerID = o.customerID;
    10. -- 3.使用join……using,要求联接表有同名字段,查询结果同名列不重复
    11. SELECT *
    12. FROM customer c
    13. JOIN orders o USING(customerID) ;
    14. -- 4.自然连接Natural JOIN,要求联接表有同名字段,查询结果同名列不重复
    15. SELECT *
    16. FROM customer c
    17. NATURAL JOIN orders o ;

    3.练习:连接customer、orders、ordersDetail三个表

    画板

    1. -- 新知学习
    2. -- 连接查询:
    3. -- 笛卡尔积
    4. SELECT *
    5. FROM customer c,orders o; -- n*m
    6. -- 内连接
    7. -- 1.使用笛卡尔积,where筛选满足条件行
    8. SELECT *-- DISTINCT c.customerName
    9. FROM customer c,orders o
    10. where c.customerID = o.customerID; -- 等值连接
    11. -- 2.使用join……on 条件表达式
    12. SELECT *
    13. FROM customer c
    14. INNER JOIN orders o
    15. ON c.customerID = o.customerID;
    16. -- 3.使用join……using,要求联接表有同名字段,查询结果同名列不重复
    17. SELECT *
    18. FROM customer c
    19. JOIN orders o USING(customerID) ;
    20. -- 4.自然连接Natural JOIN,要求联接表有同名字段,查询结果同名列不重复
    21. SELECT *
    22. FROM customer c
    23. NATURAL JOIN orders o ;
    24. 练习:连接customerordersordersDetail三个表
    25. -- 练习连接 c\o\od
    26. SELECT *
    27. FROM customer c,orders o,ordersdetail od
    28. WHERE c.customerID = o.customerID AND o.ordersID = od.ordersID;
    29. SELECT *
    30. FROM customer c
    31. JOIN orders o ON c.customerID = o.customerID
    32. JOIN ordersdetail od ON o.ordersID = od.ordersID;
    1. -- 1.内连接
    2. SELECT DISTINCT c.customerName,ordersID
    3. FROM customer c
    4. join orders o
    5. ON c.customerID = o.customerID;
    6. -- 外连接
    7. -- 1.左外连接,
    8. -- 左表为主表数据一个不落,右表没有匹配数据则为null
    9. SELECT DISTINCT c.customerName,ordersID
    10. FROM customer c
    11. LEFT join orders o
    12. ON c.customerID = o.customerID;
    13. -- 2.右外连接,
    14. -- 右表为主表数据一个不落,左表没有匹配数据则为null
    15. SELECT *
    16. FROM ordersdetail od
    17. RIGHT JOIN product p
    18. ON p.productID = od.productID;
    19. -- 3.全外连接(没有直接实现的语句)
    20. -- 左外 UNION 右外
    21. SELECT *
    22. FROM ordersdetail od
    23. left JOIN product p
    24. ON p.productID = od.productID -- 左外
    25. UNION --
    26. SELECT *
    27. FROM ordersdetail od
    28. RIGHT JOIN product p
    29. ON p.productID = od.productID; -- 右外
    小结:(利弊)

    1.可以看到多个表的字段

    2.易于实现

    3.效率不高(费时费空间),不适合大数据量

    此处为语雀卡片,点击链接查看