Группируем данные

Представим, что есть такая таблица:
idNamegenreauthordate_pubpagespricerating
1Капитанская дочка5Александр Пушкин1836-01-011301504.7
2Отцы и дети1Иван Тургенев1861-01-012402074.7
3Вишнёвый сад7Антон Чехов1903-01-01601384.4
4Война и мир1Лев Толстой1869-01-011274
5Анна Каренина1Лев Толстой1878-01-0110001264.6
6Цветы для Элджернона4Дэниел Киз1959-01-012502804.7
7Похороните меня за плинтусом...5Павел Санаев1994-01-011841984.1
8Зелёная миля9Стивен Кинг1996-01-014201904.8
9Унесённые ветром1Маргарет Митчелл1936-01-01624358
10Три товарища1Эрих Мария Ремарк1929-01-014701964.7
11На Западном фронте без перемен4Эрих Мария Ремарк1945-01-012002734.6
12Триумфальная арка1Эрих Мария Ремарк1956-01-015202204.7
13Чёрный обелиск1Эрих Мария Ремарк1961-01-014804204.6
14Ночь в Лиссабоне1Эрих Мария Ремарк1959-01-012501874.7
15Жизнь взаймы1Эрих Мария Ремарк1927-01-012402404.6
16Станция на горизонте1Эрих Мария Ремарк1830-01-012104.1
17Евгений Онегин1Александр Пушкин1820-01-017363304.7
Так подсчитали количество книг, написанных Ремарком:
Скопировать кодSQL
SELECT COUNT(name) AS cnt FROM books WHERE author = 'Эрих Мария Ремарк';
Скопировать кодSQL
7
Как найти число книг каждого автора? Не писать же несколько запросов! Хорошо бы автоматически перебирать авторов, и сразу же считать количество их произведений. Для этого есть группировка.
Команду GROUP BY (англ. «группировать по») применяют, когда данные нужно разделить на группы по значениям полей.
Пример формата запроса с агрегирующей функцией и группировкой:
Скопировать кодSQL
SELECT поле_1, поле_2, ..., поле_n, АГРЕГИРУЮЩАЯ_ФУНКЦИЯ(поле) AS here_you_are FROM таблица WHERE -- если необходимо условие GROUP BY поле_1, поле_2, ..., поле_n;
После команды GROUP BY перечисляют все поля из блока SELECT. Саму агрегирующую функцию включать в блок GROUP BY не нужно — с ней запрос не выполнится.
Вернёмся к примеру. В нашем случае агрегирующая функция — COUNT(). Команда GROUP BY поможет найти количество строк в разрезе авторов:
Скопировать кодSQL
SELECT author, COUNT(name) AS cnt FROM books GROUP BY author;
authorcnt
Александр Пушкин2
Антон Чехов1
Дэниел Киз1
Иван Тургенев1
Лев Толстой2
Маргарет Митчелл1
Павел Санаев1
Стивен Кинг1
Эрих Мария Ремарк7
Теперь мы знаем, сколько книг написал каждый из авторов таблицы.
Подсчитаем количество книг в разрезе авторов и рейтинга:
Скопировать кодSQL
SELECT author, rating, COUNT(name) AS cnt FROM books GROUP BY author, rating;
authorratingcnt
Лев Толстой1
Маргарет Митчелл1
Павел Санаев4.11
Эрих Мария Ремарк4.11
Антон Чехов4.41
Лев Толстой4.61
Эрих Мария Ремарк4.63
Александр Пушкин4.72
Дэниел Киз4.72
Иван Тургенев4.71
Эрих Мария Ремарк4.73
Стивен Кинг4.81
Эта конструкция вернула таблицу с количеством книг и их рейтингом определённого автора. Например, Эрих Мария Ремарк написал три книги с рейтингом 4.6, одну — с оценкой 4.1 и три с 4.7. А у Льва Толстого одно произведение с 4.6 баллами рейтинга и одно — вовсе без оценки.
Конструкция GROUP BY работает для всех агрегирующих функций: COUNT(), AVG(), SUM(), MAX(), MIN(). Можно вызывать несколько функций сразу. Например, для каждого автора найдём среднее количество страниц в его произведениях и максимальное количество страниц:
Скопировать кодSQL
SELECT author, AVG(pages) AS avg_pages, MAX(pages) AS max_pages FROM books GROUP BY author;
authoravg_pagesmax_pages
Александр Пушкин433736
Антон Чехов6060
Дэниел Киз250250
Иван Тургенев240240
Лев Толстой11371274
Маргарет Митчелл624624
Павел Санаев184184
Стивен Кинг420420
Эрих Мария Ремарк338,571428571429520