Обычно таблицы в веб-проектах содержат огромное количество данных, поэтому их никогда не показывают на страницах сразу все. Обычно выводится лишь небольшая часть — например, 10 строк.
Чтобы ограничить выборку, используется LIMIT
. В этом уроке разберем, как работать с таким запросом.
Как ограничивать выборку таблицы
Представим, что нам нужно извлечь 10 записей. Для этого выполним такой запрос:
SELECT
id,
username,
email
FROM users LIMIT 10;
id | username | |
---|---|---|
1 |
Duncan3 |
Trevion53@yahoo.com |
2 |
Michaela11 |
Baylee52@yahoo.com |
3 |
Margarete_Hegmann6 |
Casimer_Cronin@yahoo.com |
4 |
Kayley.Turcotte98 |
Angelita.Altenwerth96@hotmail.com |
5 |
Curtis_Baumbach |
Hobart91@hotmail.com |
6 |
Leola.Ward |
Kenya_Legros17@yahoo.com |
7 |
Stan_Sauer4 |
Kiera73@hotmail.com |
8 |
Bernie.Crooks |
Baby_Wintheiser@hotmail.com |
9 |
Woodrow14 |
Wyatt9@hotmail.com |
10 |
Berta.Trantow |
Dorian31@gmail.com |
View on DB Fiddle
Мы не знаем, какой порядок сортировки был по умолчанию. Поэтому мы не можем заранее узнать, какие 10 записей мы получим. Чтобы это выяснить, нужно определить сортировку.
Оператор LIMIT
без сортировки практически никогда не используется. Поэтому нужно задать сортировку таким образом:
SELECT
id,
username,
email
FROM users ORDER BY id LIMIT 10;
id | username | |
---|---|---|
1 |
Duncan3 |
Trevion53@yahoo.com |
2 |
Michaela11 |
Baylee52@yahoo.com |
3 |
Margarete_Hegmann6 |
Casimer_Cronin@yahoo.com |
4 |
Kayley.Turcotte98 |
Angelita.Altenwerth96@hotmail.com |
5 |
Curtis_Baumbach |
Hobart91@hotmail.com |
6 |
Leola.Ward |
Kenya_Legros17@yahoo.com |
7 |
Stan_Sauer4 |
Kiera73@hotmail.com |
8 |
Bernie.Crooks |
Baby_Wintheiser@hotmail.com |
9 |
Woodrow14 |
Wyatt9@hotmail.com |
10 |
Berta.Trantow |
Dorian31@gmail.com |
View on DB Fiddle
Как показать все данные по выборкам
Допустим, пользователь хочет посмотреть следующие 10 записей. Это реализуется через пагинацию — механизм, который позволяет перемещаться по страницам.
Чтобы реализовать пагинацию, одного LIMIT
недостаточно. Еще понадобится смещение OFFSET
:
SELECT
id,
username,
email
FROM users ORDER BY id LIMIT 10 OFFSET 10;
id | username | ||
---|---|---|---|
--- |
--------------- |
------------------------------- |
|
11 |
Winston.Mann24 |
Kendall_Aufderhar@gmail.com |
|
12 |
Abelardo58 |
Cole.Paucek@yahoo.com |
|
13 |
Tina_Huels |
Tyree89@yahoo.com |
|
14 |
Frank_Murazik97 |
Marlon69@yahoo.com |
|
15 |
Gia67 |
Anika_OReilly58@gmail.com |
|
16 |
Davonte78 |
Dewayne_Lueilwitz69@hotmail.com |
|
17 |
Mercedes14 |
Filomena.Hodkiewicz@yahoo.com |
|
18 |
Saul25 |
Rashawn.Altenwerth@gmail.com |
|
19 |
Gregory9 |
Dallin_Lebsack88@hotmail.com |
|
20 |
Kenyatta70 |
Marvin_Hettinger24@yahoo.com |
View on DB Fiddle
Этот запрос:
-
Отсортирует все записи.
-
Пропустит первые 10 записей за счет части
OFFSET 10
. -
Возьмет следующие 10 записей.
Если менять OFFSET
, можно обойти все данные в таблице:
-- Выбрать записи с 21 по 30
SELECT
id,
username,
email
FROM users ORDER BY id LIMIT 10 OFFSET 20;
-- Выбрать записи с 31 по 40
SELECT
id,
username,
email
FROM users ORDER BY id LIMIT 10 OFFSET 30;
View on DB Fiddle
Выводы
В этом уроке мы научились ограничивать выборку с помощью оператора LIMIT
. Это помогает работать с таблицами, в которых слишком много данных.
При этом нужно не забывать о сортировке данных - без нее оператор LIMIT
на практике не используется. А чтобы выбрать записи не с начала таблицы, нужно воспользоваться смещением OFFSET
.
Дополнительные материалы
Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.