Что такое агрегатная функция в SQL?

Ответ

Агрегатная функция в SQL выполняет вычисление над набором строк и возвращает единственное значение. Она используется для получения сводных данных из таблицы.

Основные агрегатные функции:

  • COUNT() — подсчитывает количество строк.
  • SUM() — вычисляет сумму значений столбца.
  • AVG() — вычисляет среднее арифметическое.
  • MAX() / MIN() — находит максимальное или минимальное значение.

Пример использования:

SELECT 
    COUNT(*) AS total_orders,
    SUM(amount) AS total_revenue,
    AVG(amount) AS average_order_value
FROM orders
WHERE customer_id = 123;

Ключевые особенности:

  1. Обработка NULL: Большинство агрегатных функций (кроме COUNT(*)) игнорируют значения NULL.
  2. Группировка: Часто используются с предложением GROUP BY для агрегации по группам.
  3. Фильтрация: Нельзя использовать напрямую в WHERE; для фильтрации результатов агрегации применяется HAVING.
  4. Одно значение: В запросе без GROUP BY агрегатные функции сворачивают все выбранные строки в одну итоговую.

Ответ 18+ 🔞

Давай разжую эту тему про агрегатные функции, чтобы ты понял, как это работает, а не просто тупо зазубрил. Представь, что у тебя есть куча данных, и тебе надо из них выжать какую-то суть, одно число. Вот для этого эти функции и существуют, чтобы не считать вручную, а заставить базу данных потрудиться за тебя.

Основные пацаны на районе:

  • COUNT() — этот просто считает, сколько у тебя строк. "Сколько тут всего народу?".
  • SUM() — этот складывает всё в столбце. "Сколько в итоге бабла?".
  • AVG() — этот выводит среднюю температуру по больнице. "А сколько в среднем-то?".
  • MAX() / MIN() — эти два брата-близнеца ищут самого большого и самого мелкого. "Кто тут рекордсмен, а кто аутсайдер?".

Вот смотри, как это в деле выглядит:

SELECT 
    COUNT(*) AS total_orders,        -- Считаем, сколько всего заказов
    SUM(amount) AS total_revenue,    -- Складываем всю выручку
    AVG(amount) AS average_order_value -- Считаем средний чек
FROM orders
WHERE customer_id = 123;              -- И всё это для одного конкретного клиента

А теперь важные нюансы, без которых наебёшься:

  1. Про NULL: Эти функции (кроме COUNT(*)) — умные ребята. Они видят NULL и делают вид, что его нет. Игнорируют, блядь. SUM() не будет прибавлять хуй пойми что, AVG() не станет делить на пустое место. COUNT(*) — тот ещё похуист, ему всё равно, он считает ВСЕ строки, хоть они забиты NULL'ами.

  2. Группировка (GROUP BY): Это когда тебе надо не одну общую цифру на весь запрос, а разбить всё по группам. Например, "сколько и кто потратил?". Без GROUP BY получится одна строчка на весь результат. С ним — строчка на каждую группу. Охуенно мощный инструмент, но если его забыть, будет пиздец и ошибка.

  3. Фильтрация результатов: Вот тут ловушка, ёпта! Ты не можешь в WHERE написать WHERE AVG(amount) > 100. WHERE фильтрует строки ДО того, как они посчитаются. А чтобы отфильтровать уже ПОСЛЕ подсчёта, есть отдельный мужик — HAVING. Запомни: WHERE — для строк, HAVING — для сгруппированных результатов. Перепутаешь — SQL тебя пошлёт нахуй с синтаксической ошибкой.

  4. Свёртка в одно значение: Если ты пишешь запрос БЕЗ GROUP BY и используешь агрегатную функцию, то база возьмёт ВСЕ подходящие под условия строки и склепает из них одну-единственную итоговую строчку. Всё, точка. Больше ничего не будет.

Короче, суть в том, чтобы превратить кучу данных в осмысленную цифру. Главное — не перепутай, когда фильтровать и как группировать, а то вместо отчёта получишь ебанину.