我已经得到了表MYTABLE,其中有2列:A和B我已经得到了以下代码片段:
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
是否相同?这两个代码是否可能返回不同的结果集?先谢谢你了
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
mrphzbgm2#
我 最初 写道 :我 不 确定 你 的 第 一 个 查询 是否 有效 。 据 我 所 知 , HAVING 应该 总是 在 GROUP BY 之后 。David Aldridge 纠正 了 我 的 错误 , Oracle 文档 指出 顺序 并 不 重要 。 尽管 出于 可读性 原因 ( 并 防止 与 WHERE 子句 混淆 ) , 我 不 建议 在 GROUP 之前 使用 HAVING , 但 从 技术 上 讲 , 它 是 正确 的 。 因此 , 您 的 问题 的 答案 是 " 是 的 , 它 是 相同 的 " 。
i5desfxk3#
你不能在GROUP BY之前有HAVING,HAVING就像“WHERE“一样,只是条件是GROUP BY。
GROUP BY
HAVING
WHERE
92dk7w1h4#
子句将按顺序进行计算。您可以让HAVING子句紧跟在FROM子句之后。在这种情况下,HAVING子句将应用于结果集的所有行。在这种情况下,选择列表只能包含HAVING子句中包含的一个/多个/所有聚合函数。因此,由于上述原因,您的第一个查询无效。
SELECT SUM(MYTABLE.B) AS s FROM MYTABLE HAVING SUM(MYTABLE.B) > 100
上面的查询将返回一行或不返回任何行,这取决于条件SUM(MYTABLE.B) > 100是否得到验证。不过,还有一个原因使您的第一个查询无效。GROUP BY子句可能只引用它所应用的数据集中的列。因此,继续上面我的有效查询,您可以编写下面的有效查询(尽管它将是无用的和无意义的,因为它应用于一行或不应用于任何行):
SUM(MYTABLE.B) > 100
SELECT SUM(s) FROM ( SELECT SUM(MYTABLE.B) s FROM MYTABLE HAVING SUM(MYTABLE.B) > 100 ) q GROUP BY s
所以,才回答:不,它们不一样。其中一个甚至是无效的。
du7egjpx5#
WHERE和HAVING都允许在查询中添加条件。区别:我们将WHERE用于表中select返回的记录,将HAVING用于group by select查询返回的组
5条答案
按热度按时间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
mrphzbgm2#
我 最初 写道 :
我 不 确定 你 的 第 一 个 查询 是否 有效 。 据 我 所 知 , HAVING 应该 总是 在 GROUP BY 之后 。
David Aldridge 纠正 了 我 的 错误 , Oracle 文档 指出 顺序 并 不 重要 。 尽管 出于 可读性 原因 ( 并 防止 与 WHERE 子句 混淆 ) , 我 不 建议 在 GROUP 之前 使用 HAVING , 但 从 技术 上 讲 , 它 是 正确 的 。 因此 , 您 的 问题 的 答案 是 " 是 的 , 它 是 相同 的 " 。
i5desfxk3#
你不能在
GROUP BY
之前有HAVING
,HAVING
就像“WHERE
“一样,只是条件是GROUP BY
。92dk7w1h4#
子句将按顺序进行计算。您可以让HAVING子句紧跟在FROM子句之后。在这种情况下,HAVING子句将应用于结果集的所有行。在这种情况下,选择列表只能包含HAVING子句中包含的一个/多个/所有聚合函数。
因此,由于上述原因,您的第一个查询无效。
上面的查询将返回一行或不返回任何行,这取决于条件
SUM(MYTABLE.B) > 100
是否得到验证。不过,还有一个原因使您的第一个查询无效。GROUP BY子句可能只引用它所应用的数据集中的列。因此,继续上面我的有效查询,您可以编写下面的有效查询(尽管它将是无用的和无意义的,因为它应用于一行或不应用于任何行):
所以,才回答:不,它们不一样。其中一个甚至是无效的。
du7egjpx5#
WHERE和HAVING都允许在查询中添加条件。区别:我们将WHERE用于表中select返回的记录,将HAVING用于group by select查询返回的组