Ответ
Для агрегации данных, такой как вычисление средней зарплаты по отделам, используется оператор 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;
Ответ 18+ 🔞
А, ну это же классика, блядь! Все эти GROUP BY и AVG() — это как на заводе зарплату считать: всех по цехам раскидали и среднюю температуру по больнице вывели.
Смотри, представь таблицу employees — это типа список работяг. У каждого есть имя, отдел, где он пашет, и зарплата, которую он хавает.
И вот тебе надо узнать, в каком отделе начальство не жадное, а в каком народ за копейки впахивает. Берёшь и пишешь такой запрос, простой как три копейки:
SELECT
department, -- Это отдел, понятное дело
AVG(salary) AS average_salary -- А это мы считаем среднюю зп по палате
FROM employees
GROUP BY department; -- И вот этой магической фразой говорим: "Собери всех, кто в одном отделе, в кучку!"
Что происходит-то, ёпта? Компьютер берёт всю эту толпу сотрудников, смотрит на столбец department и начинает сортировать: ага, эти все из IT, эти из продаж, а эти из отдела кадров, где делать нихуя. Потом для каждой такой сформированной банды он берёт все их зарплаты, складывает и делит на количество рож — вот тебе и средняя арифметическая, как в школе.
| На выходе получается табличка, от которой любой бухгалтер обосрётся: | department | average_salary |
|---|---|---|
| IT | 85000.00 | // Тут айтишники, они всегда с деньгами |
| Sales | 62000.50 | // Продажники, у них проценты |
| HR | 55000.00 | // Кадровики, ну вы поняли |
Но это же некрасиво, когда цифры с кучей знаков после запятой! Нормальные люди округляют. Да и смотреть удобнее, когда отделы отсортированы по жирности зарплаты.
SELECT
department,
ROUND(AVG(salary), 2) AS average_salary -- Округляем до копеек, чтоб красиво было
FROM employees
GROUP BY department
ORDER BY average_salary DESC; -- Ставим сверху тех, у кого средняя зп выше, чтобы сразу видно было, где медовые места
А теперь, внимание, самый частый косяк, который всех наебывает! Допустим, ты хочешь вывести только те отделы, где средняя зарплата зашкаливает за 70к. И тут новичок пишет WHERE AVG(salary) > 70000. И получает пиздюлину от базы данных!
Почему? Да потому что WHERE фильтрует строки ДО того, как они сгруппированы. А среднюю зарплату мы можем посчитать только ПОСЛЕ группировки. Для этого есть специальное словечко HAVING. Оно как WHERE, но для уже готовых, сгруппированных кучек.
SELECT department, AVG(salary) AS avg_sal
FROM employees
GROUP BY department
HAVING AVG(salary) > 70000; -- Вот так правильно, фильтруем уже сгруппированные результаты
Короче, запомни: GROUP BY — это разложить всех по коробочкам (отделам). AVG(), SUM(), COUNT() — это посчитать что-то внутри каждой коробочки. А HAVING — это выкинуть нахуй те коробочки, где результат подсчёта тебе не нравится. Всё просто, как дважды два, блядь.