본문 바로가기
[SQL]

[SQL] GROUP BY 문, HAVING 문

by Hevton 2020. 9. 11.
반응형

이번 글에서는 데이터를 그룹화 하는 GROUP BY 문과. 이와 함께 쓰이는 조건절인 HAVING문에 대해서 알아보겠습니다.

 

현재 데이터베이스는 아래와 같은 상황입니다.

mysql> select * from people;
+----+--------+-----------+
| id | sex    | name      |
+----+--------+-----------+
|  1 | 남자    | 김준영      |
|  2 | 남자    | 박민수      |
|  3 | 여자    | 김영지      |
|  4 | 남자    | 이준수      |
|  5 | 남자    | 구준표      |
|  6 | 여자    | 이윤지      |
|  7 | 여자    | 이혜리      |
|  8 | 여자    | 권아영      |
|  9 | 여자    | 김예지      |
| 10 | 남자    | 이준필      |
+----+--------+-----------+
10 rows in set (0.00 sec)

 

여기서 간단히 GROUP BY 문을 써보겠습니다.

mysql> SELECT sex FROM people GROUP BY sex;
+--------+
| sex    |
+--------+
| 남자    |
| 여자    |
+--------+
2 rows in set (0.00 sec)

이렇게 sex를 그룹핑하면, 데이터들이 sex에 있는 값 별로 그룹화가 됩니다. sex 안의 데이터는 '남자' 와 '여자' 두 종류이므로, 두 종류로 그룹화가 되어 묶인 상태고, 그렇게 묶은 sex 부분을 출력했습니다. 여기서 중요한 건 필터링 되어 출력된 게 아니라 '압축' 되어 출력되어 있다고 생각하시면 좋습니다. 저기 보이는 '남자' 안에는 많은 name 데이터들이 묶여서 들어가 있는 거고, '여자' 안에도 마찬가지입니다.

 

따라서 이를 응용하면 아래와 같이 남자/여자에 묶여있는 (그룹핑 되어있는) 데이터들의 갯수도 출력할 수 있습니다.

mysql> SELECT sex, count(sex) FROM people GROUP BY sex;
+--------+------------+
| sex    | count(sex) |
+--------+------------+
| 남자    |          5 |
| 여자    |          5 |
+--------+------------+
2 rows in set (0.01 sec)

 

그리고 이런 GROUP과 함께 쓰이는 HAVING 문도 알아보겠습니다. 이 HAVING 문은, 그룹화한 데이터를 기반으로 WHERE문을 해준다고 생각하시면 됩니다. 그래서 HAVING과 WHERE의 차이점을 헷갈려하시는 분들이 계신데, WHERE는 그룹화 하기 전의 조건절이고 HAVING은 그룹화 한 이후의 조건절입니다. 즉 'WHERE 조건 GROUP BY x' 하면, 조건에 따라 필터링 한 값을 다시 GROUP BY 하는 것이고

'GROPU BY x HAVING 조건' 하면 그룹화 한 데이터를 기반으로 필터링 하는 것입니다. 둘이 코드상에서 쓰이는 위치도 다르고, 순서도 다른 것이죠.

 

이 HAVING 문을 이용해보겠습니다.

mysql> SELECT sex, count(sex) FROM people GROUP BY sex HAVING sex='남자';
+--------+------------+
| sex    | count(sex) |
+--------+------------+
| 남자    |          5 |
+--------+------------+
1 row in set (0.00 sec)

바로 위에에서 HAVING sex='남자' 를 추가했습니다. 여기서 주의할 점 하나만 짚고 넘어가자면

 

WHERE는 그룹핑 전. HAVING은 그룹핑 후라는 것.

mysql> SELECT sex, count(sex) FROM people WHERE id>=3 GROUP BY sex;
+--------+------------+
| sex    | count(sex) |
+--------+------------+
| 여자    |          5 |
| 남자    |          3 |
+--------+------------+
2 rows in set (0.00 sec)

이는 가능하지만

mysql> SELECT sex, count(sex) FROM people GROUP BY sex HAVING id>=3;
ERROR 1054 (42S22): Unknown column 'id' in 'having clause'

 

이는 불가능합니다. 왜냐하면 id가 그룹핑 한 데이터가 아닌 개별 데이터기 때문이죠.

남자/여자에 따라 나눠서 데이터를 묶어 그룹화 해놓은 상태인데, 이젠 묶은 상태를 하나의 데이터 기반으로 생각해야 하기 때문입니다.

반응형

'[SQL]' 카테고리의 다른 글

관계형 데이터베이스 실습  (0) 2020.09.06
관계형 데이터베이스의 정의  (0) 2020.09.05
SQL문 UPDATE, DELETE  (0) 2020.09.05
SQL문 INSERT, SELECT  (0) 2020.09.02
테이블 생성하기  (0) 2020.09.02