К этому моменту мы научились фильтровать строки (WHERE), сортировать их (ORDER BY) и ограничивать количество результатов (LIMIT). В реальных сценариях вы почти всегда будете использовать эти операторы вместе, чтобы получить именно те данные, которые вам нужны.
В SQL существует строгий порядок расположения этих операторов в запросе. Если вы поставите их в неправильном порядке, база данных выдаст ошибку.
Правильная последовательность:
SELECT (Какие столбцы?)FROM (Какая таблица?)WHERE (Сначала фильтруем строки)ORDER BY (Сортируем отфильтрованные строки)LIMIT (Берем первые X результатов из отсортированного списка)OFFSET (Пропускаем X строк, если необходимо)Когда вы запускаете комбинированный запрос, база данных концептуально обрабатывает его следующим образом:
FROM.WHERE.ORDER BY.LIMIT, чтобы выдать именно ту часть, которую вы запросили.В этом примере мы сначала фильтруем фильмы по стоимости замены, затем сортируем их по длительности и, наконец, ограничиваем количество результатов.
SELECT title, length, replacement_cost
FROM film
WHERE replacement_cost < 20.00
ORDER BY length ASC
LIMIT 5;
Этот запрос находит 10 самых недавних аренд, которые длились более 5 дней.
SELECT rental_id, rental_date, return_date
FROM rental
WHERE return_date - rental_date > 5
ORDER BY rental_date DESC
LIMIT 10;
Найти первых 3 актеров, чья фамилия начинается на 'B', отсортированных по имени в алфавитном порядке.
SELECT first_name, last_name
FROM actor
WHERE last_name LIKE 'B%'
ORDER BY first_name
LIMIT 3;
В предыдущем уроке мы рассмотрели базовую пагинацию с использованием LIMIT и OFFSET. В реальных приложениях вы обычно перемещаетесь по отфильтрованному и отсортированному списку.
ORDER BY база данных может возвращать строки в разном порядке при каждом переходе на следующую страницу, из-за чего некоторые элементы могут появиться дважды, а другие — вообще исчезнуть из вывода.Для реализации пагинации для «Страницы N» с количеством результатов «S» на страницу:
LIMIT SOFFSET (N - 1) * SЕсли мы хотим показать вторую страницу (5 результатов на страницу) актеров, чье имя начинается на 'A', отсортированных по фамилии:
SELECT first_name, last_name
FROM actor
WHERE first_name LIKE 'A%'
ORDER BY last_name
LIMIT 5 OFFSET 5; -- Страница 2: пропустить 5, взять 5
Ключевые выводы этого урока:
WHERE -> ORDER BY -> LIMIT.WHERE применяются до того, как происходит сортировка и ограничение.LIMIT вместе с ORDER BY, если хотите, чтобы результаты были предсказуемыми.В следующем модуле мы перейдем от простого извлечения строк к изучению агрегатных функций, которые позволяют вычислять итоговые суммы, средние значения и количество записей во всем наборе данных.