Агрегатные функции

В статье об группировках мы обсудили, что при использовании оператора GROUP BY мы можем использовать агрегатные функции. Давайте поговорим о них поглубже 🐳.

Агрегатная функция – это функция, которая выполняет вычисление на наборе значений и возвращает одиночное значение.

Общая структура запроса с агрегатной функцией

MySQL
SELECT [литералы, агрегатные_функции, поля_группировки]
FROM имя_таблицы
GROUP BY поля_группировки;

Например, запрос с использованием агрегатной функции AVG может выглядеть так:

MySQL
SELECT home_type, AVG(price) as avg_price FROM Rooms
GROUP BY home_type
home_typeavg_price
Private room89.4286
Entire home/apt148.6667
Shared room40

Описание агрегатных функций

ФункцияОписание
SUM(поле_таблицы)Возвращает сумму значений
AVG(поле_таблицы)Возвращает среднее значение
COUNT(поле_таблицы)Возвращает количество записей
MIN(поле_таблицы)Возвращает минимальное значение
MAX(поле_таблицы)Возвращает максимальное значение

Агрегатные функции применяются для значений, не равных NULL. Исключением является функция COUNT(*).

Примеры

  • Найдём количество каждого вида жилья и отсортируем полученный список по убыванию:

    MySQL
    SELECT home_type, COUNT(*) as amount FROM Rooms
    GROUP BY home_type
    ORDER BY amount DESC
    
    home_typeamount
    Private room28
    Entire home/apt21
    Shared room1
  • Для каждого жилого помещения найдём самую позднюю дату выезда (поле end_date)

    MySQL
    SELECT room_id, MAX(end_date) AS last_end_date FROM Reservations
    GROUP BY room_id
    
    room_idlast_end_date
    12019-02-04T12:00:00.000Z
    22020-03-23T09:00:00.000Z
    132020-04-21T10:00:00.000Z
    162019-06-24T10:00:00.000Z
    212020-02-29T10:00:00.000Z
    192020-05-02T10:00:00.000Z
    82020-01-21T12:00:00.000Z
    72019-09-17T10:00:00.000Z
    52020-05-15T10:00:00.000Z
    502019-11-25T11:00:00.000Z
    492020-06-11T10:00:00.000Z
    482019-11-10T10:00:00.000Z
    322020-01-18T13:00:00.000Z
    172019-11-05T09:00:00.000Z
    252020-04-22T09:00:00.000Z
    142020-02-12T10:00:00.000Z
    392019-12-09T10:00:00.000Z
    382020-03-23T10:00:00.000Z