Ответ
Да, агрегатные функции — это стандартный инструмент SQL для выполнения вычислений над набором строк и возврата единственного значения. Основные функции и их назначение:
COUNT()— подсчитывает количество строк (частоCOUNT(*)) или не-NULL значений в столбце.SUM()— вычисляет сумму значений в числовом столбце.AVG()— вычисляет среднее арифметическое значений в числовом столбце.MAX()/MIN()— находят максимальное или минимальное значение в столбце.
Эти функции часто используются с предложениями GROUP BY (для группировки результатов) и HAVING (для фильтрации групп).
Пример запроса с группировкой и фильтрацией:
-- Найти среднюю зарплату по отделам, где она превышает 50000
SELECT
department_id,
department_name,
AVG(salary) AS average_salary,
COUNT(*) AS employee_count
FROM employees
WHERE active = TRUE -- Предварительная фильтрация строк
GROUP BY department_id, department_name
HAVING AVG(salary) > 50000 -- Фильтрация после агрегации
ORDER BY average_salary DESC;
На что обращать внимание при тестировании:
- Корректность обработки
NULL-значений (например,AVG()игнорирует NULL). - Правильность группировки по нескольким полям.
- Производительность агрегаций на больших объемах данных.
- Особенности реализации функций в разных СУБД (MySQL, PostgreSQL, SQLite).
Ответ 18+ 🔞
А, ну это ж классика, про которую все вроде знают, а потом на ровном месте обосрамс получают! Агрегатные функции в SQL — это как тот самый Герасим из «Муму»: сила есть, ума не надо, но если не понять, как он немой-то, блядь, работает, можно в пизду всё утопить.
Вот смотри, основные пацаны на районе:
COUNT()— этот чувак просто считает. Либо всех подряд (COUNT(*)), либо только тех, у кого в кармане не пусто (COUNT(column)). NULL для него — как призрак, его в расчёт не берёт, ёпта.SUM()— а этот уже бабки складывает. Только числовые, блядь, столбцы, а то опять ошибка полезет.AVG()— середнячок вычисляет. И тоже хитер: NULL-значения игнорирует, будто их и не было. Не среднюю арифметическую от всех строк, а только от тех, где цифра есть.MAX()/MIN()— два брата-акробата. Один ищет самого высокого, другой — самого низкого. С числами, датами, даже строками работают.
Всё это великолепие обычно идёт в одной упряжке с GROUP BY — это когда ты всех по отделам, по городам, по любым признакам раскидываешь. А HAVING — это уже фильтр, но не для отдельных строк (это WHERE), а для целых получившихся кучек, после того как агрегаты посчитались.
Вот тебе живой пример, чтоб не быть распиздяем:
-- Найти отделы, где средняя зарплата за 50к, а то все охуели уже
SELECT
department_id,
department_name,
AVG(salary) AS average_salary, -- средняя зп по отделу
COUNT(*) AS employee_count -- сколько лбов в отделе
FROM employees
WHERE active = TRUE -- сначала отфильтруем уволенных, они нам нахуй не сдались
GROUP BY department_id, department_name -- группируем по отделам, блядь
HAVING AVG(salary) > 50000 -- а теперь фильтруем ТОЛЬКО те группы, где средняя зп выше порога
ORDER BY average_salary DESC; -- и выведем от жирных к тощим
На что орать при проверке, чтобы не выглядеть мудаком:
- NULL — его величество. Помни, что
COUNT(column)проигнорирует NULL, аCOUNT(*)— нет.AVG()тоже их не видит. Это частая причина, почему цифры ебут мозг. - Группировка по нескольким полям. Если в
SELECTу тебя поле, которого нет в агрегатной функции (SUM,AVGи т.д.), оно ДОЛЖНО быть вGROUP BY. Иначе СУБД тебе справедливо скажет «иди нахуй, я не понимаю, из какой строки тебе это брать». WHEREvsHAVING. Запомни раз и навсегда:WHEREфильтрует строки ДО того, как их сгруппировали и посчитали.HAVINGфильтрует группы ПОСЛЕ агрегации. Перепутаешь — получишь пиздюлину от логики запроса.- Производительность на больших данных. Агрегация по всей таблице без индексов — это пиздец, медленный и печальный. Особенно с
GROUP BY. - Нюансы СУБД. В одной базе что-то работает так, в другой — эдак. Всегда смотри, не используешь ли какую-то поеботу, которая только в твоей версии MySQL 5.7 существует.
Короче, инструмент мощный, но, блядь, требующий уважения. Не тупи, проверяй крайние случаи, особенно с NULL и пустыми группами, и всё будет пучком.