awilum.ru
Статьи Курсы Об авторе

Группировка

Курсы / SQL Базовый уровень / Основы

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

Псевдонимы Подзапросы
Записаться на курс