group by和having的SQL执行顺序-教程测验是错误的还是我错了?
我正在做一些关于SQL查询的研究 我在TutorialPoint上遇到了以下问题,我不明白为什么答案是B而不是C 我一直被告知,GROUPBY子句出现在have之前,have总是出现在末尾。还有很多在线文档支持我的解决方案,例如:和 有人能告诉我为什么在下面的例子中B是正确的而不是C。教程给出的B是正确的 考虑以下模式-group by和having的SQL执行顺序-教程测验是错误的还是我错了?,sql,oracle,Sql,Oracle,我正在做一些关于SQL查询的研究 我在TutorialPoint上遇到了以下问题,我不明白为什么答案是B而不是C 我一直被告知,GROUPBY子句出现在have之前,have总是出现在末尾。还有很多在线文档支持我的解决方案,例如:和 有人能告诉我为什么在下面的例子中B是正确的而不是C。教程给出的B是正确的 考虑以下模式- STUDENTS( student_code, first_name, last_name, email, phone_no, date_of_birth,
STUDENTS(
student_code, first_name, last_name,
email, phone_no, date_of_birth,
honours_subject, percentage_of_marks
);
当平均分数超过50%时,下列哪个查询将正确列出每个荣誉科目的平均分数百分比
B
C
你的教程已关闭
拥有
符合分组条件
。我想可能有一些非标准的SQL解析器支持这种语法,但我真的不明白为什么;我相当肯定Oracle不会支持它(编辑:显然它支持-奇怪)。这就像是允许某人在SELECT
之前放置WHERE
子句,即使Oracle确实允许B工作,但它对实际发生的情况给出了错误的想法。此外,正如@a_horse_with_no_name所指出的,根据SQL标准,它是无效的,并且可能不适用于其他数据库
我认为C在所发生的事情方面更清楚,即having
子句在groupby
之后进行评估
编辑:
对于那些认为B在Oracle上不起作用的人,这里有一个演示:
B查询是错误的
查询的语法始终需要遵循WGHOW-where子句
G-分组依据
H-具有
O-订购人
Where和Order by是可选的,只有在使用group by语句时才能使用having
B
在语法上不正确。因此,这不可能是正确的答案。@GordonLinoff奇怪的是,Oracle(至少11.x)允许B工作。因此,问题是为什么在这种情况下B比C更正确……Oracle,文档显示分组依据
必须在具有
之前。然而,实现似乎并不尊重这一点,可以有任何顺序。奇怪的是,12c似乎忽略了在没有GROUP BY
子句的情况下使用HAVING
子句,这在早期版本的语法图中是有效的。本教程显然是错误的。B是无效的标准SQL(尽管Oracle似乎允许)。你有那个教程的链接吗?我们并不总是需要分组依据
。此查询有效:从平均分数(百分比分数)>50的学生中选择平均分数(百分比分数)
,它的意思是:仅当百分比大于50时才显示百分比。我必须承认,我不认为你可以在分组之前获得百分比。谢谢,我对这一点感到非常困惑。为造型问题道歉。@Hairdo-没问题。很乐意帮忙。您接受的答案是错误的(至少就Oracle而言是错误的)此外,还有“更清晰”的部分:B不是有效的标准SQL,它不能与例如Postgres一起使用。@a_horse_,没有名称-同意。我对答案做了补充。是的,我知道,对吗?我找不到一个对结果有影响的案例。所以我不明白为什么B比C好,反之亦然。B查询没有错!!只是不够清楚。只要在OracleMySQL上尝试一下,它就不允许出现ORA-00979:不是GROUP BY表达式错误,因为在GROUP BY之前执行了一个查询
select honours_subject,
avg(percentage_of_marks)
from students
having avg(percentage_of_marks) > 50.0
group by honours_subject;
select honours_subject,
avg(percentage_of_marks)
from students
group by honours_subject
having avg(percentage_of_marks) > 50.0;