关于 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 多行——你的查询结果会出错。
我还建议您限定 所有 列名称并为所有表提供有意义的别名。
我们需要在数据库中查询分数高于其就读大学平均分的学生。现在,在手册中,它与 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 多行——你的查询结果会出错。
我还建议您限定 所有 列名称并为所有表提供有意义的别名。