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

GROUP BY оператор MySQL

Запрос GROUP BY группирует результат по одному или нескольким столбцам.

На столбцах, по которым производится分组, мы можем использовать функции COUNT, SUM, AVG и т.д.

Грамматика GROUP BY

SELECT column_name, function(column_name)
FROM table_name
WHERE column_name оператор значение
GROUP BY column_name;

Пример демонстрации

Этот раздел примера использует следующие структуры таблиц и данные, перед использованием мы можем сначала импортировать данные в базу данных.

SET NAMES utf8;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
--  Структура таблицы `employee_tbl`
-- ----------------------------
DROP TABLE IF EXISTS `employee_tbl`;
CREATE TABLE `employee_tbl` (
  `id` int(11) NOT NULL,
  `имя` char(10) NOT NULL DEFAULT '',
  `дата` datetime NOT NULL,
  `вход` 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 | имя | дата |                  | вход |
+----+--------+---------------------+--------+
| 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 rows in set (0.00 sec)

Далее мы используем предложение GROUP BY для группировки данных таблицы по имени и подсчета количества записей каждого человека:

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 rows in set (0.00 sec)

запись 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 |
+--------------------------------------+--------------+
| Ван Li                              |              | 2  |
| Ван Мiao                             |              | 7  |
| Ван Чжун                             |              | 7  |
| Общее количество                     |              | 16 |
+--------------------------------------+--------------+
4 строк в наборе (0.01 сек)