Ответ
Для агрегации данных, такой как вычисление средней зарплаты по отделам, используется оператор GROUP BY в сочетании с агрегатной функцией AVG().
Допустим, таблица называется employees и содержит поля:
name(имя сотрудника,VARCHAR)department(отдел,VARCHAR)salary(зарплата,DECIMALилиINT)
Базовый SQL-запрос:
SELECT
department,
AVG(salary) AS average_salary
FROM employees
GROUP BY department;
Что делает этот запрос:
FROM employees— выбирает данные из таблицы сотрудников.GROUP BY department— группирует все строки таблицы по уникальным значениям в столбцеdepartment. Все сотрудники одного отдела попадают в одну группу.AVG(salary)— для каждой сформированной группы (отдела) вычисляет среднее арифметическое значение зарплаты.AS average_salary— даёт псевдоним столбцу с результатом вычисления для удобства чтения.
| Пример результата: | department | average_salary |
|---|---|---|
| IT | 85000.00 | |
| Sales | 62000.50 | |
| HR | 55000.00 |
Улучшенный запрос с округлением и сортировкой: Часто среднюю зарплату удобно представлять в округлённом виде и отсортировать для наглядности.
SELECT
department,
ROUND(AVG(salary), 2) AS average_salary -- Округляем до 2 знаков после запятой
FROM employees
GROUP BY department
ORDER BY average_salary DESC; -- Сортировка от самой высокой к самой низкой
Важные нюансы:
- В
SELECTсGROUP BYможно включать только столбцы, по которым идёт группировка (department), и результаты агрегатных функций (AVG(salary),COUNT(*)и т.д.). - Функция
AVG()игнорирует значенияNULLв столбцеsalary. Если все значения в группеNULL, результат будетNULL. - Для фильтрации групп (например, вывести только отделы со средней зарплатой > 70000) используйте
HAVING, а неWHERE.SELECT department, AVG(salary) AS avg_sal FROM employees GROUP BY department HAVING AVG(salary) > 70000;