Группируем данные
Представим, что есть такая таблица:
Так подсчитали количество книг, написанных Ремарком:
Скопировать код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;
Теперь мы знаем, сколько книг написал каждый из авторов таблицы.
Подсчитаем количество книг в разрезе авторов и рейтинга:
Скопировать кодSQL
SELECT
author,
rating,
COUNT(name) AS cnt
FROM
books
GROUP BY
author,
rating;
Эта конструкция вернула таблицу с количеством книг и их рейтингом определённого автора. Например, Эрих Мария Ремарк написал три книги с рейтингом 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;