Если вы когда-нибудь пытались вычислить средний балл за экзамены или, например, среднюю зарплату в отделе, то уже знакомы с концепцией среднего арифметического. Ну и в принципе его очень часто учат в школе. В 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() вызовет ошибку.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ