Учебники

13) GROUP BY

Что такое группировка по пунктам?

Предложение GROUP BY — это команда SQL, которая используется для группировки строк с одинаковыми значениями .

 Предложение GROUP BY используется в операторе SELECT. Опционально оно используется в сочетании с агрегатными функциями для создания сводных отчетов из базы данных.

Вот что он делает, суммируя данные из базы данных.

Запросы, содержащие предложение GROUP BY, называются сгруппированными запросами и возвращают только одну строку для каждого сгруппированного элемента.

 

Синтаксис GROUP BY

Теперь, когда мы знаем, что такое предложение GROUP By, давайте посмотрим на синтаксис для базовой группы по запросу.

SELECT statements... GROUP BY column_name1[,column_name2,...] [HAVING condition];

ВОТ

  • «Операторы SELECT …» — это стандартный запрос команды SQL SELECT.
  • « GROUP BY column_name1 » — это предложение, которое выполняет группировку на основе column_name1.
  • «[, column_name2, …]» необязательно; представляет другие имена столбцов, когда группировка выполняется по нескольким столбцам.
  •  «[HAVING условие]» необязательно; он используется для ограничения строк, затронутых предложением GROUP BY. Это похоже на предложение WHERE.

Группировка с использованием одного столбца

Чтобы понять влияние предложения Group By, выполним простой запрос, который возвращает все записи пола из таблицы members.

SELECT `gender` FROM `members` ;
gender
Female
Female
Male
Female
Male
Male
Male
Male
Male

Предположим, мы хотим получить уникальные значения для полов. Мы можем использовать следующий запрос —

SELECT `gender` FROM `members` GROUP BY `gender`;

Выполнение вышеупомянутого сценария в MySQL Workbench против Myflixdb дает нам следующие результаты.

gender
Female
Male

Обратите внимание, только два результата были возвращены. Это потому, что у нас есть только два типа пола: мужской и женский. Предложение GROUP BY сгруппировало всех «мужских» членов вместе и вернуло только одну строку для него. То же самое было и с «женщинами».

Группировка с использованием нескольких столбцов

Предположим, что мы хотим получить список фильмов category_id и соответствующих лет, в которые они были выпущены.

Давайте посмотрим на вывод этого простого запроса

SELECT `category_id`,`year_released` FROM `movies` ;
category_idyear_released
12011
22008
NULL2008
NULL2010
82007
62007
62007
82005
NULL2012
71920
8NULL
81920

Приведенный выше результат имеет много дубликатов.

Давайте выполним тот же запрос, используя group by —

SELECT `category_id`,`year_released` FROM `movies` GROUP BY `category_id`,`year_released`;

Выполнение вышеупомянутого сценария в MySQL Workbench против myflixdb дает нам следующие результаты, показанные ниже.

category_idyear_released
NULL2008
NULL2010
NULL2012
12011
22008
62007
71920
81920
82005
82007

Предложение GROUP BY действует как для идентификатора категории, так и для года выпуска, чтобы идентифицировать уникальные строки в нашем примере выше.

Если идентификатор категории совпадает, но выпущенный год отличается, то строка считается уникальной. Если идентификатор категории и выпущенный год совпадают для более чем одной строки, то это считается дубликатом и только одной строкой. Показано.

Группировка и агрегирование функций

Предположим, мы хотим, чтобы общее количество мужчин и женщин в нашей базе данных. Мы можем использовать следующий скрипт, показанный ниже, чтобы сделать это.

SELECT `gender`,COUNT(`membership_number`)  FROM `members` GROUP BY `gender`;
 

Выполнение вышеуказанного скрипта в MySQL Workbench против myflixdb дает нам следующие результаты.

genderCOUNT('membership_number')
Female3
Male5

Результаты, показанные ниже, сгруппированы по каждому опубликованному уникальному гендерному значению, а количество сгруппированных строк подсчитывается с помощью агрегатной функции COUNT.

Ограничение результатов запроса с помощью предложения HAVING

Не всегда мы хотим выполнить группировку для всех данных в данной таблице. Будут времена, когда мы захотим ограничить наши результаты определенным заданным критерием. В таких случаях мы можем использовать предложение HAVING

Предположим, мы хотим знать все годы выпуска для идентификатора категории фильма 8. Мы будем использовать следующий скрипт для достижения наших результатов.

SELECT * FROM `movies` GROUP BY `category_id`,`year_released` HAVING `category_id` = 8;

Выполнение вышеупомянутого сценария в MySQL Workbench против Myflixdb дает нам следующие результаты, показанные ниже.

movie_idtitledirectoryear_releasedcategory_id
9Honey moonersJohn Schultz20058
5Daddy's Little GirlsNULL20078

Обратите внимание, что наше предложение GROUP BY затронуло только фильмы с идентификатором категории 8.

 

Резюме

  • Предложение GROUP BY используется для группировки строк с одинаковыми значениями.
  • Предложение GROUP BY используется вместе с оператором SQL SELECT.
  • Оператор SELECT, используемый в предложении GROUP BY, может использоваться только с именами столбцов, агрегатными функциями, константами и выражениями.
  • Предложение HAVING используется для ограничения результатов, возвращаемых предложением GROUP BY.