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(*)havingselect
在没有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);