Answers:
没有。
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;
您可以看到using having
只是该最后一个查询的简写形式。
总之,在阶段之后having
应用,group by
而在阶段之前where
应用。group by
select 1 having count(*) = 1;
我尚未掌握的以下构造。
SELECT 1 AS id, 'Colin' AS name;
而其他类似Oracle的dual
表有一个特殊的表。我认为这两种语法都不是ANSI / ISO SQL(需要使用FROM
)。
from
而是对该子句的引用没有任何迹象表明要在哪个列上进行聚合。大概它聚合了子句中的所有列。count(*)
having
select
在没有GROUP BY子句的情况下,查询会将整个关系视为一个组。
例如
select count(*)
from dual
having count(*) > 5;
SELECT MIN(a) AS mina, MAX(a) As maxa FROM mytable HAVING MIN(a) < MAX(a);