Урок доступен в видеоформате 

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

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

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

MySQL 8.4
SELECT { литерал | агрегатная_функция | поле_группировки } [, ...]
FROM имя_таблицы
GROUP BY поле_группировки [, ...];
  • [ ]необязательная часть
  • { a | b }один из вариантов
  • ...можно повторить
литерал

Фиксированное значение, например 'text' или 1. Оно одинаково для всех групп.

агрегатная_функция

Функция, которая считает одно значение по всем строкам группы, например AVG(price).

поле_группировки

Столбец, по которому строки делятся на группы: строки с одинаковым значением попадают в одну группу. Можно указать несколько столбцов через запятую.

имя_таблицы
Таблица, строки которой группируются.

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

MySQL 8.4
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(поле_таблицы)Возвращает максимальное значение

Примеры

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

    MySQL 8.4
    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 8.4
    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