MySQL 分组查询

196 阅读2分钟

分组查询

分组查询使用 GROUP BY 关键字,是对数据表中的记录做一次分组、归类,再去查询。

GROUP BY 后面是一个字段名,表示根据这个字段进行分组:

SELECT 字段列表 FROM 表名 [ WHERE 条件 ] GROUP BY 分组字段名 

比如有一张商品表里面有一个描述品牌的字段 brand,就可以根据 brand 进行分组,查询表中所有品牌的名字:

select brand from products group by brand;

分组通常和聚合函数一块使用,再上面的基础上,可以借助 COUNT() 函数,计算品牌的数量:

select count(brand) from products group by brand;

根据商品的销量,对各个品牌进行排名:

select brand, sum(sales) from products order by sales asc group by brand;

分组查询也支持多字段进行分组。

前面介绍的基本查询中,可以使用WHERE 语句做一些筛选条件。在做分组查询时也可以设置一定的约束条件,叫做 HAVING 语句,功能类似于 WHERE 语句。

Where 和 Having 的使用场景存在一些区别。首先是执行时机不同,group by 是一条分界线:where 是分组之前进行筛选,不满足 where 条件,不能参与到分组查询中;而 having 是数据分组之后对结果进行过滤。其次,就是 where 语句不能对聚合函数进行判断,而 having 可以。比如,查询分组之后销量在 3000 以上的品牌:

select brand, sum(sales) total_sale from products group by brand having total_sale >= 3000;

使用分组查询时有一些注意事项:

  • 分组之后,查询的字段一般为聚合函数和分组字段,查询其他字段无任何意义。
  • 执行顺序: where > 聚合函数 > having 。

MySQL 8.0 的新特性

MySQL 8.0 版本中,使用 GROUP BY 进行分组查询时不再有隐式排序。以前的版本中,会根据分组字段进行升序自动排序。现在如果需要对结果进行排序,需要明确指定 ORDER BY 自子句。

小结

MySQL 中的分组查询通常和聚合函数一起使用,可以快速做一些数据统计的工作。如果要对分组查询的结果进行筛选,可以使用 HAVING 子句。