HAVING
,必须有一个GROUP BY
来聚合列名吗?在SQL查询中是否可以使用不带
HAVING
的GROUP 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
。#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;
评论
另一个例子: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