Какие агрегатные функции SQL вы использовали и для чего?

Ответ

Да, агрегатные функции — это стандартный инструмент 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. Иначе СУБД тебе справедливо скажет «иди нахуй, я не понимаю, из какой строки тебе это брать».
  • WHERE vs HAVING. Запомни раз и навсегда: WHERE фильтрует строки ДО того, как их сгруппировали и посчитали. HAVING фильтрует группы ПОСЛЕ агрегации. Перепутаешь — получишь пиздюлину от логики запроса.
  • Производительность на больших данных. Агрегация по всей таблице без индексов — это пиздец, медленный и печальный. Особенно с GROUP BY.
  • Нюансы СУБД. В одной базе что-то работает так, в другой — эдак. Всегда смотри, не используешь ли какую-то поеботу, которая только в твоей версии MySQL 5.7 существует.

Короче, инструмент мощный, но, блядь, требующий уважения. Не тупи, проверяй крайние случаи, особенно с NULL и пустыми группами, и всё будет пучком.