English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
GROUP BY statement groups the result set based on one or more columns.
在分组的列上我们可以使用 COUNT, SUM, AVG, 等函数。
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은 그룹화된 데이터에 대한 동일한 통계(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)