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 |
+---------+----------+
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는 사용할 수 없습니다.