MySQL中的group by 注意事项

本文介绍了MySQL中GROUP BY语句的使用注意事项,包括允许不在SELECT列表中的col1,使用聚合函数处理非分组列,以及GROUP BY与ORDER BY子句的使用规则。通过示例解释了如何正确构造SQL查询,以避免`sql_mode=only_full_group_by`错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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 关键字,使分组的结果按需要的方向排序。



评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值