본문 바로가기
SQL

기초 문법 - GROUP BY문으로 데이터 조회하기

by d22pinsights 2024. 7. 20.

SELECT [열]
FROM [테이블]
WHERE [열] = [조건값]
GROUP BY [열]
HAVING [열] = [조건값]

 

데이터를 그룹화하고 싶을 때 바로 GROUP BY 문을 사용한다

그리고 데이터 그룹을 필터링할 때는 HAVING문을 사용한다

 

하나의 열을 기준으로 그룹화하기

Sakila에 포함된 film 테이블을 사용

USE sakila;
SELECT special_features FROM film GROUP BY special_features;

Deleted Scenes, Behind the Screnes

Trailers, Deleted Scenes

등으로 데이터가 그룹화 되었음

 

2개 이상의 열을 기준으로 그룹화하기
SELECT special_features, rating FROM film
GROUP BY speical_features, rating;

special_features 열로 먼저 그룹화한 다음 rating 열로 그룹화한 결과를 출력한다

반대로 rating을 먼저 쓴다면, rating열로 먼저 그룹화 한 후 special_features 열로 그룹화한 결과를 출력한다

 

COUNT로 그룹화한 열의 데이터 개수

GROUP BY 문은 집계 함수와 함께 사용하는 경우가 많다

COUNT(*) 는 모든 행의 개수를 세겠다라는 의미이다

SELECT special_features, COUNT(*) AS cnt FROM film GROUP BY special_features;

 AS cnt : 계산한 결과를 출력할 때 열 이름을 cnt로 하겠다는 의미이다.

SELECT special_features, rating, count(*) as cnt FROM film
group by special_features, rating
order by special_features, rating, cnt DESC;

위 코드는 special_features, rating 열을 기준으로 그룹화 한 후 데이터의 개수에 따라 내림차순으로 정렬한 결과를 출력한다

GROUP BY를 사용할 때는 SELECT를 해서 선택한 열로만 그룹화가 가능하다

 

HAVING문으로 그룹화한 데이터 필터링

그룹화한 데이터에서 데이터를 필터링하려면 HAVING문을 사용해야 한다

 

HAVING vs WHERE

HAVING : SELECT문으로 조회한 열이나 GROUP BY 문에 그룹화한 열에만 필터링 가능

WHERE : 테이블에 있는 열에 대해 적용

 

SELECT special_features, rating FROM film
GROUP BY special_features, rating
HAVING rating = 'G';

special_features, rating 열을 기준으로 그룹화 한 뒤, rating 열에서 G인 데이터만 필터링함

SELECT special_features, rating, COUNT(*) AS cnt FROM film
GROUP BY special_features, rating
HAVING rating = 'G' AND cnt > 8;

AND 연산자를 통해 조건을 1가지 이상 지정할 수 있다

 

DISTINCT 문으로 중복된 데이터 제거
SELECT DISTINCT [열] FROM [테이블]

DISTINCT는 지정된 열의 중복된 데이터를 제거한다

SELECT DISTINCT special_features, rating FROM film;

 

special_features, rating 열에서 중복된 데이터를 제거한다

DISTINCT 문은 중복을 제거 할 뿐, 그룹화 하거나 이를 이용해 계산 작업을 할 수는 없다

COUNT와 같은 계산 작업이 필요하다면 GROUP BY문을 사용 해야한다

 

 


정보처리 기사를 준비하면서 이런 코드를 맞추는 문제를 보는데

뭔가 익숙한데 막상 쓰려면 쓸 수 없어서 답답했다

이런 기초적인 것들도 쉽다고 슬렁 슬렁 넘어갔었는데, 다시 꼼꼼히 보면서 습득해야겠다

 

참고 : Do it! MySQL로 배우는 SQL 입문(4장 ~153p)