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() викличе помилку.

Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ