SQL 쿼리에서 GROUP BY없이 HAVING 사용


26

HAVINGSQL 쿼리에서 사용 GROUP BY하려면 열 이름을 집계 해야 합니까?

SQL 쿼리 HAVING없이 사용할 수있는 특별한 경우가 GROUP BY있습니까?

그들은 동시에 공존해야합니까?

답변:


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;

당신은 교체해야 where와 함께 having다음과 같이,이 경우 :

select a, count(*) as c
from mytable
group by a
having c > 1;

NB 다음 쿼리 양식도 작동합니다.

select *
from (
  select a, count(*) as c
  from mytable
  group by a
)
where c > 1;

사용 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

SQL Server도 허용 SELECT 1 AS id, 'Colin' AS name;하지만 Oracle과 같은 다른 사람들에게는 특별한 dual테이블이 있습니다. 이 구문 중 하나가 ANSI / ISO SQL (필수)이라고 생각하지 않습니다 FROM.
ypercubeᵀᴹ

나는의 부족을 의미하지 않았다 from하지만에 대한 참조 count(*)에서 having이 집계되고있는 열 이상에 같은 표시없이 절을. 아마도 select절의 모든 열에 대해 집계 됩니다.
Colin 't Hart

그래. 예, 그것이 그 일에 동의합니다 (빈 테이블의 모든 행에 대해 의미하는 모든 행에 집계).
ypercubeᵀᴹ


1

HAVING이 그룹을 필터링 중입니다. GROUP BY 원인이없는 경우 모든 행은 하나의 그룹을 나타냅니다. 따라서 HAVING의 술어가 true로 평가되면 하나의 행을 얻습니다. 그렇지 않으면 행이 없습니다.


1

GROUP BY 절이 없으면 쿼리는 전체 관계를 하나의 그룹으로 간주합니다.

예 :

     select count(*)
     from dual
     having count(*) > 5;
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.