为了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)
您需要更换where与having在这种情况下,如下所示:
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