Не хотите, чтобы в результатах запроса возвращались все записи? Возможно, вам понадобится разбивка на страницы для набора результатов или веб-приложения… Многие из этих требований можно выполнить, применив к запросу предложение LIMIT. Давайте посмотрим на несколько примеров здесь, в MySQL ...

Примечание: все данные, имена или наименования, найденные в базе данных, представленной в этом посте, строго используются для практики, обучения, обучения и тестирования. Он ни в коем случае не отображает фактические данные, принадлежащие или используемые какой-либо стороной или организацией.
Используемая ОС и БД:

  • Xubuntu Linux 16.04.5 LTS (Xenial Xerus)
  • MySQL 5.7.23

При работе с большими наборами данных может наступить момент, когда вы не захотите возвращать все строки результатов запроса. Может быть, результаты огромны. Или, возможно, вы хотите просто «почувствовать» данные, не опасаясь чрезмерной загрузки в память.

В SQL (включая MySQL) есть пункт, помогающий в этом. В этих случаях (среди прочих) используйте предложение LIMIT, чтобы контролировать количество возвращаемых строк.
Примеры таблиц, используемых в этом сообщении в блоге, являются частью практики База данных Sakila.

У нас есть customer таблица с этими столбцами:

mysql> DESC customer;
+-------------+----------------------+------+-----+-------------------+-----------------------------+
| Field       | Type                 | Null | Key | Default           | Extra                       |
+-------------+----------------------+------+-----+-------------------+-----------------------------+
| customer_id | smallint(5) unsigned | NO   | PRI | NULL              | auto_increment              |
| store_id    | tinyint(3) unsigned  | NO   | MUL | NULL              |                             |
| first_name  | varchar(45)          | NO   |     | NULL              |                             |
| last_name   | varchar(45)          | NO   | MUL | NULL              |                             |
| email       | varchar(50)          | YES  |     | NULL              |                             |
| address_id  | smallint(5) unsigned | NO   | MUL | NULL              |                             |
| active      | tinyint(1)           | NO   |     | 1                 |                             |
| create_date | datetime             | NO   |     | NULL              |                             |
| last_update | timestamp            | NO   |     | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
+-------------+----------------------+------+-----+-------------------+-----------------------------+
9 rows in set (0.00 sec)

Я начну с запроса, чтобы проверить, сколько строк в таблице customer:

mysql> SELECT COUNT(*) FROM customer;
 + — — — — — +
 | COUNT(*)  |
 + — — — — — +
 | 599       |
 + — — — — — +
 1 row in set (0.00 sec)

Хотя эта отдельная таблица не содержит тысяч или сотен тысяч строк, если это так, то здесь может оказаться полезным предложение LIMIT.

Возьмите этот общий вопрос:

mysql> SELECT first_name
    -> FROM customer

Хотя этот оператор является неполным (и может возникнуть ошибка, если я не поставлю точку с запятой (;)), если я буду запускать его без предложения WHERE для возможной фильтрации на основе данных столбца, все записи будут возвращены.
Может быть, только вы. хочу 5 рядов. Даже если предложение WHERE используется для фильтрации данных.

Вот пример того, как предложение LIMIT управляет количеством возвращаемых строк:

mysql> SELECT first_name
    -> FROM customer 
    -> LIMIT 5;
 + — — — — — — +
 | first_name  |
 + — — — — — — +
 | MARY        |
 | PATRICIA    |
 | LINDA       |
 | BARBARA     |
 | ELIZABETH   |
 + — — — — — — +
 5 rows in set (0.03 sec)

В отношении LIMIT стоит отметить два момента. Предложение LIMIT - последнее выполненное предложение. Кроме того, важно отметить, что потенциально запрос может возвращать даже меньше строк, чем это число, указанное в указанном предложении LIMIT. Например, вы указываете LIMIT 5, но набор результатов возвращает только 3 записи из-за других фильтров (например, предложений WHERE и / или HAVING), уже выполненных в порядке операций.

Давайте подкрепимся примером запроса:

mysql> SELECT first_name
    -> FROM customer
    -> WHERE first_name LIKE ‘Y%’
    -> LIMIT 5;
 + — — — — — — +
 | first_name  |
 + — — — — — — +
 | YVONNE      |
 | YOLANDA     |
 + — — — — — — +
 2 rows in set (0.01 sec)

Чтобы лучше понять это, взгляните на тот же запрос, но без предложения LIMIT:

mysql> SELECT first_name
    -> FROM customer
    -> WHERE first_name LIKE ‘Y%’;
 + — — — — — — +
 | first_name  |
 + — — — — — — +
 | YVONNE      |
 | YOLANDA     |
 + — — — — — — +
 2 rows in set (0.00 sec)

В этих результатах запроса не более 2 строк, доступных LIMIT для "действия".

Мини-информационный / образовательный ресурс:

В приведенный ниже список я включил ссылки на отличные сообщения в блогах о порядке выполнения SQL-запросов, которые я считаю очень образовательными и интересными.

Часто встречающееся приложение LIMIT используется для возврата набора результатов «верхняя строка (и)»: например, 10 самых дорогих товаров, 5 дней самых продаваемых товаров, 3 товара с самыми низкими ценами. Тем не менее, LIMIT здесь нужна помощь из пункта ORDER BY.

Для этого типа запроса предложение ORDER BY используется для упорядочивания столбца (или столбцов) в ASC (по возрастанию - по умолчанию) или DESC (по убыванию).

Чтобы пояснить, давайте рассмотрим пример запроса. Возьмите столбец amount из таблицы payment.
Предположим, мы хотим, чтобы самые высокие 5 amount значений были упорядочены от наибольшего к наименьшему.
Этот запрос позаботится об этом, но запретит дубликатам занимать верхние позиции в набор результатов, я использую предложение DISTINCT в столбце amount.

mysql> SELECT DISTINCT amount
    -> FROM payment
    -> ORDER BY amount DESC
    -> LIMIT 5;
 + — — — — +
 | amount  |
 + — — — — +
 | 11.99   |
 | 10.99   |
 | 9.99    |
 | 9.98    |
 | 8.99    |
 + — — — — +
 5 rows in set (0.04 sec)

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

Значение OFFSET.
См. Пример в этом запросе:

mysql> SELECT distinct amount
    -> FROM payment
    -> ORDER BY amount DESC
    -> LIMIT 1, 5;
 + — — — — +
 | amount  |
 + — — — — +
 | 10.99   |
 | 9.99    |
 | 9.98    |
 | 8.99    |
 | 8.97    |
 + — — — — +
 5 rows in set (0.04 sec)

При включении значения OFFSET (для нашего запроса 1) это значение представляет собой смещение от первой строки набора результатов, которое начинается с 0 (нуля).
В приведенном выше запросе строки возвращаются, начиная с первая строка набора результатов.

Допустимый синтаксис может заключаться в явном предоставлении OFFSET значения 0, что идентично отсутствию значения вообще:

mysql> SELECT DISTINCT amount
    -> FROM payment
    -> ORDER BY amount DESC
    -> LIMIT 0, 5;
 + — — — — +
 | amount  |
 + — — — — +
 | 11.99   |
 | 10.99   |
 | 9.99    |
 | 9.98    |
 | 8.99    |
 + — — — — +
 5 rows in set (0.07 sec)

Необязательно, указание OFFSET в качестве собственной команды разрешено в MySQL для совместимости с PostgreSQL.

mysql> SELECT distinct amount
    -> FROM payment
    -> ORDER BY amount DESC
    -> LIMIT 5
    -> OFFSET 1;
 + — — — — +
 | amount  |
 + — — — — +
 | 10.99   |
 | 9.99    |
 | 9.98    |
 | 8.99    |
 | 8.97    |
 + — — — — +
 5 rows in set (0.04 sec)

Прежде чем закрыть сообщение в блоге, я должен упомянуть, что оба параметра для предложения LIMIT должны быть положительными целочисленными константами.

Я включил источники для расширенного изучения и чтения в список ниже. Не стесняйтесь оставлять любые комментарии, мысли, лайки, антипатии или исправления в комментариях ниже. Спасибо за чтение.

Дополнительная литература и ресурсы:

Изучите официальное Онлайн-руководство по MySQL 5.7 для получения дополнительной информации.

Призыв к действию!

Спасибо, что нашли время прочитать этот пост. Я искренне надеюсь, что вы открыли для себя что-то интересное и поучительное. Пожалуйста, поделитесь своими выводами здесь с кем-нибудь, кого вы знаете, кто тоже получит от этого такую ​​же ценность.

Посетите страницу Портфолио-проекты, чтобы увидеть сообщения в блоге / технические статьи, которые я написал для клиентов.

Я уже упоминал, как я люблю чашку кофе?!?!

Чтобы получать уведомления по электронной почте (Никогда не спамить) от этого блога (Проза Цифровой Совы) о последних публикациях в блоге по мере их публикации, пожалуйста, подпишитесь (по собственному желанию), нажав кнопку Нажмите, чтобы подписаться! На странице боковая панель на главной странице! (Не стесняйтесь в любое время просмотреть страницу Политики конфиденциальности Digital Owl's Prose по любым вопросам, которые могут у вас возникнуть: обновления по электронной почте, подписка, отказ, контактные формы и т. Д.)

Обязательно посетите страницу Best Of, где собраны мои лучшие сообщения в блоге.

Джош Отвелл хочет учиться и расти как разработчик SQL и блогер. Другие любимые занятия находят его, уткнувшись носом в хорошую книгу, статью или командную строку Linux. Среди них он разделяет любовь к настольным ролевым играм, чтению фэнтезийных романов и проведению времени с женой и двумя дочерьми.

Отказ от ответственности: примеры, представленные в этом посте, представляют собой гипотетические идеи о том, как достичь аналогичных результатов. Это не самое лучшее решение. Большинство, если не все, из представленных примеров выполняются на рабочей станции-среде личного развития / обучения и не должны считаться производственными или готовыми к использованию. Ваши конкретные цели и потребности могут отличаться. Используйте те методы, которые лучше всего подходят для ваших нужд и целей. Мнения мои собственные.

Первоначально опубликовано на joshuaotwell.com 5 сентября 2018 г.

✉️ Подпишитесь на рассылку еженедельно Email Blast от CodeBurst 🐦 Подпишитесь на CodeBurst на Twitter , просмотрите 🗺️ Дорожная карта веб-разработчиков на 2018 год и 🕸️ Изучите веб-разработку с полным стеком .