2.3 Group By (SQL)
GROUP BY 개요
Table 0: Film Table
film_id | title | rental_rate | length |
---|---|---|---|
1 | 명량 | 4.99 | 120 |
2 | 암살 | 2.99 | 90 |
3 | 어벤져스 | 0.99 | 80 |
4 | 기생충 | 2.99 | 60 |
5 | 어바웃 타임 | 2.99 | 100 |
지금까지 다룬 내용들을 이용하여 Film Table에서 대여료별 영화들의 총 상영 길이를 조회하는 쿼리문을 작성해보자:
1
2
3
SELECT SUM(length) FROM film WHERE rental_rate = 0.99;
SELECT SUM(length) FROM film WHERE rental_rate = 2.99;
SELECT SUM(length) FROM film WHERE rental_rate = 4.99;
이와 같이 3 개의 SELECT 문을 작성할 수 있을 것이다. 이런 쿼리는 유니크한 데이터의 종류가 많아지거나 그 값을 특정할 수 없을때는 사용이 제한적이다. SQL에서는 GROUP BY 라는 구문을 제공하여, 데이터별로 집계할 수 있는 기능을 제공한다. GROUP BY를 이용하면 3번의 쿼리문는 다음과 같은 하나의 쿼리문으로 대체된다:
1
2
3
4
5
6
7
8
9
SELECT SUM(length) FROM film GROUP BY rental_rate;
-- 조회 결과:
-- +-----+
-- | sum |
-- +-----+
-- | 80 |
-- | 250 |
-- | 120 |
-- +-----+
이떄 GROUP BY로 지정한 컬럼을 쿼리문에 포함하지 않는다면 분석에 어려움이 있기 때문에, 기준이되는 컬럼도 SELECT에 포함시키는 것을 권장한다.
1
2
3
4
5
6
7
8
9
SELECT rental_rate, SUM(length) FROM film GROUP BY rental_rate;
-- 조회 결과:
-- +-----------+-----+
-- |rental_rate| sum |
-- +-----------+-----+
-- | 0.99 | 80 |
-- | 2.99 | 250 |
-- | 4.99 | 120 |
-- +-----------+-----+
GROUP BY는 위의 예제처럼 그룹화할 컬럼을 지정하고, 지정된 그룹별로 나누어서 집계합수를 실행시키는 기능이다. 이떄, GROUP BY를 통해서 여러개의 컬럼을 지정하여, 그룹을 세분화 할 수도 있다. GROUP BY를 사용하는 경우 SELECT로 조회할 수 있는 값은 GROUP BY로 지정된 컬럼, 혹은 집계 함수로 계산된 값만 가능하다.
GROUP BY의 동작
GROUP BY의 동작은 다음과 같이 나눌 수 있다.
- 기준 컬럼을 바탕으로 그룹화
- 집계 함수의 계산
- 결과의 반환
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
+--------+---------+-----------+--------+
|film_id | title |rental_rate| length |
+--------+---------+-----------+--------+
| 1 | 명량 | 4.99 | 120 |
| 2 | 암살 | 2.99 | 90 |
| 3 | 어벤져스 | 0.99 | 80 |
| 4 | 기생충 | 2.99 | 60 |
| 5 |어바웃 타임 | 2.99 | 100 |
+--------+---------+-----------+--------+
|
+--------------------------+--------------------------+
| | | (1)
V V V
+-----------+--------+ +-----------+--------+ +-----------+--------+
|rental_rate| length | |rental_rate| length | |rental_rate| length |
+-----------+--------+ +-----------+--------+ +-----------+--------+
| 4.99 | 120 | | 0.99 | 80 | | 2.99 | 90 |
+-----------+--------+ +-----------+--------+ | 2.99 | 60 |
| | | 2.99 | 100 |
| | +-----------+--------+
| | | (2)
V V V
+-----------+--------+ +-----------+--------+ +-----------+--------+
|rental_rate| sum | |rental_rate| sum | |rental_rate| sum |
+-----------+--------+ +-----------+--------+ +-----------+--------+
| 4.99 | 120 | | 0.99 | 80 | | 2.99 | 250 |
+-----------+--------+ +-----------+--------+ +-----------+--------+
| | |
+--------------------------+--------------------------+ (3)
|
V
+-----------+--------+
|rental_rate| sum |
+-----------+--------+
| 4.99 | 120 |
| 0.99 | 80 |
| 2.99 | 250 |
+-----------+--------+
GROUP BY와 WHERE
GROUP BY와 WHERE를 동시에 사용하면 WHERE절이 먼저 동작한다. 또한 쿼리문을 작성할 때도 WHERE를 먼저 작성하게된다. 그리고 WHERE에서는 조건절에 집계함수를 이용할 수 없다. 집계함수를 이용한 필터링은 뒤에 다룰 HAVING이라는 기능을 통해서 제공한다.
This post is licensed under CC BY 4.0 by the author.