Группировка в SQL позволяет объединять данные по определенному полю или списку полей, чтобы вычислить агрегированные значения, такие как сумма, среднее, максимум и минимум.

Чтобы группировать данные по определенному полю, вам нужно использовать ключевое слово GROUP BY в запросе, и указать поле или набор полей, по которым вы хотите группировать данные.
GROUP BY часто используется в сочетании с агрегатными функциями, такими как MIN, MAX, SUM, AVG и COUNT, для выполнения вычислений над сгруппированными данными.
Таблица movies
| id | title | release_year | genre | rating |
|---|---|---|---|---|
| 1 | The Shawshank Redemption | 1994 | Drama | 9 |
| 2 | The Godfather | 1972 | Crime | 9 |
| 3 | The Godfather: Part II | 1974 | Crime | 9 |
| 4 | The Dark Knight | 2008 | Action | 9 |
| 5 | 12 Angry Men | 1957 | Drama | 8 |
| 6 | Schindlers List | 1993 | Biography | 8 |
| 7 | Pulp Fiction | 1994 | Crime | 8 |
| 8 | The Lord of the Rings: The Return of the King | 2003 | Adventure | 8 |
| 9 | Fight Club | 1999 | Drama | 8 |
| 10 | The Good, the Bad and the Ugly | 1966 | Western | 8 |
Чтобы сгруппировать фильмы по жанрам genre и рассчитать средний рейтинг rating для каждого жанра, вы можете использовать следующий SQL запрос:
SELECT genre,
AVG(rating) AS avg_rating
FROM movies
GROUP BY genre;
Результат
| genre | avg_rating |
|---|---|
| Action | 9.0 |
| Adventure | 8.0 |
| Biography | 8.0 |
| Crime | 8.66666666666667 |
| Drama | 8.33333333333333 |
| Western | 8.0 |
Чтобы округлить результаты агрегатной функции, такой как AVG, вы можете использовать функцию ROUND.
Функция ROUND принимает два аргумента: значение, которое нужно округлить, и количество десятичных разрядов, до которого нужно округлить.
Например, чтобы округлить средний рейтинг до одного десятичного знака, можно использовать следующий запрос:
SELECT genre,
ROUND(AVG(rating), 1) AS avg_rating
FROM movies
GROUP BY genre;
Результат
| genre | avg_rating |
|---|---|
| Action | 9.0 |
| Adventure | 8.0 |
| Biography | 8.0 |
| Crime | 8.7 |
| Drama | 8.3 |
| Western | 8.0 |
Для того чтобы показать сколько фильмов в каждом жанре, вы можете использовать следующий SQL запрос:
SELECT genre,
COUNT(id) AS count
FROM movies
GROUP BY genre;
Результат
| genre | count |
|---|---|
| Action | 1 |
| Adventure | 1 |
| Biography | 1 |
| Crime | 3 |
| Drama | 3 |
| Western | 1 |
Вы также можете использовать HAVING для фильтрации групп на основе условия.
Например для того чтобы показать сколько фильмов в каждом жанре, при условии что фильмов в жанре больше чем 1, вы можете использовать следующий SQL запрос:
SELECT genre,
COUNT(id) AS count
FROM movies
GROUP BY genre
HAVING COUNT(id) > 1;
Результат
| genre | count |
|---|---|
| Crime | 3 |
| Drama | 3 |
Также вы можете отсортировать сгруппированный и отфильтрованный результат, например по полю genre:
SELECT genre,
COUNT(id) AS count
FROM movies
GROUP BY genre
HAVING COUNT(id) > 1
ORDER BY genre DESC;
Результат
| genre | count |
|---|---|
| Drama | 3 |
| Crime | 3 |
Для того чтобы показать максимальный рейтинг фильмов в каждом жанре, вы можете использовать следующий SQL запрос:
SELECT genre,
MAX(rating) AS max_rating
FROM movies
GROUP BY genre;
Результат
| genre | max_rating |
|---|---|
| Action | 9 |
| Adventure | 8 |
| Biography | 8 |
| Crime | 9 |
| Drama | 9 |
| Western | 8 |
Для того чтобы показать минимальный рейтинг фильмов в каждом жанре, вы можете использовать следующий SQL запрос:
SELECT genre,
MIN(rating) AS min_rating
FROM movies
GROUP BY genre;
Результат
| genre | min_rating |
|---|---|
| Action | 9 |
| Adventure | 8 |
| Biography | 8 |
| Crime | 8 |
| Drama | 8 |
| Western | 8 |
Вы можете группировать по нескольким полям.
Например, следующий запрос будет группировать все строки из таблицы movies по полям release_year и genre и возвращать количество фильмов для каждой комбинации года выпуска и жанра:
SELECT release_year,
genre,
COUNT(id) AS count
FROM movies
GROUP BY release_year,
genre;
Результат
| release_year | genre | count |
|---|---|---|
| 1957 | Drama | 1 |
| 1966 | Western | 1 |
| 1972 | Crime | 1 |
| 1974 | Crime | 1 |
| 1993 | Biography | 1 |
| 1994 | Crime | 1 |
| 1994 | Drama | 2 |
| 1999 | Drama | 1 |
| 2003 | Adventure | 1 |
| 2008 | Action | 1 |
where и havingОсновное отличие WHERE от HAVING заключается в том, что WHERE сначала выбирает строки, а затем группирует их и вычисляет агрегатные функции (таким образом, она отбирает строки для вычисления агрегатов (агрегатными функциями)), тогда как HAVING отбирает строки групп после группировки и вычисления агрегатных функций.