1、建表test_group_by:
create table test_group_by(
id TINYINT not null,
uname varchar(10) ,
age TINYINT DEFAULT 0,
class TINYINT DEFAULT 1,
PRIMARY key(id)
)engine=INNODB
2、插入数据:
INSERT INTO test_group_by
VALUES
(1,'111',22,1),
(2,'222',42,1),
(4,'444',20,2),
(3,'333',20,2),
(0,'000',11,3),
(6,'666',33,3)
3、实例
3.1、group by col1的说明:col1列可以不在select列当中,下面的sql会给出示例。
3.2、select的列如果不在group by的列当中,并且根据group by 后面的列分组后任意列不能有唯一值,则这些不包含在group by 中的列都应该使用max或者min聚合函数。
如果按照class分组,查询每个class分组下age的最大值,sql如下:
SELECT
id,
uname,
max(age)AS age
FROM
test_group_by
GROUP BY
class;
MySQL会提示错误如下:
Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'mybatis.test_group_by.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
其它列情况一样的处理,正确的sql应该为:
SELECT
max(id),
max(uname),
max(age)AS age
FROM
test_group_by
GROUP BY
class;
3.3、select的列如果不在group by的列当中,并且根据group by 后面的列分组后任意列均有唯一值,则这些不包含在group by 中的列可以不使用max或者min聚合函数。
如果按照id分组,sql如下:
SELECT
id,
uname,
max(age),
class
FROM
test_group_by
GROUP BY
id;
4、如果没有通过order by子句显示地指定排序列,当查询使用group by子句的时候,结果集会自动按照分组的字段进行排序。如果不关心结果集的排序,而这种默认排序又导致了需要文件排序,则可以使用order by null ,让MySQL不再进行文件排序。也可以在group by子句中直接使用desc 或者asc 关键字,使分组的结果按需要的方向排序。