← Назад к вопросам

Что такое SQL GROUP BY?

1.6 Junior🔥 91 комментариев
#Работа с данными

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое SQL GROUP BY?

GROUP BY — это одна из наиболее важных и фундаментальных операций в языке SQL (Structured Query Language). Она относится к агрегирующим функциям и используется для группировки строк результата выборки по одному или нескольким столбцам, с целью выполнения вычислений (агрегаций) над каждой отдельной группой.

Основная цель и аналогия

Основная цель GROUP BY — превратить набор отдельных строк в сводные данные, где каждая группа представлена одной строкой в итоговом результате. Это похоже на создание отчетов или статистики. Например, если у вас есть таблица с продажами, содержащая записи о каждой транзакции, использование GROUP BY по столбцу product_id позволит вам увидеть общее количество продаж или суммарную выручку для каждого продукта, вместо тысяч отдельных записей.

Простая аналогия: представьте список студентов с их оценками по разным предметам. GROUP BY по предмету (subject) позволит вам подсчитать средний балл (AVG(grade)) для каждого предмета отдельно, выдав итоговую таблицу с одной строкой для математики, одной для физики и т.д.

Синтаксис и ключевые компоненты

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

SELECT column1, aggregate_function(column2)
FROM table_name
WHERE condition
GROUP BY column1
ORDER BY column1;

Ключевые компоненты:

  1. Столбцы для группировки (GROUP BY column1, column2, ...): Строки, имеющие одинаковые значения в этих столбцах, объединяются в одну группу.
  2. Агрегатные функции (aggregate_function): Функции, которые выполняют вычисление над набором значений в каждой группе и возвращают единственный результат. Без агрегатных функций или столбцов из GROUP BY в SELECT, запрос часто не имеет смысла или вызывает ошибку (зависит от SQL режима).
    -   **COUNT()** — подсчитывает количество строк в группе.
    -   **SUM()** — суммирует значения столбца в группе.
    -   **AVG()** — вычисляет среднее значение.
    -   **MAX()** / **MIN()** — находит максимальное или минимальное значение.
  1. Столбцы в SELECT: В списке SELECT могут быть только:
    -   Столбцы, указанные в `GROUP BY`.
    -   Выражения, основанные на этих столбцах.
    -   Результаты агрегатных функций.

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

Рассмотрим таблицу sales:

idproduct_namecategoryamountsale_date
1Smartphone XElectronics10002024-01-15
2Laptop YElectronics15002024-01-16
3T-shirtClothing502024-01-15
4Smartphone XElectronics10002024-01-17
5JeansClothing802024-01-16

Запрос 1: Подсчитать общую сумму продаж (SUM(amount)) для каждого продукта (product_name).

SELECT product_name, SUM(amount) as total_sales
FROM sales
GROUP BY product_name;

Результат:

product_nametotal_sales
Smartphone X2000
Laptop Y1500
T-shirt50
Jeans80

Запрос 2: Подсчитать количество транзакций (COUNT(*)) и среднюю сумму продажи (AVG(amount)) в каждой категории (category).

SELECT category, COUNT(*) as transactions_count, AVG(amount) as average_sale
FROM sales
GROUP BY category;

Результат:

categorytransactions_countaverage_sale
Electronics31166.67
Clothing265

Взаимодействие с WHERE и HAVING

  • WHERE: Фильтрует индивидуальные строки перед их группировкой. Например, WHERE sale_date > '2024-01-15' исключит некоторые записи из исходного набора данных, и группировка будет выполнена только над оставшимися.
  • HAVING: Фильтрует целые группы после выполнения группировки и агрегации. HAVING применяется к результатам агрегатных функций. Например, HAVING total_sales > 1000 отфильтрует группы, где суммарные продажи меньше 1000.
SELECT category, SUM(amount) as total_sales
FROM sales
WHERE sale_date = '2024-01-16' -- фильтр строк до группировки
GROUP BY category
HAVING total_sales > 100;      -- фильтр групп после группировки

Важные замечания и особенности

  • Порядок выполнения: Группировка (GROUP BY) логически выполняется после фильтрации WHERE (если она есть), но перед фильтрацией HAVING и сортировкой ORDER BY.
  • Группировка по нескольким столбцам: Можно группировать по комбинации столбцов. Группа образуется только при совпадении значений во всех указанных столбцах. GROUP BY category, product_name создаст отдельные группы для каждого уникального сочетания категории и продукта.
  • NULL значения: NULL считается отдельным, одинаковым значением для всех NULL. Все строки, где столбец группировки равен NULL, будут объединены в одну группу.

В разработке для Android прямое использование GROUP BY встречается при работе с локальными базами данных SQLite (например, через Room Persistence Library) для формирования сложных отчетов или статистики внутри приложения. Понимание этой операции критически важно для эффективного взаимодействия с любыми реляционными базами данных.