“HAVING ... GROUP BY”和“GROUP BY ... HAVING”之间的区别

时间:2013-12-09 13:00:44

标签: sql oracle syntax group-by having

我的表格 MYTABLE 有两列: 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

它是一样的吗?这两个代码是否有可能返回不同的结果集?

提前谢谢

4 个答案:

答案 0 :(得分:9)

据记载,没有区别。人们习惯于在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

答案 1 :(得分:2)

我最初写道:

  

我不确定您的第一个查询是否有效。据我所知,HAVING应该总是在GROUP BY之后。

甲骨文医生大卫·阿尔德里奇(David Aldridge)纠正了我的错误,该命令并不重要。虽然我不建议在GROUP之前使用HAVING以便于阅读(并且为了防止与WHERE子句混淆),但从技术上讲它是正确的。这样就可以回答你的问题'是的,它是一样的'。

答案 2 :(得分:0)

HAVING之前不能有GROUP BYHAVING就像“WHERE”而是GROUP BY条件。

答案 3 :(得分:0)

按顺序评估条款。您可以在FROM子句后立即使用HAVING子句。在这种情况下,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

所以,回答:不,他们不一样。其中一个甚至没有效。