SQL GROUP BY - группировка данных

Введение

В языке SQL, GROUP BY является мощным инструментом для агрегации данных. Он позволяет группировать строки с одинаковыми значениями в указанных столбцах в одну сводную строку. Чаще всего GROUP BY используется в сочетании с агрегатными функциями, такими как COUNT(), MAX(), MIN(), SUM() и AVG(), для выполнения вычислений по каждой группе данных. Это позволяет получать осмысленную и обобщенную информацию из больших наборов данных, например, “найти количество клиентов в каждой стране” или “вычислить среднюю зарплату по каждому отделу”.

Основные концепции

Оператор GROUP BY работает в три этапа:

  1. Разделение (Split): Набор данных разделяется на группы строк на основе значений в столбце (или столбцах), указанном в GROUP BY.
  2. Применение (Apply): К каждой группе применяется агрегатная функция (например, COUNT(), SUM(), AVG()), которая вычисляет одно значение для этой группы.
  3. Объединение (Combine): Результаты вычислений для каждой группы объединяются в одну итоговую таблицу.

Синтаксис

Базовый синтаксис GROUP BY выглядит следующим образом:

SELECT column_name(s)
FROM table_name
WHERE condition
GROUP BY column_name(s)
ORDER BY column_name(s);
  • SELECT column_name(s): Столбцы, которые вы хотите отобразить в результате.
  • FROM table_name: Таблица, из которой извлекаются данные.
  • WHERE condition: Необязательное условие для фильтрации строк перед группировкой.
  • GROUP BY column_name(s): Столбец или столбцы, по которым происходит группировка.
  • ORDER BY column_name(s): Необязательное условие для сортировки результирующего набора.

Практические примеры

Рассмотрим несколько примеров использования GROUP BY на практике.

Пример 1: Подсчет количества клиентов по странам

Предположим, у нас есть таблица Customers со следующими данными:

CustomerIDCustomerNameContactNameAddressCityPostalCodeCountry
1Alfreds FutterkisteMaria AndersObere Str. 57Berlin12209Germany
2Ana Trujillo Emparedados y heladosAna TrujilloAvda. de la Constitución 2222México D.F.05021Mexico
3Antonio Moreno TaqueríaAntonio MorenoMataderos 2312México D.F.05023Mexico
4Around the HornThomas Hardy120 Hanover Sq.LondonWA1 1DPUK
5Berglunds snabbköpChristina BerglundBerguvsvägen 8LuleåS-958 22Sweden

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

SELECT COUNT(CustomerID), Country
FROM Customers
GROUP BY Country;

Результат будет выглядеть так:

COUNT(CustomerID)Country
1Germany
2Mexico
1UK
1Sweden

Пример 2: Группировка по нескольким столбцам

GROUP BY можно использовать для группировки по нескольким столбцам. В этом случае строки, у которых совпадают значения во всех указанных столбцах, объединяются в одну группу. Например, если у нас есть таблица Student:

NAMESUBJECTYEAR
AlexEnglish1
AmyEnglish2
AlexMathematics1
AmyMathematics2
AlexScience1
AmyScience2

И мы хотим посчитать количество студентов для каждого предмета в каждом году, мы можем использовать следующий запрос:

SELECT SUBJECT, YEAR, COUNT(*)
FROM Student
GROUP BY SUBJECT, YEAR;

Результат будет следующим:

SUBJECTYEARCOUNT(*)
English11
English21
Mathematics11
Mathematics21
Science11
Science21

Пример 3: Использование с JOIN

GROUP BY также можно использовать в сочетании с JOIN для агрегации данных из нескольких таблиц. Например, если у нас есть таблицы Orders и Shippers, и мы хотим посчитать, сколько заказов отправил каждый отправитель:

SELECT Shippers.ShipperName, COUNT(Orders.OrderID) AS NumberOfOrders
FROM Orders
LEFT JOIN Shippers ON Orders.ShipperID = Shippers.ShipperID
GROUP BY ShipperName;

Этот запрос вернет имя отправителя и количество отправленных им заказов.

Типичные ошибки и как их избежать

  1. Использование агрегатных функций в WHERE: WHERE фильтрует строки до группировки, поэтому в нем нельзя использовать агрегатные функции. Для фильтрации групп после группировки следует использовать HAVING.

    Неправильно:

    SELECT Country, COUNT(CustomerID)
    FROM Customers
    GROUP BY Country
    WHERE COUNT(CustomerID) > 5;

    Правильно:

    SELECT Country, COUNT(CustomerID)
    FROM Customers
    GROUP BY Country
    HAVING COUNT(CustomerID) > 5;
  2. Выбор столбцов, не участвующих в группировке: В SELECT можно указывать только столбцы, перечисленные в GROUP BY, или агрегатные функции. Попытка выбрать столбец, который не является ни частью группировки, ни агрегатной функцией, приведет к ошибке.

Связь с другими темами

  • HAVING: Как уже упоминалось, HAVING используется для фильтрации групп после их создания с помощью GROUP BY. WHERE фильтрует строки до группировки, а HAVING — группы после.
  • Агрегатные функции: GROUP BY почти всегда используется с агрегатными функциями, такими как COUNT(), SUM(), AVG(), MAX() и MIN(), для вычисления сводных данных по группам.
  • ORDER BY: ORDER BY используется для сортировки результирующего набора данных. Его можно применять к столбцам, по которым производилась группировка, или к результатам агрегатных функций.

Заключение

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