WHERE, ORDER BY и LIMIT в одном запросе SQL
Урок 2.8 · Время чтения: ~6 мин · Задачи для практики ↓
Большинство реальных SQL-запросов сочетают WHERE, ORDER BY и LIMIT: они фильтруют строки, сортируют их и возвращают только нужную часть. В этом уроке вы узнаете обязательный порядок этих предложений, порядок, в котором база данных на самом деле их обрабатывает, и научитесь писать запросы топ-N с фильтром и постраничный вывод.
В этом модуле вы научились фильтровать строки с помощью WHERE, сортировать их с ORDER BY и ограничивать результат с LIMIT. По отдельности каждое предложение решает небольшую задачу. Вместе они отвечают на типичные бизнес-вопросы: «5 фильмов с самой дешёвой заменой», «последние платежи больше $10», «вторая страница результатов поиска».
Порядок записи предложений
Предложения запроса SELECT нужно записывать в строго определённом порядке. При любом другом порядке база данных вернёт синтаксическую ошибку.
SELECT columns
FROM table_name
WHERE condition
ORDER BY sort_columns
LIMIT row_count OFFSET skip_count;
SELECT: какие столбцы вернуть.FROM: какую таблицу читать.WHERE: какие строки оставить.ORDER BY: как их отсортировать.LIMIT/OFFSET: какую часть отсортированного результата вернуть.
Это порядок для уже знакомых вам предложений; GROUP BY и HAVING займут своё место между WHERE и ORDER BY в модуле 4.
Логический порядок обработки
База данных обрабатывает запрос не в том порядке, в котором он записан. Логически шаги такие:
| Шаг | Предложение | Что происходит |
|---|---|---|
| 1 | FROM | Выбирается исходная таблица |
| 2 | WHERE | Удаляются строки, не подходящие под условие |
| 3 | SELECT | Вычисляются столбцы и выражения результата |
| 4 | ORDER BY | Строки сортируются |
| 5 | LIMIT / OFFSET | Возвращается нужная часть отсортированных строк |
Этот порядок объясняет два важных правила:
- В
WHEREнельзя использовать псевдонимы столбцов изSELECT: на шаге 2 их ещё нет. LIMITприменяется после фильтрации и сортировки, поэтому «топ-5» - это первые 5 отфильтрованных строк, а не 5 случайных строк, которые затем фильтруются.
Оптимизатор может выполнять запрос внутри по-другому, но результат всегда такой же, как если бы шаги выполнялись в этом порядке.
Запросы топ-N с фильтром
Пять самых коротких недорогих фильмов
SELECT title, length, replacement_cost
FROM film
WHERE replacement_cost < 15.00
ORDER BY length, title
LIMIT 5;
Результат: 5 самых коротких фильмов, замена которых стоит меньше $15.
Последние крупные платежи
SELECT payment_id, customer_id, amount, payment_date
FROM payment
WHERE amount >= 10.00
ORDER BY payment_date DESC
LIMIT 10;
Результат: 10 последних платежей на сумму от $10.
Актёры на определённую букву
SELECT first_name, last_name
FROM actor
WHERE last_name LIKE 'B%'
ORDER BY first_name, last_name
LIMIT 3;
Результат: первые 3 актёра в порядке имён, чья фамилия начинается на «B».
Постраничный вывод отфильтрованного списка
Приложения обычно выводят постранично отфильтрованный и отсортированный список, например результаты поиска. Нужны все три предложения:
WHEREвыбирает строки, которые ищет пользователь.ORDER BYфиксирует порядок, чтобы строки не повторялись и не пропадали между страницами.LIMITиOFFSETвыбирают страницу:LIMIT S OFFSET (N - 1) * S.
SELECT first_name, last_name
FROM actor
WHERE first_name LIKE 'A%'
ORDER BY last_name, first_name
LIMIT 5 OFFSET 5;
Результат: вторая страница (строки с 6-й по 10-ю) актёров, чьё имя начинается на «A», отсортированных по фамилии.
Ключевые выводы:
- Порядок записи:
SELECT→FROM→WHERE→ORDER BY→LIMIT. - Логический порядок:
FROM→WHERE→SELECT→ORDER BY→LIMIT. WHEREприменяется доSELECT, поэтому в нём нельзя использовать псевдонимы столбцов; вORDER BYможно.LIMITберёт строки из уже отфильтрованного и отсортированного результата.- Для стабильных топ-списков и пагинации делайте сортировку однозначной.
Часто задаваемые вопросы
В каком порядке записываются WHERE, ORDER BY и LIMIT в SQL?
Сначала WHERE, затем ORDER BY, затем LIMIT: SELECT ... FROM ... WHERE ... ORDER BY ... LIMIT .... Любой другой порядок вызывает синтаксическую ошибку.
В каком порядке SQL выполняет запрос?
Логически: FROM, WHERE, GROUP BY, HAVING, SELECT, ORDER BY, LIMIT. Поэтому в WHERE нельзя использовать псевдонимы из SELECT, а в ORDER BY можно.
LIMIT применяется до WHERE или после?
После. База данных сначала фильтрует строки с помощью WHERE, сортирует их с ORDER BY и только потом возвращает количество строк, заданное в LIMIT.