English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

MySQL GROUP BY 문

GROUP BY statement groups the result set based on one or more columns.

在分组的列上我们可以使用 COUNT, SUM, AVG, 等函数。

GROUP BY 语法

SELECT column_name, function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name;

示例演示

本章节示例使用到了以下表结构及数据,使用前我们可以先将以下数据导入数据库中。

SET NAMES utf8;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
--  Table structure for `employee_tbl`
-- ----------------------------
DROP TABLE IF EXISTS `employee_tbl`;
CREATE TABLE `employee_tbl` (
  `id` int(11) NOT NULL,
  `name` char(10) NOT NULL DEFAULT '',
  `date` datetime NOT NULL,
  `singin` tinyint(4) NOT NULL DEFAULT '0' COMMENT '로그인 횟수',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
--  `employee_tbl`의 기록
-- ----------------------------
BEGIN;
INSERT INTO `employee_tbl` VALUES ('1', '소명', ''2016-04-22 15:25:33', ''1), ('2', '소왕', ''2016-04-20 15:25:47', ''3), ('3', '소리', ''2016-04-19 15:26:02', ''2), ('4', '소왕', ''2016-04-07 15:26:14', ''4), ('5', '소명', ''2016-04-11 15:26:40', ''4), ('6', '소명', ''2016-04-04 15:26:54', ''2);
COMMIT;
SET FOREIGN_KEY_CHECKS = 1;

데이터가 성공적으로 입력되면 다음 SQL 문을 실행합니다:

mysql> set names utf8;
mysql> SELECT * FROM employee_tbl;
+----+--------+---------------------+--------+
| id | name | date | date | date | singin |
+----+--------+---------------------+--------+
|  1 | 소명 | 2016-04-22 15:25:33 |      1 |
|  2 | 소왕 | 2016-04-20 15:25:47 |      3 |
|  3 | 소리 | 2016-04-19 15:26:02 |      2 |
|  4 | 소왕 | 2016-04-07 15:26:14 |      4 |
|  5 | 소명 | 2016-04-11 15:26:40 |      4 |
|  6 | 소명 | 2016-04-04 15:26:54 |      2 |
+----+--------+---------------------+--------+
6 셋(0.00 초)에 rows

다음으로, 데이터 테이블을 이름에 따라 그룹화하여 각 사람이 몇 개의 레코드를 가지고 있는지 계산할 것입니다:

mysql> SELECT name, COUNT(*) FROM employee_tbl GROUP BY name;
+--------+----------+
| name | COUNT(*) |
+--------+----------+
| 소리 |        1 |
| 소명 |        3 |
| 소왕 |        2 |
+--------+----------+
3 rows in set (0.01 sec)

WITH ROLLUP 사용

WITH ROLLUP은 그룹화된 데이터에 대한 동일한 통계(SUM, AVG, COUNT 등)를 추가로 수행할 수 있습니다.

예를 들어, 위의 데이터 테이블을 이름에 따라 그룹화하여 각 사람이 로그인한 횟수를 계산하겠습니다:

mysql> SELECT name, SUM(singin) as singin_count FROM employee_tbl GROUP BY name WITH ROLLUP;
+--------+--------------+
| name | singin_count |
+--------+--------------+
| 소리 |            2 |
| 소명 |            7 |
| 소왕 |            7 |
| NULL |           16 |
+--------+--------------+
4 셋(0.00 초)에 rows

NULL을 기록하면 모든 사람의 로그인 횟수를 나타냅니다.

coalesce를 사용하여 NULL을 대체할 수 있는 이름을 설정할 수 있습니다, coalesce 문법:

select coalesce(a,b,c);

매개변수 설명: a==null이면 b를 선택합니다; b==null이면 c를 선택합니다; a!=null이면 a를 선택합니다; a, b, c 모두 null이면 null을 반환합니다(의미가 없습니다).

이 예제에서 이름이 비어 있으면 총 합계로 대체됩니다:

mysql> SELECT coalesce(name, '총 합계'), SUM(singin) as singin_count FROM employee_tbl GROUP BY name WITH ROLLUP;
+--------------------------+--------------+
| coalesce(name, '총 합계') | singin_count |
+--------------------------+--------------+
| 총합계  |            2 |
| 총합계  |            7 |
| 총합계  |            7 |
| 총 합계  |           16 |
+--------------------------+--------------+
4 rows in set (0.01 sec)