Что такое агрегирующие функции в SQL и как они работают с GROUP BY?

Ответ

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

Синтаксис с GROUP BY:

SELECT 
    department_id,
    COUNT(*) AS employee_count,
    AVG(salary) AS average_salary,
    MAX(salary) AS top_salary
FROM employees
GROUP BY department_id;

Этот запрос группирует сотрудников по отделам и для каждого отдела вычисляет количество сотрудников, среднюю и максимальную зарплату.

Важные правила:

  1. SELECT-список: Все столбцы в SELECT, не являющиеся аргументами агрегирующих функций, должны быть указаны в GROUP BY.
  2. Фильтрация групп: Для фильтрации по результату агрегации (например, average_salary > 50000) используется HAVING, а не WHERE.
  3. Игнорирование NULL: SUM(), AVG(), MAX(), MIN() игнорируют NULL. COUNT(column_name) также их игнорирует, в отличие от COUNT(*).

Почему это важно: Использование GROUP BY с агрегирующими функциями — основа для построения аналитических отчетов и сводных таблиц в реляционных базах данных.

Ответ 18+ 🔞

Слушай, а вот эти ваши агрегирующие функции в SQL — это ж, блядь, просто песня! Ну представь: у тебя куча строк в таблице, как муравьёв в муравейнике, а тебе надо одним махом получить какую-то общую цифру. Вот для этого они и нужны, эти SUM, AVG, COUNT и прочие красавцы.

Синтаксис с GROUP BY — это вообще магия, ёпта:

SELECT 
    department_id,
    COUNT(*) AS employee_count,
    AVG(salary) AS average_salary,
    MAX(salary) AS top_salary
FROM employees
GROUP BY department_id;

Перевожу на человеческий: «Собери мне всех работяг по отделам, посчитай, сколько их в каждом, выведи среднюю зарплату и покажи, кто там у них царь горы с самой большой».

А теперь, внимание, важные правила, без которых у тебя всё пиздец как накроется:

  1. SELECT-список — это не шутки. Все столбцы, которые ты пишешь в SELECT и которые НЕ обёрнуты в эти агрегатные функции, должны быть в GROUP BY. Иначе база посмотрит на тебя как на идиота и скажет «чё, блядь?». Ты либо группируй по ним, либо считай их.
  2. Фильтрация групп — отдельная история. WHERE — это для фильтрации строк ДО того, как их посчитали. А если ты хочешь отфильтровать уже готовые группы по результату (типа «покажи только отделы, где средняя зарплата больше 50к»), то тебе нужен HAVING. Перепутаешь — получишь в рот чих-пых.
  3. NULL — их не существует. Для SUM(), AVG(), MAX(), MIN() значения NULL — это как пустое место. Они их просто игнорируют, делают вид, что их нет. COUNT(column_name) тоже их игнорирует, в отличие от COUNT(*), который считает ВСЕ строки, даже пустые. Запомни эту разницу, а то охуеешь потом от результатов.

А почему это, сука, важно? Да потому что это фундамент, блядь! Вся аналитика, все эти отчёты для начальства, которые они потом разглядывают, — они строятся именно на этом: сгруппировал, посчитал, отсортировал. Без GROUP BY с агрегатами ты так и будешь вручную в экселе пальцы стирать.