关于 SQL 和 AVG 函数中相关子查询的问题

A question about a correlated subquery in SQL and AVG function

我们需要在数据库中查询分数高于其就读大学平均分的学生。现在,在手册中,它与 GROUP BY 子句一起使用,但我不明白如果大学已经在内部查询的 WHERE 条件中分组,为什么这里还需要一个。有人能解释一下这件事吗?

SELECT snum, stu_name, uni_name, points
FROM Students
INNER JOIN Applications a1 USING (snum)
WHERE points > (SELECT AVG(points)
FROM Students
INNER JOIN Applications a2 USING (snum)
WHERE a2.uni_name = a1.uni_name
GROUP BY uni_name);

不需要 GROUP BY,我不建议使用它。只需使用:

SELECT s.snum, s.stu_name, a.uni_name, points
FROM Students s INNER JOIN 
     Applications a USING (snum)
WHERE points > (SELECT AVG(points)
                FROM Students s2 INNER JOIN
                     Applications a2
                     USING (snum)
                WHERE a2.uni_name = a.uni_name
               );

在这种情况下,两者是等价的。但是如果你犯了一个错误,那么使用 GROUP BY 可以 return 多行——你的查询结果会出错。

我还建议您限定 所有 列名称并为所有表提供有意义的别名。