Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
# Функция MAX в SQL
Определение
MAX — это агрегирующая функция (aggregate function) в SQL, которая возвращает максимальное (наибольшее) значение из набора значений указанного столбца. Она игнорирует значения NULL.
Основное назначение
1. Получение максимального значения
Максимально простое использование — найти наибольшее значение в столбце:
SELECT MAX(salary) FROM employees;
-- Результат: 150000 (наибольшая зарплата)
SELECT MAX(price) FROM products;
-- Результат: 999.99 (самый дорогой товар)
SELECT MAX(created_at) FROM posts;
-- Результат: 2026-03-22 12:30:45 (самый последний пост)
2. MAX с WHERE условием
Можно применять фильтры перед вычислением максимума:
SELECT MAX(salary) FROM employees WHERE department = IT;
-- Максимальная зарплата в отделе IT
SELECT MAX(price) FROM products WHERE category = Electronics;
-- Самый дорогой товар в категории Electronics
SELECT MAX(age) FROM users WHERE status = active;
-- Максимальный возраст активных пользователей
3. MAX с GROUP BY — максимум для каждой группы
Это одна из самых частых операций — найти максимальное значение для каждой группы:
SELECT
department,
MAX(salary) as max_salary
FROM employees
GROUP BY department;
-- Результат:
-- department | max_salary
-- IT | 150000
-- HR | 80000
-- Sales | 120000
Пример 2: Максимальная цена товара по категориям
SELECT
category,
MAX(price) as max_price,
COUNT(*) as product_count
FROM products
GROUP BY category;
-- Результат:
-- category | max_price | product_count
-- Electronics | 1999.99 | 45
-- Clothing | 299.99 | 120
-- Books | 49.99 | 200
4. MAX в подзапросе
Максимальное значение можно использовать для фильтрации:
-- Найти сотрудника с максимальной зарплатой
SELECT * FROM employees
WHERE salary = (SELECT MAX(salary) FROM employees);
-- Найти товары с максимальной ценой в каждой категории
SELECT * FROM products
WHERE (category, price) IN (
SELECT category, MAX(price) FROM products GROUP BY category
);
-- Найти постов с максимальным количеством комментариев
SELECT * FROM posts
WHERE comment_count = (SELECT MAX(comment_count) FROM posts);
5. MAX с HAVING условием
Фильтрация групп по максимальному значению:
-- Показать отделы, где максимальная зарплата больше 100000
SELECT
department,
MAX(salary) as max_salary,
COUNT(*) as employee_count
FROM employees
GROUP BY department
HAVING MAX(salary) > 100000;
-- Результат:
-- department | max_salary | employee_count
-- IT | 150000 | 12
-- Sales | 120000 | 8
6. MAX с разными типами данных
Числовые значения:
SELECT MAX(salary) FROM employees; -- Числа
SELECT MAX(quantity) FROM inventory; -- Целые числа
SELECT MAX(rating) FROM reviews; -- Рейтинг
Строковые значения (лексикографический порядок):
SELECT MAX(username) FROM users; -- "zebra" будет максимальной
SELECT MAX(city) FROM addresses; -- Последний город в алфавитном порядке
Даты и время:
SELECT MAX(created_at) FROM orders; -- Самая последняя дата
SELECT MAX(birth_date) FROM users; -- Самый молодой пользователь
7. Сравнение MAX с другими агрегирующими функциями
SELECT
MAX(salary) as maximum, -- Максимум
MIN(salary) as minimum, -- Минимум
AVG(salary) as average, -- Среднее
SUM(salary) as total, -- Сумма
COUNT(*) as count -- Количество
FROM employees;
-- Результат:
-- maximum | minimum | average | total | count
-- 150000 | 30000 | 75000.50 | 900006 | 12
8. Практические примеры
Пример 1: Найти последний заказ каждого клиента
SELECT
customer_id,
MAX(order_date) as last_order_date
FROM orders
GROUP BY customer_id;
Пример 2: Найти самый популярный товар по продажам
SELECT
product_id,
product_name,
MAX(quantity_sold) as max_sold
FROM sales
GROUP BY product_id, product_name
ORDER BY max_sold DESC
LIMIT 1;
Пример 3: Найти старшего сотрудника в каждом отделе
SELECT
department,
MAX(age) as oldest_employee_age
FROM employees
GROUP BY department;
Пример 4: Проверить максимальный ID для вставки
SELECT MAX(id) + 1 as next_id FROM users;
-- Используется для вычисления следующего ID (хотя обычно используются SEQUENCE)
9. Обработка NULL значений
Важное свойство: MAX игнорирует NULL значения
Столбец salary: [50000, 60000, NULL, 75000, NULL]
SELECT MAX(salary) FROM employees; -- Результат: 75000 (NULL игнорируются)
-- Если все значения NULL
Столбец bonus: [NULL, NULL, NULL]
SELECT MAX(bonus) FROM employees; -- Результат: NULL
10. MAX с CASE выражением
Можно использовать MAX вместе с условной логикой:
-- Максимальная зарплата мужчин
SELECT MAX(CASE WHEN gender = M THEN salary END) as max_male_salary
FROM employees;
-- Максимальная зарплата по полу и отделу
SELECT
gender,
department,
MAX(salary) as max_salary
FROM employees
GROUP BY gender, department;
11. Окна функции (Window Functions) с MAX
В современных СУБД (PostgreSQL 8.4+, MySQL 8.0+):
SELECT
employee_id,
salary,
department,
MAX(salary) OVER (PARTITION BY department) as dept_max_salary,
MAX(salary) OVER () as company_max_salary
FROM employees;
-- Результат показывает максимальную зарплату по отделам и в целой компании
Выводы
Функция MAX в SQL:
- Возвращает максимальное (наибольшее) значение из набора
- Игнорирует NULL значения
- Часто используется с GROUP BY для получения максимума по группам
- Работает с числами, строками и датами
- Незаменима для аналитики и отчётов
- Может использоваться в подзапросах и window functions