SELECT
user_id,
GREATEST(last_login, last_order, last_event) AS last_activity
FROM users;
Результат:
user_id | last_activity
--------+--------------
17 | 2026-07-09
42 | 2026-07-11
SELECT
order_id,
GREATEST(amount - 500, 0) AS after_discount
FROM orders;
Результат:
order_id | after_discount
---------+---------------
1001 | 700
1002 | 0
SELECT LEAST(100, NULL, 50) AS min_val;
Результат:
min_val
-------
50
Порешать SQL-задачи в тренажёре →
Спрашивают, когда надо сравнить значения по горизонтали (несколько дат или сумм в одной строке) или зажать число в диапазон в паре с CASE. Частый follow-up — объяснить отличие от агрегатных MIN/MAX.
GREATEST — построчная (скалярная) функция: она сравнивает свои аргументы внутри одной строки и не группирует данные. MAX() — агрегат: он ищет максимум по всем строкам колонки и требует GROUP BY. GREATEST(a, b, c) и MAX(col) решают разные задачи и не взаимозаменяемы.
В MySQL и PostgreSQL есть готовые GREATEST и LEAST. В SQLite таких ключевых слов нет, но встроенные MAX() и MIN() при передаче нескольких аргументов ведут себя как скалярные аналоги — MAX(a, b, c) вернёт наибольший из значений строки. Учитывай разницу в обработке NULL между диалектами.
Поведение зависит от диалекта. PostgreSQL и Oracle пропускают NULL-аргументы и возвращают NULL только когда все аргументы NULL. MySQL строже: любой NULL среди аргументов делает результат NULL, поэтому там значения часто оборачивают в COALESCE.
Условная логика · null-handling
COALESCE · NULLIF · CASE WHEN · COUNT · CAST · ROUND
Открыть SQL-тренажёр (565 задач) →