JavaRush /Курсы /SQL SELF /Средние значения с AVG() — расчет средних з...

Средние значения с AVG() — расчет средних значений по столбцам

SQL SELF
7 уровень , 3 лекция
Открыта

Если вы когда-нибудь пытались вычислить средний балл за экзамены или, например, среднюю зарплату в отделе, то уже знакомы с концепцией среднего арифметического. Ну и в принципе его очень часто учат в школе. В SQL любая задача, связанная с расчетом среднего значения в наборе данных, решается функцией AVG().

Функция AVG() — это агрегатная функция, которая вычисляет среднее арифметическое для числового столбца. Она складывает все значения в указанном столбце и делит результат на количество этих значений. Она не обращает внимания на NULL (и этот игнор, как ни странно, упрощает жизнь, но об этом позже).

Синтаксис AVG()

Давайте начнем с базового синтаксиса:

SELECT AVG(столбец)
FROM таблица;

Обратите внимание: здесь столбец — это столбец, содержащий числовые значения, для которых вы хотите найти среднее.

Пример 1: Средняя зарплата сотрудников

Представьте, что у нас есть таблица employees, где хранятся данные о сотрудниках и их зарплатах:

id name salary
1 Otto 50000
2 Maria 60000
3 Alex 55000
4 Anna NULL
5 Dan 52000

Простой запрос для расчета средней зарплаты:

SELECT AVG(salary) AS average_salary
FROM employees;

Результат:

average_salary
54250

Как это работает?

  • AVG() складывает все значения зарплат: 50000 + 60000 + 55000 + 52000 = 217000.
  • Делит сумму на количество ненулевых значений: 217000 / 4 = 54250.

Особенности работы AVG() с NULL

Вы могли заметить, что для расчета средней зарплаты значение NULL в столбце salary было проигнорировано. Это ключевая особенность AVG(). Она учитывает только не-NULL значения.

Попробуем пример:

SELECT AVG(NULL) AS result;

Результат:

result
NULL

Это ещё раз подтверждает, что AVG() игнорирует NULL. Однако, если весь набор данных состоит из NULL, то результат будет NULL.

Но если у нас в таблице будет стоять не NULL, а 0, такой результат проигнорирован не будет.

Таблица employees

id salary
1 1000
2 0
3 NULL
4 2000

SQL-запрос:

SELECT AVG(salary) AS avg_salary
FROM employees;

Результат:

avg_salary
1000

Почему так?

Потому что AVG() посчитает:

[(1000 + 0 + 2000) / 3 = 1000]

Строка с NULL игнорируется при подсчёте среднего значения.

Пример: Расчет среднего возраста студентов

Теперь обратимся к таблице students:

id name age
1 Anna 20
2 Max 22
3 Maria NULL
4 Otto 21

Запрос:

SELECT AVG(age) AS average_age
FROM students;

Результат:

average_age
21
  • AVG() игнорирует студентку Maria, так как её возраст указан как NULL.
  • Среднее значение рассчитывается как: (20 + 22 + 21) / 3 = 21.

Округление результата

Иногда результат AVG() возвращает дробное значение с несколькими знаками после запятой.

Если вам нужно получить округленное число, можно воспользоваться функцией ROUND().

Таблица employees

id salary
1 50000
2 60000
3 47000
4 NULL

SQL-запрос

SELECT ROUND(AVG(salary), 2) AS rounded_average_salary
FROM employees;

Результат

rounded_average_salary
52333.33

Строка с NULL исключается из расчета, поэтому среднее считается по трём значениям.

Фильтрация данных перед расчетом AVG()

Если нужно рассчитать среднее, но только для значений, соответствующих определённым условиям, используйте WHERE.

Таблица employees

id salary
1 50000
2 60000
3 47000
4 60000
5 NULL

Пример: Найдём среднюю зарплату сотрудников, чей id > 2.

SELECT AVG(salary) AS average_salary
FROM employees
WHERE id > 2;

Результат

average_salary
53500

В расчёте участвуют только зарплаты с id = 3 и id = 4. Строка с NULL исключается.

Пример: Сложные запросы с AVG()

Существует возможность комбинировать функцию AVG() с другими агрегатными функциями и операторами.

Допустим, у нас есть таблица продаж sales:

sale_id product quantity price
1 Телефон 2 500
2 Ноутбук 1 1500
3 Планшет 3 300

Запрос для расчета средней общей суммы продаж:

SELECT AVG(quantity * price) AS average_total_sale
FROM sales;

Результат:

averagetotalsale
950

Жизненные лайфхаки и типичные ошибки

Работа с AVG() должна быть аккуратной, чтобы избежать распространённых ошибок:

NULL-значения: иногда удивляет, почему результат неожиданно меньше ожидаемого. Помните, что AVG() пропускает строки с NULL.

Смешение типов данных: если в столбце смешаны числа и текст (что само по себе плохая практика), AVG() вызовет ошибку.

2
Задача
SQL SELF, 7 уровень, 3 лекция
Недоступна
Простой расчет среднего возраста студентов
Простой расчет среднего возраста студентов
2
Задача
SQL SELF, 7 уровень, 3 лекция
Недоступна
Расчет средней зарплаты сотрудников с условием
Расчет средней зарплаты сотрудников с условием
Комментарии (4)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Серега Батенин Уровень 12
23 июня 2025
Это как это в таблице продаж среднее значение вышло 950? если перемножить количество товаров на их цену,то выйдет 2*500+1500+3*300 => 1000+1500+900=3400 Так если 3400 делить на 3 то выходит 1133,(3) А если делить на количество товаров(6) то среднее выходит 566,(6)
Fanil Magdiew Уровень 31 Expert
6 июля 2025
Действительно, как?
Ra Уровень 35 Student
23 июля 2025
ну если учесть откаты и распилы, то всё норм)))
Anemon Уровень 13 Expert
14 августа 2025
Очень просто, большая часть текста всех лекций пишется через ИИшку, точно больше 50%, а те кто их проверяет и корректирует делают это довольно небрежно. Спалить ИИшку проще всего как раз по подобным вещам, но уже давно есть инструменты, способные в том числе и текст проанализировать. А моё мнение на этот счет таково, что ну и хрен с ней, с ИИшкой. Главное что курс есть, и что он выстроен так, чтобы легко всё запоминалось и знания закреплялись. Хотя жаль что курс стоит ту же цену. Весьма не фиговую цену о-о