Группировка в 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 отбирает строки групп после группировки и вычисления агрегатных функций.