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