본문 바로가기

Data Literacy/SQL

Chapter 2. JOIN을 이용한 데이터 조합 - (8) 그룹화 : GROUP BY & HAVING 2

PostgreSQL logo image

 

앞서서 GROUP BY의 기본적인 개념과 사용법을 알아보았습니다. 

 

 

 

Chapter 2. JOIN을 이용한 데이터 조합 - (8) 그룹화 : GROUP BY & HAVING 1

이번 아티클에서는 본격적으로 GROUP BY에 대해서 살펴보도록 하겠습니다. 여기서 설명하기 위한 샘플 테이블을 아래 예시와 같이 생성해 보도록 하겠습니다. create table sample00 ( no int primary key, name

nozeroslope.tistory.com

 

 

그럼 이제 한 발자국 더 나아가서 생각해 보겠습니다. GROUP BY를 이용해 COUNT, AVG 등 다양한 집계 함수까지 사용할 때 특별한 조건을 부여할 때도 있겠죠? 예를 들어 '수량이 10개인 것만 출력한다'와 같은 조건 말이죠. 집계한 결과에서, 조건에 맞는 값만 따로 필터링하는 경우입니다.

 

자, 그럼 이제까지 배운 기본적인 내용에 근거해서 생각해 보겠습니다. '조건'을 설정하는데 사용했던 대표적인 명령 구가 무엇이었을까요? 바로 WHERE입니다! GROUP BY로 집계함수를 사용할 때, WHERE을 사용해서 조건을 지정해주면 되겠죠?... 자, 눈치채셨겠지만 당연히 정답은 "아니요"입니다. 

 

자, 예를 들어 보겠습니다. 우리가 앞서 살펴보았던 SAMPLE00 테이블에서 NAME을 기준으로 GROUP BY를 진행하고, 출력되는 칼럼은 NAME, COUNT(NAME)으로 가정해 보겠습니다. 그리고, 이 중 'COUNT(NAME)'의 수가 '1'인 것만 출력하는 조건을 걸어보겠습니다. 이 조건을 만족시키는 쿼리를 WHERE을 사용해서 작성해 보겠습니다. 

 

select name, count(name)
  from sample00 s 
 where count(name) = 1
 group by name;

 

자, 위와 같이 '그럴듯하게' 쿼리를 작성해 보았습니다. 이 쿼리를 실행하면 어떻게 될까요? 당연히 오류가 발생하게 됩니다. 그럼 어떤 부분에서 오류가 발생했는지 로그를 살펴보겠습니다. 

 

SQL Error [42803]: 오류: 집계 함수는 WHERE 절에서 사용할 수 없습니다.

 

위의 오류에서 핵심적 내용이 바로 나왔습니다. WHERE 구 내에서는 집계함수를 사용할 수 없습니다. 그렇다면, 왜? 사용이 불가한 것인지 살펴보겠습니다. 

 

 

 


 

 

우리가 작성한 위의 쿼리에서 의도한 것은, 'GROUP BY를 통해 NAME 기준으로 분류 → 분류된 값들 중 WHERE로 COUNT(NAME) 조건 검색'이었습니다. 오류가 발생하는 지점은 바로 여기입니다. SQL의 기본 쿼리 구문 처리 순서에 있어서, WHERE이 가장 먼저 실행되기 때문입니다.

 

SQL 구문의 실행 순서는 다음과 같습니다. 

 

WHERE ▷ GROUP BY ▷ SELECT  ▷ ORDER BY

 

결국, GROUP BY문이 실행되기 전에 WHERE이 가장 먼저 처리됩니다. 이러면 애초에 GROUP BY를 통해 실행되어야 하는 집계함수는 WHERE문 내부에서는 존재하지 않기 때문에 오류가 발생하는 것입니다!

 

이와 동일한 논리로, SELECT 구에서 어떤 칼럼을 AS를 통해 별명을 붙였을 경우 이 별명을 WHERE 구에서 사용할 수 없기도 합니다. 이래저래 WHERE은 가장 먼저 실행되는 아주 고지식하고 기본적인 녀석이라는 사실을 기억하세요.

 

 

 


 

 

기본적인 WHERE을 이용해서는 '집계함수를 사용해 출력한 결과를 특정 조건에 맞게 필터링하는 것'이 불가능합니다. 그럼, 다른 방법은 없을까요? 바로 이럴 때를 위해서 HAVING을 사용하게 됩니다.

 

HAVING의 특징은 다음과 같습니다. 

 

1. GROUP BY 바로 뒤에 붙여서 조건식으로 사용한다. 
2. 조건식에서는 그룹별로 집계된 열의 값이나 / 집계함수의 계산 결과를 작성한다.
3. 처리 순서도 GROUP BY 바로 다음이다. 
    [WHERE ▷ GROUP BY ▷ HAVING ▷ SELECT  ▷ ORDER BY]

 

그럼 이제 다음 아티클에서 실제로 HAVING을 사용해 보겠습니다.