SQL执行顺序分组和有 - 教程测验错误或我错了吗?

时间:2017-03-21 14:17:09

标签: sql oracle

我正在研究SQL查询。

我在TutorialsPoint上遇到了以下内容,我很困惑为什么答案是B而不是C.

我一直被告知GROUP BY Clause在HAVING之前出现并且HAVING总是在最后。网上还有很多文档可以支持我的解决方案,例如:http://www.dba-oracle.com/t_oracle_group_by_having.htmSQL query, sequence of execution

任何人都可以告诉我为什么B在以下示例中是正确的而不是C.本教程给出了正确的B。

考虑以下架构 -

STUDENTS(
    student_code, first_name, last_name, 
    email, phone_no, date_of_birth, 
    honours_subject, percentage_of_marks
);

当平均值超过50%时,以下哪个查询会正确列出每个荣誉科目的平均分数百分比?

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;

3 个答案:

答案 0 :(得分:3)

尽管Oracle确实允许 B 工作,但它却错误地了解了实际发生的情况。此外,正如@a_horse_with_no_name所指出的那样,它根据 SQL标准无效,并且可能无法在其他数据库上运行。

我认为 C 在发生的事情方面更清楚,即在having之后评估group by子句。

编辑:

对于那些认为 B 不在Oracle上工作的人,这是一个演示:

Demo

答案 1 :(得分:1)

您的教程已关闭。

HAVING符合GROUP BY条件。我想有可能有一些非标准的SQL解析器允许这种语法,但我真的不明白为什么;我相当肯定甲骨文不支持它(编辑:显然它确实 - 很奇怪)。这就像允许某人在WHERE

之前加上SELECT条款一样

答案 2 :(得分:1)

B查询错误。

查询语法始终需要遵循 WGHO

W- where子句

G-组由

H-有

O-订单由

Where和Order by是可选的,只有使用group by语句

才能使用