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

问题描述

我们需要查询数据库,以获取分数大于其所读大学的平均分数的学生。现在,在手册中,它与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可以返回多行-查询会导致错误。

我还建议您限定所有 all 列名,并为所有表赋予有意义的别名。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...