Какие агрегатные функции знаешь в SQL?

«Какие агрегатные функции знаешь в SQL?» — вопрос из категории Базы данных, который задают на 25% собеседований C/C++ Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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

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

  1. COUNT() - подсчитывает количество строк.

    • COUNT(*) считает все строки, включая NULL.
    • COUNT(column) считает только не-NULL значения в указанном столбце.
      -- Общее количество заказов
      SELECT COUNT(*) AS total_orders FROM orders;
      -- Количество заказов с указанным идентификатором клиента
      SELECT COUNT(customer_id) FROM orders;
      -- Количество уникальных клиентов, сделавших заказы
      SELECT COUNT(DISTINCT customer_id) FROM orders;
  2. SUM() - вычисляет сумму значений в числовом столбце.

    SELECT SUM(quantity * unit_price) AS total_revenue FROM order_details;
  3. AVG() - вычисляет среднее арифметическое значений.

    SELECT AVG(salary) AS average_salary FROM employees WHERE department = 'Engineering';
  4. MIN() / MAX() - находят минимальное и максимальное значение.

    SELECT MIN(price) AS cheapest, MAX(price) AS most_expensive FROM products;

Важные особенности и работа с GROUP BY:

  • Агрегатные функции игнорируют NULL значения (кроме COUNT(*)).
  • GROUP BY группирует строки с одинаковыми значениями, и агрегация применяется к каждой группе отдельно.
  • HAVING используется для фильтрации результатов после агрегации, в отличие от WHERE, который фильтрует строки до.
-- Пример: средний чек по каждому клиенту, у кого было больше 5 заказов
SELECT
    customer_id,
    COUNT(*) AS order_count,
    AVG(total_amount) AS avg_order_value
FROM orders
GROUP BY customer_id
HAVING COUNT(*) > 5; -- Фильтрация по результату агрегации

Специфичные для СУБД функции (примеры):

  • PostgreSQL/MySQL: STRING_AGG() / GROUP_CONCAT() - объединяет строковые значения из группы в одну строку с разделителем.
  • Статистические: STDDEV() (стандартное отклонение), VARIANCE() (дисперсия).
  • Для работы с битами: BIT_AND(), BIT_OR().