Ответ
Агрегирующие функции (или агрегатные) — это функции 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;
Этот запрос группирует сотрудников по отделам и для каждого отдела вычисляет количество сотрудников, среднюю и максимальную зарплату.
Важные правила:
- SELECT-список: Все столбцы в
SELECT, не являющиеся аргументами агрегирующих функций, должны быть указаны вGROUP BY. - Фильтрация групп: Для фильтрации по результату агрегации (например,
average_salary > 50000) используетсяHAVING, а неWHERE. - Игнорирование 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;
Перевожу на человеческий: «Собери мне всех работяг по отделам, посчитай, сколько их в каждом, выведи среднюю зарплату и покажи, кто там у них царь горы с самой большой».
А теперь, внимание, важные правила, без которых у тебя всё пиздец как накроется:
- SELECT-список — это не шутки. Все столбцы, которые ты пишешь в
SELECTи которые НЕ обёрнуты в эти агрегатные функции, должны быть вGROUP BY. Иначе база посмотрит на тебя как на идиота и скажет «чё, блядь?». Ты либо группируй по ним, либо считай их. - Фильтрация групп — отдельная история.
WHERE— это для фильтрации строк ДО того, как их посчитали. А если ты хочешь отфильтровать уже готовые группы по результату (типа «покажи только отделы, где средняя зарплата больше 50к»), то тебе нуженHAVING. Перепутаешь — получишь в рот чих-пых. - NULL — их не существует. Для
SUM(),AVG(),MAX(),MIN()значенияNULL— это как пустое место. Они их просто игнорируют, делают вид, что их нет.COUNT(column_name)тоже их игнорирует, в отличие отCOUNT(*), который считает ВСЕ строки, даже пустые. Запомни эту разницу, а то охуеешь потом от результатов.
А почему это, сука, важно? Да потому что это фундамент, блядь! Вся аналитика, все эти отчёты для начальства, которые они потом разглядывают, — они строятся именно на этом: сгруппировал, посчитал, отсортировал. Без GROUP BY с агрегатами ты так и будешь вручную в экселе пальцы стирать.