基本使用
语法
以下是GROUP BY
子句的基本语法:
sql
复制代码
SELECT col1, col2, ..., aggregate_function(col_name) FROM table_name WHERE condition GROUP BY col1, col2, ...;
其中,col1
, col2
, ...是要分组的列名,aggregate_function
是用于聚合数据的函数,如SUM
, AVG
, MAX
, MIN
等。table_name
是要从中检索数据的表的名称,condition
是可选的查询条件。
示例
sql
复制代码
SELECT column1, column2, COUNT(*) FROM table_name WHERE condition GROUP BY column1, column2 ORDER BY column1, column2;
在这个示例中,选择了column1
和column2
两列,并对它们进行了分组。使用COUNT(*)
函数来计算每个组中的行数。使用ORDER BY
子句按column1
和column2
升序排序结果集。
那怎么查询非分组的列名呢?
一般来讲 SELECT
中的值要么是来自于聚合函数(sum、avg、max等)的结果,要么是来自于 group by 后面的列。
从MySQL 5.7.5
之前默认是支持的,之后的版本默认SQL
模式包括ONLY_FULL_GROUP_BY
,
sql
复制代码
mysql> select version(); +-----------+ | version() | +-----------+ | 8.0.18 | +-----------+ 1 row in set (0.06 sec) mysql> select @@global.sql_mode; +-----------------------------------------------------------------------------------------------------------------------+ | @@global.sql_mode | +-----------------------------------------------------------------------------------------------------------------------+ | ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE, +-----------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.18 sec)
在这种模式下执行 SQL
会报下面的错误
vbnet
复制代码
mysql> select * from user group by age; 1055 - Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column xxx which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
可以通过下面两种方式解决: