MySQL中的group by的使用总结

本文探讨了数据库查询中的分组概念,如何使用groupby关键字进行数据分组,以及在分组查询中如何应用聚合函数如max()和count()。举例说明了在查询最大年龄的男女学生及其对应成绩时遇到的问题,强调了分组查询的限制,即select后的字段必须与聚合函数或分组字段相关。同时,展示了如何统计每个年龄段的学生人数以及计算存在的年龄段数量。

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

个人理解

在使用数据库查询语句时经常会有分组的应用场景,这时就要用到group by关键字,比如,想在一张学生表中查询年龄最大的男生和女生。个人理解的分组是:按照一个或多个字段将一张表分为多个组,并且之后的操作是按照组来进行的,不再是整张表了(如果不妥还请执教)。
在这里插入图片描述
按照组使用max()函数来求最大年龄时得到的就是每一组中的最大年龄。

分组也具有局限性

当一条语句使用group by时,其select后边的字段必须是聚合函数或者group by中使用到的字段。比如下边这个场景:一张学生表,一张成绩表,成绩表中通过学生主键来关联学生表,如果需要查询最大年龄的男生和女生对应的成绩。
第一想法的sql语句:

SELECT
	grade
FROM
	course c
INNER JOIN (
	SELECT
		max(age),
		id
	FROM
		student
	GROUP BY
		gender
) s ON c.sid = s.id;

这样写的最大问题是子查询中选择了max(age)、id,但是这样是不妥的,因为max(age)对应的id可能并不是得到的id(两者没有对应关系),max(age)只与gender有对应关系。

分组求数据条数

在分组中常用的还有count(),用来求数据条数。求学生表中的每个年龄段各有多少人:

SELECT
	count(1)
FROM
	student
GROUP BY
	age;

如果想求学生表中存在多少个年龄段:

SELECT
	count(1)
FROM
(
	SELECT
		1
	FROM
		student
	GROUP BY
		age
) a;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值