oracle " HAVING ... GROUP BY " 和 " GROUP BY ... HAVING " 之间 的 区别

ioekq8ef  于 2022-11-22  发布在  Oracle
关注(0)|答案(5)|浏览(112)

我已经得到了表MYTABLE,其中有2列:AB
我已经得到了以下代码片段:

SELECT MYTABLE.A FROM MYTABLE 
    HAVING SUM(MYTABLE.B) > 100
    GROUP BY MYTABLE.A

SELECT MYTABLE.A FROM MYTABLE 
    GROUP BY MYTABLE.A
    HAVING SUM(MYTABLE.B) > 100

是否相同?这两个代码是否可能返回不同的结果集?
先谢谢你了

relj7zay

relj7zay1#

正如文件所述,没有区别,人们只是习惯于在GROUP BY之后看到HAVING。
http://docs.oracle.com/cd/B28359_01/server.111/b28286/statements_10002.htm#SQLRF20040
在where_clause和hierarchical_query_clause之后指定GROUP BY和HAVING。如果同时指定GROUP BY和HAVING,则它们可以按任意顺序出现。
http://sqlfiddle.com/#!4/66e33/1

mrphzbgm

mrphzbgm2#

我 最初 写道 :
我 不 确定 你 的 第 一 个 查询 是否 有效 。 据 我 所 知 , HAVING 应该 总是 在 GROUP BY 之后 。
David Aldridge 纠正 了 我 的 错误 , Oracle 文档 指出 顺序 并 不 重要 。 尽管 出于 可读性 原因 ( 并 防止 与 WHERE 子句 混淆 ) , 我 不 建议 在 GROUP 之前 使用 HAVING , 但 从 技术 上 讲 , 它 是 正确 的 。 因此 , 您 的 问题 的 答案 是 " 是 的 , 它 是 相同 的 " 。

i5desfxk

i5desfxk3#

你不能在GROUP BY之前有HAVINGHAVING就像“WHERE“一样,只是条件是GROUP BY

92dk7w1h

92dk7w1h4#

子句将按顺序进行计算。您可以让HAVING子句紧跟在FROM子句之后。在这种情况下,HAVING子句将应用于结果集的所有行。在这种情况下,选择列表只能包含HAVING子句中包含的一个/多个/所有聚合函数。
因此,由于上述原因,您的第一个查询无效。

SELECT SUM(MYTABLE.B) AS s FROM MYTABLE 
HAVING SUM(MYTABLE.B) > 100

上面的查询将返回一行或不返回任何行,这取决于条件SUM(MYTABLE.B) > 100是否得到验证。
不过,还有一个原因使您的第一个查询无效。GROUP BY子句可能只引用它所应用的数据集中的列。因此,继续上面我的有效查询,您可以编写下面的有效查询(尽管它将是无用的和无意义的,因为它应用于一行或不应用于任何行):

SELECT SUM(s)
FROM 
(
SELECT SUM(MYTABLE.B) s
FROM MYTABLE 
HAVING SUM(MYTABLE.B) > 100
) q
GROUP BY s

所以,才回答:不,它们不一样。其中一个甚至是无效的。

du7egjpx

du7egjpx5#

WHERE和HAVING都允许在查询中添加条件。区别:我们将WHERE用于表中select返回的记录,将HAVING用于group by select查询返回的组

相关问题