在SQL查询中使用不带GROUP BY的HAVING


26

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

HAVING没有GROUP BY在没有SQL查询的情况下可以使用的特殊情况?

它们必须同时存在吗?

Answers:


25

没有。

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;

您需要更换wherehaving在这种情况下,如下所示:

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;

您可以看到using having只是该最后一个查询的简写形式。


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


2
又如:SELECT MIN(a) AS mina, MAX(a) As maxa FROM mytable HAVING MIN(a) < MAX(a);
ypercubeᵀᴹ

1
是。PostgreSQL允许select 1 having count(*) = 1;我尚未掌握的以下构造。
Colin't Hart 2014年

SQL Server也允许,SELECT 1 AS id, 'Colin' AS name;而其他类似Oracle的dual表有一个特殊的表。我认为这两种语法都不是ANSI / ISO SQL(需要使用FROM)。
ypercubeᵀᴹ

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

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


1

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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.