为了在SQL查询中使用HAVING,必须有一个GROUP BY来聚合列名吗?

在SQL查询中是否可以使用不带HAVINGGROUP BY

它们必须同时并存吗?

#1 楼

否。

它们不必共存,事实证明,Oracle中的以下查询有效:

select * from dual having 1 = 1;


在PostgreSQL中,以下查询有效:

select 1 having 1 = 1;


所以having不需要group by

在聚合阶段之后应用,必须如果要过滤汇总结果,则使用此选项。因此,情况并非如此,以下内容将无效:

select a, count(*) as c
from mytable
group by a
where c > 1;


在这种情况下,您需要将where替换为having,如下所示:

select a, count(*) as c
from mytable
group by a
having c > 1;



select *
from (
  select a, count(*) as c
  from mytable
  group by a
)
where c > 1;


您可以看到使用having只是一种简写最后一个查询的版本。



总而言之,在having阶段之后应用group by,而在where阶段之前应用group by

评论


另一个例子:SELECT MIN(a)AS mina,MAX(a)As maxa from mytable HAVING MIN(a)
–超立方体ᵀᴹ
2014年1月24日,9:16

是。 PostgreSQL允许以下构造选择count(*)= 1的1;我还没有掌握。

–科林·哈特(Colin't Hart)
2014年1月24日,9:22

SQL Server也允许,SELECT 1 AS ID,“ Colin” AS名称;而像Oracle这样的其他公司则有一个特殊的双重表。我认为这两种语法都不是ANSI / ISO SQL(需要FROM)。

–超立方体ᵀᴹ
2014年1月24日9:23



我并不是说缺少from,而是在hading子句中对count(*)的引用,而没有任何迹象表明要在哪个列上进行聚合。大概它聚合了select子句中的所有列。

–科林·哈特(Colin't Hart)
2014年1月24日,9:25

喔好吧。是的,我同意这就是它的作用(汇总您所指的所有行-空表的所有行)。

–超立方体ᵀᴹ
2014年1月24日9:26



#2 楼

具有用于过滤组。

where子句用于过滤行。

评论


blog.sqlauthority.com/2007/07/04/…

–sqlengineer
2014年1月24日在7:11

您的第一句话是不正确的。在聚合阶段之后应用,因此可以用于过滤组。

–科林·哈特(Colin't Hart)
2014年1月24日8:52



#3 楼

HAVING正在过滤组。
如果您没有GROUP BY原因,则所有行都代表一个组。
因此,如果HAVING中的谓词评估为true,则会得到一行,否则将没有行。

#4 楼

如果没有GROUP BY子句,则查询会将整个关系视为一个组。

例如

     select count(*)
     from dual
     having count(*) > 5;