在标准的 SQL 中,使用聚合函数(如 MIN()
、MAX()
、SUM()
等)时,有一些重要的规则需要遵循,特别是在查询中包含非聚合列时:
-
聚合函数(Aggregate Function):像
MIN()
,MAX()
,COUNT()
,SUM()
,AVG()
等函数是用于对某些列的数据进行汇总或计算。例如,MIN(age)
返回age
列中的最小值。 -
非聚合列(Non-Aggregated Columns):除了聚合函数之外的列,称为非聚合列(如
sname
、sid
等)。如果在查询中包含非聚合列,它们必须出现在GROUP BY
子句中. -
GROUP BY 子句:当你使用聚合函数的同时查询非聚合列时,所有非聚合列必须出现在
GROUP BY
子句中。这是为了确保 SQL 能明确地知道如何对数据进行分组和汇总。例如,SELECT sname, MIN(age)
会导致错误,因为 SQL 不知道如何处理sname
(没有被分组或汇总)。 -
案例:
需求: 查询最小的年龄的学生名字
正确示例 1:子查询SELECT sname, age FROM student WHERE age = (SELECT MIN(age) FROM student);
正确示例 2:ASC
SELECT sname FROM student ORDER BY age ASC LIMIT 1;
错误示范:
SELECT sname, min(age) FROM student;
这样的查询会抛出错误,原因是
sname
既不是聚合列也没有出现在GROUP BY
中,SQL 无法确定在聚合结果时应如何处理sname
。
示例一与示例二在出现多个同学都是min(age)的时候结果不太一样, ASC方式只会查询出这些最小年龄中第一个插入数据库的, 使用子查询则可以都查出. 大多数情况下使用子查询的方式.
总结:在使用聚合函数时,如果想查询其他列,必须确保这些列出现在 GROUP BY
中,或者通过子查询处理,以避免 SQL 引擎不确定如何处理聚合数据和非聚合列之间的关系。