ThinkCatLog

[SQL] GROUP BY는 NULL을 어떻게 처리할까? 본문

데이터 분석/SQL

[SQL] GROUP BY는 NULL을 어떻게 처리할까?

생각냥 2024. 1. 21. 17:12

목차

GROUP BY
HAVING
    • WHERE과 HAVING의 차이
    • 예약어 동작 순서
NULL 처리 방식

Dall•E3를 이용하여 제작.

GROUP BY

GROUP BY는 그룹별 총합 또는 평균값등을 계산할 때 사용되며, 주로 SUM, AVG, COUNT 등의 함수와 함께 사용된다.

다음과 같이 Netflix에 올라온 작품들의 정보를 모아둔 Netflix 테이블이 있다. date_added는 해당 작품이 Netflix에 추가된 날짜를 말한다.

Netflix 테이블

SELECT EXTRACT(YEAR FROM date_added) AS added_year
     , COUNT(*)
FROM Netflix
GROUP BY added_year

실행 결과


HAVING

HAVING 은 GROUP BY 구문 이후 사용되는 예약어로, WHERE처럼 작동한다. 아래 쿼리는 2015년 이후로 Netflix에 추가된 작품의 갯수를 출력하는 쿼리이다.

SELECT EXTRACT(YEAR FROM date_added) AS added_year
     , COUNT(*)
FROM Netflix
GROUP BY added_year
HAVING added_year >= 2015

실행 결과

WHERE과 HAVING의 차이

WHERE과 HAVING 은 차이가 존재한다. WHERE 은 보통 GROUP BY 를 적용하기 전 테이블을 필터링 할 때 사용되며, HAVING 은 보통 GROUP BY 를 한 테이블을 필터링 할 때 사용된다.

아래 쿼리는 release_year가 2015년 이후 작품 중에, 추가된 작품 갯수가 1000개 이상인 연도를 추출하는 쿼리이다. release_year가 2015년인 작품은 GROUP BY 를 적용하기 전에 WHERE을 이용하여 필터링 하였고, 그 후 GROUP BY를 이용하여 넷플릭스에 추가된 연도별로 추가된 작품의 갯수를 세었다. 그 후 HAVING을 이용하여 추가된 작품 갯수가 1000개 이상인 연도에 대해서만 추출하였다.

SELECT EXTRACT(YEAR FROM date_added) AS added_year
     , COUNT(*)
FROM Netflix
WHERE release_year >= 2015
GROUP BY added_year
HAVING COUNT(*) >= 1000

실행 결과

예약어 동작 순서

예약어는 FROM > WHERE > GROUP BY > HAVING > SELECT > ORDER BY > LIMIT 순으로 실행된다. MySQL에서는 SELECT의 Alias를 GROUP BY와 HAVING에서 사용할 수 있지만, 다른 DBMS에서는 사용할 수 없는 경우가 있다.

출처 : 스택오버플로우

Oracler과 SQL Server에서는 Alias를 사용할 수 없지만 MySQL에서만 예외적으로 사용할 수 있다.


NULL 처리 방식

GROUP BY를 할 때, 컬럼에 NULL값이 있으면 NULL값을 가진 행을 하나의 그룹으로 묶어서 집계한다.

product_info 테이블

제품의 대한 정보를 나타낸 product_info 테이블이 있다. 4번째 행과 9번째 행의 Category 컬럼값은 NULL이다.

Category별 평균 Price값을 집계하는 쿼리이다. 결과는 오른쪽과 같다. NULL값끼리 하나의 그룹을 만들어서 값을 집계한다.

SELECT Category
     , AVG(Price)
FROM product_info
GROUP BY Category

쿼리 실행 결과


SQL 공부한 내용을 정리하기 위해 작성하는 글입니다. 아래의 데이터를 python을 이용하여 SQL에 저장하여 실습에 사용하였습니다. 

작업환경
MySQL Server 8.2.0
MySQL Workbench 8.0.34
Python 3.11.2
사용한 데이터 : Netflix Movies and TV Shows(kaggle) 

데이터 출처 :https://www.kaggle.com/datasets/shivamb/netflix-shows

 

Netflix Movies and TV Shows

Listings of movies and tv shows on Netflix - Regularly Updated

www.kaggle.com


참고

NULL Values and the GROUP BY Clause
[StackOverflow] SQL - using alias in Group By
Difference between Where and Having Clause in SQL