学习目标:
- 掌握select语句的基本语法
- 熟练使用聚合函数计算
- 能理解分组需求进行分组计算
- 掌握表的多种连接方式
- 能根据数据模型进行多表联接查询
一、select基本语句
-- select语句select 【distinct】 列|表达式|函数 -- 4 什么FROM 数据源 -- 1 从哪里WHERE 表达式 -- 2 选择条件 的行GROUP BY 分组 -- 3 建立分组的字段HAVING 分组后的结果过滤 -- 5ORDER BY 排序关键字 -- 6 asc、降序 descLIMIT n[,m]
二、常用的聚合函数
- 求和 sum(expr)
- 求平均值 AVG( expr)
- 求最大值 MAX(expr)
- 求最小值 MIN(expr)
- 计数 count(*) 所有的行数 、 count(列名) 指定列中非空的数量
三、查询应用

1.获取服装类商品的最高团购价、最低团购价、平均团购价、数量 以及销售数量合计。(服装类商品的ategoryID18)。
分三步:
第一步: From 打开Productselect *from product第二步:Where 选择满足条件的行select *from product pwhere p.categoryID = 15 -- like第三步:select 查询的聚合函数SELECTMAX(p.currentPrice),MIN(p.currentPrice),AVG(p.currentPrice),COUNT(*),SUM(p.salesCount) -- 3FROMproduct pWHEREp.categoryID = 15 -- like第四步:美化SQL,完善标题SELECTMAX(p.currentPrice) 最高团购价,MIN(p.currentPrice) 最低团购价,AVG(p.currentPrice) 平均团购价 ,COUNT(*) 数量,SUM(p.salesCount) 销售数量合计 -- 3FROMproduct pWHEREp.categoryID = 15; -- like

2.显示不同类型的商品数量和平均团购价, 按照商品数量升序排列,如果商品数量相同,则按平均团购价降序排列。
第一步:from 打开表select * from product第二步:group by 建立每种类型的分组select *from product pgroup by p.categoryID第三步:select 分组计算SELECTp.categoryID 类型 ,COUNT(*) 商品数量,AVG(p.currentPrice) 平均团购价 -- 3FROMproduct p -- 1GROUP BYp.categoryID -- 2第四步:order by 对查询结果排序SELECTp.categoryID 类型 ,COUNT(*) 商品数量,AVG(p.currentPrice) 平均团购价 -- 3FROMproduct p -- 1GROUP BYp.categoryID -- 2ORDER BYCOUNT(*),AVG(p.currentPrice) DESC; -- 4第五步:美化和完善标题

3.显示有商家信息的每一种类型的商品数量和平均团购价,按照商品数量升序排列,如果商品数量相同,则按照平均团购价降序排列,但仅显示平均团购价大于100元的分组信息。
SELECTcategoryID 类型,COUNT(*) 数量,AVG(p.currentPrice) 平均团购价FROMproduct pWHEREp.shopID IS NOT NULLGROUP BYcategoryIDHAVINGAVG(p.currentPrice) > 100ORDER BYCOUNT(*),AVG(p.currentPrice);

四、联接查询
1.数据模型

2.内连接(等值连接、自然连接)
-- 1.使用笛卡尔积,where筛选满足条件行SELECT *-- DISTINCT c.customerNameFROM customer c,orders owhere c.customerID = o.customerID; -- 等值连接-- 2.使用join……on 条件表达式SELECT *FROM customer cINNER JOIN orders oON c.customerID = o.customerID;-- 3.使用join……using,要求联接表有同名字段,查询结果同名列不重复SELECT *FROM customer cJOIN orders o USING(customerID) ;-- 4.自然连接Natural JOIN,要求联接表有同名字段,查询结果同名列不重复SELECT *FROM customer cNATURAL JOIN orders o ;
3.练习:连接customer、orders、ordersDetail三个表

-- 新知学习-- 连接查询:-- 笛卡尔积SELECT *FROM customer c,orders o; -- n*m-- 内连接-- 1.使用笛卡尔积,where筛选满足条件行SELECT *-- DISTINCT c.customerNameFROM customer c,orders owhere c.customerID = o.customerID; -- 等值连接-- 2.使用join……on 条件表达式SELECT *FROM customer cINNER JOIN orders oON c.customerID = o.customerID;-- 3.使用join……using,要求联接表有同名字段,查询结果同名列不重复SELECT *FROM customer cJOIN orders o USING(customerID) ;-- 4.自然连接Natural JOIN,要求联接表有同名字段,查询结果同名列不重复SELECT *FROM customer cNATURAL JOIN orders o ;练习:连接customer、orders、ordersDetail三个表-- 练习连接 c\o\odSELECT *FROM customer c,orders o,ordersdetail odWHERE c.customerID = o.customerID AND o.ordersID = od.ordersID;SELECT *FROM customer cJOIN orders o ON c.customerID = o.customerIDJOIN ordersdetail od ON o.ordersID = od.ordersID;
小结:(利弊)
-- 1.内连接SELECT DISTINCT c.customerName,ordersIDFROM customer cjoin orders oON c.customerID = o.customerID;-- 外连接-- 1.左外连接,-- 左表为主表数据一个不落,右表没有匹配数据则为nullSELECT DISTINCT c.customerName,ordersIDFROM customer cLEFT join orders oON c.customerID = o.customerID;-- 2.右外连接,-- 右表为主表数据一个不落,左表没有匹配数据则为nullSELECT *FROM ordersdetail odRIGHT JOIN product pON p.productID = od.productID;-- 3.全外连接(没有直接实现的语句)-- 左外 UNION 右外SELECT *FROM ordersdetail odleft JOIN product pON p.productID = od.productID -- 左外UNION -- 并SELECT *FROM ordersdetail odRIGHT JOIN product pON p.productID = od.productID; -- 右外
1.可以看到多个表的字段
2.易于实现
3.效率不高(费时费空间),不适合大数据量
