Post

2.3 Group By (SQL)

GROUP BY 개요

Table 0: Film Table

film_idtitlerental_ratelength
1명량4.99120
2암살2.9990
3어벤져스0.9980
4기생충2.9960
5어바웃 타임2.99100

지금까지 다룬 내용들을 이용하여 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. 결과의 반환
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.