对表进行分组
学习重点
使用 GROUP BY 子句可以像切蛋糕那样将表分隔,通过使用聚合函数和 GROUP BY 子句,可以依据”商品种类”或者”日期”等将表分隔后在汇总
聚合键中包含 NULL 时,在结果中会以”不确定”行(空行)的形式表现出来.
使用聚合函数或者 GROOUP BY 需要注意以下 4 点
特别注意
1.只能写在 select 子句中
2.GROUP BY 子句中不能使用 SELECT 子句中列的别名
3.GROUP BY 子句中的聚合结果是无序的
4.where 子句中不能使用聚合函数
GROUP BY 子句
- 基本语法
SELECT <列名>,<列名>,<列名>,...FROM <表名> GROUP BY <列名一>,<列名二>
- 实际操作,以上个单元来举例
SELECT product_name,product_type,COUNT(*) FROM Product GROUP BY product_type
- 最后结果
product_type | COUNT(*) |
---|---|
办公用品 | 2 |
厨房厨具 | 4 |
衣服 | 2 |
在 GROUP BY 子句中指定的列称为聚合键或者分组列,Group BY 一般和聚合函数一起使用,因为它一定会求组中的聚合属性
GROUP BY 子句的书写位置
- GROUP BY 书写位置有严格要求,一定要写在 FROM 之后(如果有 WHERE,一定要写在 WHERE 之后)
书写顺序
1.SELECT->2.FROM ->3.WHERE->4.GROUP BY
聚合键中包含 NULL 的情况
GROUP BY 分组里面有 NULL,它也会划分
- 代码
SELECT COUNT(*), purchase_price from product GROUP BY purchase_price;
- 这样当结果中包含 NULL 时,也会将 NULL 作为一组特定的数据
COUNT(*) | purchase_price |
---|---|
2 | NULL |
1 | 320 |
1 | 500 |
1 | 790 |
3 | 2800 |
1 | 5000 |
使用 WHERE 子句时 GROUP BY 的执行结果
- 在使用了 GROUP BY 子句的 SELECT 子句中,也可以正常使用 WHERE 子句
SELECT <列名>,<列名2>,....
FROM <表名>
WHERE
GROUP BY <列名1>
这样使用的时候会先依据 WHERE 子句对记录过滤
- 具体使用
SELECT purchase_price,COUNT(*)
FROM Product
WHERE product_type = '衣服'
GROUP BY purchase_price;
- 结果
purchase_price | COUNT(*) |
---|---|
500 | 1 |
2800 | 1 |
- 有了 GROUP BY 执行的顺序
FROM - WHERE - GROUP BY - SELECT
GROUP BY 特别注意
在使用 GROUP BY 的时候,SELECT 子句中不能出现聚合键之外的列名
- MYSQL 中没事,但是其他的数据库不行
因为使用 GROUP BY 就已经分组了,所以 就会出现有的时候并不一定是一对一关系的.
比如按照价格来分类的话,名称会非常多.做不到一对一
在 GROUP BY 子句中不能使用 SELECT 子句中定义的别名
- GROUP BY 中 写了列的别名
比如
SELECT product_type AS PT,COUNT(*) FROM Product GROUP BY PT;
GROUP BY 不能对结果排序,所以它是无序的
WHERE 子句中绝对不能使用聚合函数
- 比如错误的
SELECR * FROM Product WHERE COUNT(*) =2 ;
- 只有 SELECT 子句和 HAVING 子句(以及 ORDER BY 子句) 中能够使用聚合函数