Как найти максимум, минимум и среднее значение в SQL (MAX, MIN, AVG)?
Нужно по таблице зарплат узнать самую высокую, самую низкую и среднюю зарплату. Как посчитать максимум, минимум и среднее в SQL? Это отдельные функции или один запрос?
2 ответа
Это агрегатные функции, и их можно считать в одном запросе:
SELECT
MAX(salary) AS max_salary,
MIN(salary) AS min_salary,
AVG(salary) AS avg_salary
FROM employees;
MAX— наибольшее значение,MIN— наименьшее,AVG— среднее арифметическое,SUM— сумма (тоже из этой компании).
Нюансы, о которых надо знать:
-
NULL игнорируются. Если у части сотрудников зарплата NULL, AVG посчитает среднее только по непустым. То есть среднее = сумма непустых / количество непустых, а не / общее число строк.
-
AVG может дать дробь. Если столбец целочисленный, в некоторых СУБД (например, при делении целых) результат может округлиться. Для точности приводите к дробному типу:
AVG(salary::numeric)в Postgres илиAVG(CAST(salary AS DECIMAL)). -
MAX и MIN работают не только с числами, но и с датами (
MAX(created_at)— самая поздняя дата) и текстом (по алфавиту).
Если нужно найти максимум по каждой группе (например, макс. зарплата в каждом отделе), добавьте GROUP BY:
SELECT department, MAX(salary)
FROM employees
GROUP BY department;
Важная тонкость: MAX(salary) вернёт само значение максимальной зарплаты, но не строку сотрудника, который её получает. Если нужны имя и зарплата самого высокооплачиваемого, одного MAX мало — используйте ORDER BY salary DESC LIMIT 1 или подзапрос. Это классическая ловушка: люди пишут SELECT name, MAX(salary) без GROUP BY и получают ошибку или мусор.