본문 바로가기

SQL/MYSQL

MYSQL GROUP BY , HAVING 그룹화 함수




1. 그룹화


GROUP BY 열1, 열2, ...


그룹화를 하는 이유는 집계함수를 수행하기 위해서입니다.




ex) SELECT name, COUNT(name), SUM(quantity) FROM products GROUP BY name;


name을 기준으로 그룹화 하여 COUNT(name), SUM(quantity) 함수를 명령합니다.


그 결과 COUNT의 값은 Item1 = 2 , Item2 = 1 , Item3 = 1 이 조회되고,


SUM의 값은 Item1 = 7 , Item2 = 3 , Item3 = 8 이 조회됩니다.






ex) SELECT MIN(no), name, SUM(quantity) FROM products GROUP BY name;


GROUP BY로 그룹화 하지 않은 필드는 SELECT 할 수 없으며, 집계함수로 표현해야만 가능합니다.


즉, 여기서는 name을 기준으로 그룹화를 했으므로 name 이외의 필드를 SELECT 할 수 없습니다.


따라서 아래와 같이 name 외의 모든 열들을 조회하는 쿼리는 에러를 발생시킵니다.


ex) SELECT * FROM products GROUP BY name;   => 에러






ex) SELECT name, COUNT(name), SUM(quantity) FROM products GROUP BY name ORDER BY SUM(quantity) DESC;


ORDER BY는 정상적으로 수행됩니다.


ORDER BY는 GROUP BY보다 나중에 실행됩니다.



MySQL datetime 월별 GROUP BY

mysql> SELECT COUNT(*) FROM wp_posts;
+----------+
| COUNT(*) |
+----------+
|     4036 |
+----------+
mysql> SELECT ID, post_date FROM wp_posts ORDER BY post_date LIMIT 2;
+----+---------------------+
| ID | post_date           |
+----+---------------------+
|  1 | 2012-01-01 12:30:58 |
|  2 | 2012-01-01 14:05:09 |
+----+---------------------+
mysql> SELECT ID, post_date FROM wp_posts ORDER BY post_date DESC LIMIT 2;
+------+---------------------+
| ID   | post_date           |
+------+---------------------+
| 7313 | 2013-08-03 19:47:04 |
| 5354 | 2013-08-03 19:35:15 |
+------+---------------------+





DATE_FORMAT() 함수

mysql> SELECT DATE_FORMAT(post_date,'%Y-%m') m, COUNT(*) FROM wp_posts GROUP BY m; +---------+----------+ | m | COUNT(*) | +---------+----------+ | 2012-01 | 128 | | 2012-02 | 115 | | 2012-03 | 121 | | 2013-07 | 322 | | 2013-08 | 32 | +---------+----------+


MONTH() 함수

mysql> SELECT CONCAT(YEAR(post_date), '-', MONTH(post_date)) ym, COUNT(*) FROM wp_posts GROUP BY ym; +---------+----------+ | ym | COUNT(*) | +---------+----------+ | 2012-1 | 128 | | 2012-10 | 161 | | 2012-11 | 159 | | 2012-12 | 205 | | 2012-2 | 115 | | 2012-3 | 121 | | 2013-7 | 322 | | 2013-8 | 32 | +---------+----------+



2. HAVING


GROUP BY에서 조건을 주고 싶을 경우 WHERE를 사용할 수 없습니다.


대신 GROUP BY에 대응되는 조건이라는 개념으로 HAVING 명령어를 사용해야 합니다.


WHERE 절이 GROUP BY 보다 먼저 실행되기 때문입니다.




HAVING 은 GROUP BY 뒤에 작성하며, WHERE와 동일한 형식으로 조건식을 작성할 수 있습니다.




ex) SELECT name, COUNT(name) FROM products GROUP BY name HAVING COUNT(name) = 1;


name을 기준으로 그룹화를 하는데, 그룹화한 항목의 개수가 1인 데이터들만 조회를 합니다.




ex ) SELECT name, COUNT(name) FROM products WHERE COUNT(name) = 1 GROUP BY name; 


=> 에러


GROUP BY에서 WHERE는 사용할 수 없습니다.