group by和having的SQL执行顺序-教程测验是错误的还是我错了?

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,

我正在做一些关于SQL查询的研究

我在TutorialPoint上遇到了以下问题,我不明白为什么答案是B而不是C

我一直被告知,GROUPBY子句出现在have之前,have总是出现在末尾。还有很多在线文档支持我的解决方案,例如:和

有人能告诉我为什么在下面的例子中B是正确的而不是C。教程给出的B是正确的

考虑以下模式-

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查询是错误的

查询的语法始终需要遵循WGHO

W-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;