Mysql 基础(九) 表进行分组

对表进行分组

学习重点

  • 使用 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 子句) 中能够使用聚合函数

文章作者: 雾烟云
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 雾烟云 !
  目录