在 SQL 查询中使用没有 GROUP BY 的 HAVING

Com*_*erd 30 aggregate

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

是否有任何特殊情况可以在HAVING没有GROUP BYSQL 查询的情况下使用?

它们必须同时共存吗?

Col*_*art 29

不。

它们不必共存,正如 Oracle 中的以下查询有效这一事实所证明的那样:

select * from dual having 1 = 1;
Run Code Online (Sandbox Code Playgroud)

同样,在 PostgreSQL 中,以下查询有效:

select 1 having 1 = 1;
Run Code Online (Sandbox Code Playgroud)

所以having 并不 需要 group by

有被应用 聚集阶段,如果要过滤汇总结果必须被使用。所以反过来是不正确的,以下是行不通的:

select a, count(*) as c
from mytable
group by a
where c > 1;
Run Code Online (Sandbox Code Playgroud)

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

select a, count(*) as c
from mytable
group by a
having c > 1;
Run Code Online (Sandbox Code Playgroud)

注意以下查询表单也可以使用:

select *
from (
  select a, count(*) as c
  from mytable
  group by a
)
where c > 1;
Run Code Online (Sandbox Code Playgroud)

您可以看到 usinghaving只是最后一个查询的简写版本。


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

  • 另一个例子:`SELECT MIN(a) AS mina, MAX(a) As maxa FROM mytable HAVING MIN(a) < MAX(a);` (2认同)

小智 5

Have 用于过滤组。

where 子句用于过滤行。