MIN, MAX и агрегирование нечисловых данных
Агрегируйте даты и строки и разбирайтесь в значении MIN для текста.
«MIN, MAX и агрегирование нечисловых данных» — бесплатный урок SQL Interview Prep на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения SQL Interview Prep, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс SQL Interview Prep содержит 4 уроков всего.
MIN и MAX не только для чисел
Кандидаты предполагают, что MIN и MAX работают только с числами. Интервьюеры любят спрашивать: «Что возвращает MAX(name)? А MIN(order_date)?»
На самом деле MIN и MAX работают с любым упорядочиваемым типом — числами, датами и строками. Настоящий проверяемый навык — понимание правил упорядочивания для каждого типа.
Числовой случай
Начнём со знакомого. В числовых столбцах MIN возвращает наименьшее значение, а MAX — наибольшее. Всё просто.
Как и другие агрегатные функции, MIN и MAX игнорируют NULL. NULL никогда не является минимальным или максимальным значением; он просто пропускается. Если все значения равны NULL, обе функции возвращают NULL.
SELECT MIN(salary) AS lowest, MAX(salary) AS highest
FROM employees;MIN и MAX для дат
Даты и временные метки полностью упорядочиваемы, поэтому MIN(order_date) возвращает самую раннюю дату, а MAX(order_date) — самую позднюю.
Так вы отвечаете на вопросы «когда был размещён первый заказ?» (MIN) и «какова самая недавняя активность?» (MAX), не выполняя сортировку и ограничение числа строк. Это идиоматичное решение на основе множеств.
SELECT
MIN(order_date) AS first_order,
MAX(order_date) AS latest_order
FROM orders;Интервал дат одним запросом
Часто возникает следующий вопрос: «Как долго этот клиент остаётся активным?» Объедините MIN и MAX, а затем вычтите одно значение из другого.
Так вычисляется интервал между первым и последним заказом. Точный синтаксис вычитания зависит от диалекта, но идея MIN/MAX универсальна и показывает, что диапазоны можно задавать декларативно.
SELECT
customer_id,
MIN(order_date) AS first_order,
MAX(order_date) AS last_order,
MAX(order_date) - MIN(order_date) AS active_days
FROM orders
GROUP BY customer_id;MIN и MAX для строк
Вот что часто удивляет. Для текстовых столбцов MIN и MAX используют лексикографический (алфавитный) порядок, основанный на сопоставлении столбца.
Поэтому MIN(name) возвращает имя, которое первым идёт в алфавитном порядке, а MAX(name) — то, которое идёт последним. MIN для {'Carol', 'Alice', 'Bob'} возвращает 'Alice', а MAX — 'Carol'.
SELECT MIN(name) AS first_alpha, MAX(name) AS last_alpha
FROM employees;
-- with Alice, Bob, Carol: 'Alice' and 'Carol'Сопоставление и чувствительность к регистру
Порядок строк зависит от сопоставления, которое определяет чувствительность к регистру и правила локали. Во многих сопоставлениях, используемых по умолчанию, прописные буквы могут располагаться раньше строчных, поэтому результат MAX для {'apple', 'Banana'} может вас удивить.
На собеседовании упомяните, что результаты MIN/MAX для строк зависят от сопоставления. Эта тонкость отличает заученный ответ от настоящего понимания.
Что НЕ означает MIN(text)
Распространённое заблуждение заключается в том, что MIN(name) возвращает самую короткую строку, а MAX(name) — самую длинную. Это не так. Здесь учитывается исключительно порядок сортировки, а не длина.
Если вам действительно нужна самая длинная строка, отсортируйте значения по LENGTH(name) и выберите верхнюю строку либо используйте MAX(LENGTH(name)), если нужна только длина. Не путайте порядок значений с их длиной.
SELECT MAX(LENGTH(name)) AS longest_name_length
FROM employees;MIN/MAX не объединяют столбцы
Важная ловушка: MIN и MAX независимо работают с одним столбцом. Они не возвращают всю строку, содержащую минимальное или максимальное значение.
Если написать SELECT MIN(salary), name без группировки, вы не получите имя сотрудника с самой низкой зарплатой — в зависимости от диалекта будет выдана ошибка или произвольное имя. Чтобы получить всю строку, используйте ORDER BY + LIMIT или оконную функцию.
-- Wrong assumption: this does NOT give the lowest earner's name.
-- Correct approach to get the whole row:
SELECT name, salary
FROM employees
ORDER BY salary ASC
LIMIT 1;Повторение: поведение NULL в MIN/MAX
Как и SUM и AVG, MIN и MAX пропускают NULL. NULL не является ни наименьшим, ни наибольшим значением.
- Смешанные значения + NULL: NULL игнорируется, возвращаются фактические минимальное и максимальное значения.
- Только NULL или отсутствие строк: MIN и MAX возвращают NULL.
Эту согласованность всех агрегатных функций удобно сформулировать так: «Все стандартные агрегатные функции игнорируют NULL».
Объединение в группу
MIN и MAX особенно полезны вместе с GROUP BY для поиска крайних значений в каждой группе. «Самая высокая зарплата в каждом отделе» — классический пример.
Запрос возвращает по одной строке на отдел с максимальной зарплатой в этом отделе. Помните: возвращается значение, а не сотрудник. Получение имени вместе с этим значением — отдельная и распространённая задача.
SELECT department, MAX(salary) AS top_salary
FROM employees
GROUP BY department;Как отвечать уверенно
Хороший ответ на собеседовании: «MIN и MAX работают с любым упорядочиваемым типом. Для чисел это наименьшее и наибольшее значения, для дат — самые ранняя и поздняя даты, а для строк — алфавитный порядок, определяемый сопоставлением столбца. Они игнорируют NULL и возвращают NULL только тогда, когда нет ни одного значения, отличного от NULL. Они возвращают одно значение, а не всю строку, поэтому для получения строки я использую ORDER BY с LIMIT или оконную функцию».
Быстрая проверка
Рассуждайте об агрегировании строк.
Повторение
Всё о MIN и MAX:
- Работают с любым упорядочиваемым типом: числами, датами и строками.
- Для строк используется алфавитный порядок/порядок сопоставления, а не длина.
- Для дат: MIN = самая ранняя дата, MAX = самая поздняя.
- Они игнорируют NULL; если все значения равны NULL или строк нет, возвращается NULL.
- Они возвращают значение, а не всю строку — для этого используйте ORDER BY + LIMIT.
Далее: что происходит при использовании агрегатных функций без GROUP BY.
Часто задаваемые вопросы
Урок «MIN, MAX и агрегирование нечисловых данных» бесплатный?
Да — полный текст урока «MIN, MAX и агрегирование нечисловых данных» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс SQL Interview Prep, подпишись на CoddyKit PRO. Курс SQL Interview Prep содержит 4 уроков всего.
Чему я научусь в уроке «MIN, MAX и агрегирование нечисловых данных»?
Агрегируйте даты и строки и разбирайтесь в значении MIN для текста. Ты практикуешь SQL Interview Prep с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать SQL Interview Prep?
Предыдущий опыт не требуется. SQL Interview Prep на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «MIN, MAX и агрегирование нечисловых данных»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке SQL Interview Prep?
Да. Каждый урок SQL Interview Prep включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- COUNT(*) и COUNT(столбец) и COUNT(DISTINCT)
- SUM и AVG с NULL
- MIN, MAX и агрегирование нечисловых данных
- Агрегаты без GROUP BY