分组查询是SQL中一个非常强大的功能,它允许我们将数据按照一个或多个字段进行分组,并对每个分组进行聚合计算(如求和、平均值、最大值、最小值等)。在MySQL中,我们使用 GROUP BY
关键字来实现分组查询。
核心语法
SELECT column_1, column_2, ..., AGGREGATE_FUNCTION(column_N)
FROM table_name
WHERE condition
GROUP BY column_1, column_2, ...
HAVING condition
ORDER BY column_A;
SELECT
子句:选择需要显示的列,可以是普通列名,也可以是聚合函数的结果。FROM
子句:指定查询的表名。WHERE
子句(可选):在分组前对记录进行筛选。GROUP BY
子句:指定分组的列名,MySQL会按照这些列的值将记录分组。HAVING
子句(可选):在分组后对分组结果进行筛选。注意,HAVING
通常与聚合函数一起使用,因为WHERE
子句无法直接对聚合函数的结果进行筛选。ORDER BY
子句(可选):对查询结果进行排序。
执行顺序
MySQL 会在 FROM
和 WHERE
语句之后,HAVING
, SELECT
, DISTINCT
, ORDER BY
和 LIMIT
子句之前执行 GROUP BY
:
单独使用 GROUP BY
单独使用 GROUP BY
关键字时,查询结果会只显示每个分组的第一条记录,相当于 DISTINCT
。DISTINCT
相当于一种特殊的分组查询。
与 DISTINCT
不同的是,GROUP BY
会对结果进行排序,而 DISTINCT
不会。如果二者一同使用,查询结果会进行排序。
MySQL 8.0删除了GROUP BY子句的隐式排序。因此,如果使用MySQL 8.0+,会发现上面使用GROUP BY子句查询的结果集没有排序。
GROUP 和 GROUP_CONCAT() 函数
GROUP BY
关键字可以和 GROUP_CONCAT() 函数一起使用。GROUP_CONCAT() 函数会把每个分组的字段值都显示出来。
SELECT sex, GROUP_CONCAT(name)
FROM student
GROUP BY sex;
''&#