본문 바로가기

Data Literacy/SQL

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

PostgreSQL logo image

 

앞선 아티클에서 HAVING의 개념과 기본적인 작동 원칙에 대해서 살펴보았습니다. 그럼 이제 이 내용을 토대로 실제 쿼리를 작성해서 데이터를 확인해 보도록 하겠습니다. 

 

 

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

앞서서 GROUP BY의 기본적인 개념과 사용법을 알아보았습니다. Chapter 2. JOIN을 이용한 데이터 조합 - (8) 그룹화 : GROUP BY & HAVING 1 이번 아티클에서는 본격적으로 GROUP BY에 대해서 살펴보도록 하겠습

nozeroslope.tistory.com

 

 


 

 

GROUP BY와 HAVING을 사용해 다음을 출력해 봅시다. 일단, GROUP BY를 이용해 SAMPLE00 테이블의 데이터를 조회해 보겠습니다. NAME을 기준으로 그룹을 만들고, 각각의 이름을 가진 데이터가 몇 개인지 카운트 해보겠습니다. 

 

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

 

 

 

이번에는 출력할 때 카운팅 한 개수가 1개인 데이터만 출력하도록 조건을 지정하겠습니다. 

 

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

 

 

 

 


 

 

앞선 아티클에서 각각의 쿼리 프레이즈의 처리 순서에 대해서도 살펴보았었습니다. 중요한 내용이니 다시 한번 디테일하게 살펴봅시다.

 

WHERE ▷ GROUP BY ▷ HAVING SELECT  ▷ ORDER BY

 

우리는 GROUP BY가 WHERE보다 나중에 처리되는 프레이즈이므로 WHERE 구에서 GROUP BY가 필요한 쿼리( COUNT(NAME) )를 사용할 수 없다고 했습니다. 그럼 반대로, ORDER BY 프레이즈에서는 사용이 가능합니다. 예를 들어 ORDER BY COUNT(NAME) 과 같은 쿼리를 사용할 수 있는 것이지요.

 

자, 여기서 응용하여 질문해 보겠습니다. AS를 이용하여 어떤 칼럼에 별칭을 붙이기도 하죠? 그럼 이 별칭을 GROUP BY나 HAVING에서 사용할 수 있을까요? 사용할 수 없습니다. 왜 그런지 위 프레이즈 처리 순서를 근거로 차근차근 살펴봅시다. AS를 사용해 별칭을 선언하는 프레이즈는 SELECT입니다. 그런데 SELECT는 GROUP BY와 HAVING 다음에 처리되는 순서를 갖고 있습니다. 결국 SELECT에서 선언하는 AS는, 그보다 앞선 GROUP BY나 HAVING에서는 사용할 수 없는 것이죠.

 

select name as n, count(name) as cn
  from sample00 s 
 group by n
having cn = 1;

--SQL Error [42703]: 오류: "cn" 이름의 칼럼은 없습니다
--Position: 78

 

위에서 에러가 난 지점을 잘 봅시다. "CN"이 없다고 에러가 났죠? 그럼 HAVING 프레이즈에서 "CN = 1"을 처리하다가 에러가 발생한 것입니다.