个人理解
在使用数据库查询语句时经常会有分组的应用场景,这时就要用到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;