🚀 Начался ноябрь! SQLtest.online остаётся бесплатным благодаря донатам таких людей, как вы. Помогите собрать сумму этого месяца пораньше, чтобы сайт работал без перебоев. Поддержать сейчас →
SQL код скопирован в буфер обмена

WHERE, ORDER BY и LIMIT в одном запросе SQL

Урок 2.8 · Время чтения: ~6 мин · Задачи для практики ↓

Большинство реальных SQL-запросов сочетают WHERE, ORDER BY и LIMIT: они фильтруют строки, сортируют их и возвращают только нужную часть. В этом уроке вы узнаете обязательный порядок этих предложений, порядок, в котором база данных на самом деле их обрабатывает, и научитесь писать запросы топ-N с фильтром и постраничный вывод.

В этом модуле вы научились фильтровать строки с помощью WHERE, сортировать их с ORDER BY и ограничивать результат с LIMIT. По отдельности каждое предложение решает небольшую задачу. Вместе они отвечают на типичные бизнес-вопросы: «5 фильмов с самой дешёвой заменой», «последние платежи больше $10», «вторая страница результатов поиска».

Порядок предложений SQL: порядок записи SELECT, FROM, WHERE, ORDER BY, LIMIT в сравнении с логическим порядком обработки FROM, WHERE, SELECT, ORDER BY, LIMIT

Порядок записи предложений

Предложения запроса SELECT нужно записывать в строго определённом порядке. При любом другом порядке база данных вернёт синтаксическую ошибку.

SELECT columns
FROM table_name
WHERE condition
ORDER BY sort_columns
LIMIT row_count OFFSET skip_count;
  1. SELECT: какие столбцы вернуть.
  2. FROM: какую таблицу читать.
  3. WHERE: какие строки оставить.
  4. ORDER BY: как их отсортировать.
  5. LIMIT / OFFSET: какую часть отсортированного результата вернуть.

Это порядок для уже знакомых вам предложений; GROUP BY и HAVING займут своё место между WHERE и ORDER BY в модуле 4.


Логический порядок обработки

База данных обрабатывает запрос не в том порядке, в котором он записан. Логически шаги такие:

ШагПредложениеЧто происходит
1FROMВыбирается исходная таблица
2WHEREУдаляются строки, не подходящие под условие
3SELECTВычисляются столбцы и выражения результата
4ORDER BYСтроки сортируются
5LIMIT / 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».


Постраничный вывод отфильтрованного списка

Приложения обычно выводят постранично отфильтрованный и отсортированный список, например результаты поиска. Нужны все три предложения:

  1. WHERE выбирает строки, которые ищет пользователь.
  2. ORDER BY фиксирует порядок, чтобы строки не повторялись и не пропадали между страницами.
  3. 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.

Попробуйте решить следующие задачи, чтобы закрепить материал этого урока.

  1. Отсортировать список фильмов с условием
  2. Дальнемагистральные самолеты