Написать пост

Ограничиваем выдачу в SQL. SQL — это просто

Аватарка пользователя Slava Rozhnev

Как команда SQL LIMIT позволяет ограничить количество строк возвращаемых запросом. Объясняем на примерах и задачках.

Обложка поста Ограничиваем выдачу в SQL. SQL — это просто

Продолжаем изучение английского (SQL) начатое там и тут. Если вы прочитали эти статьи и выполнили тесты здесь, то вы уже знаете пять слов из лексикона дата-инженеров. Вспомним их:

  • SELECT – выбрать;
  • FROM – из таблицы;
  • ORDER BY – отсортировать по;
  • ASC – возрастанию;
  • DESC – убыванию.

Используя этот ограниченный лексикон вы можете извлекать данные из таблиц базы данных в нужном вам порядке. В этой статье введём еще одно слово – LIMIT – ограничение. Данное ключевое слово позволяет нам ограничить количество строк возвращаемых запросом. Снова обратимся к нашей таблице студентов и напишем следующий запрос:

			SELECT * FROM students LIMIT 1;
		

Выполнив его мы получим следующий результат:

			|---------------|--------|-------|
| name          | course | score |
|---------------|--------|-------|
| Сергей Петров | Физика | 5     |
		

Как видите сервер вернул нам одну строку из таблицы. Почему именно эту? Мы не указали в нашем запросе ничего относительно того какую строку нам нужно и сервер сделал это на свое усмотрение. Возможно в следующий раз этот же запрос вернёт другую запись и тоже будет прав. Ведь в случае если запрос не формулирует чёткого требования к серверу он волен поступать по своему разумению (точнее по разумению разработчиков серверной программы).

Что можно сделать чтобы быть уверенным в результате такого запроса? Можно скомбинировать команду LIMIT с уже известной вам командой сортировки ORDER BY.

			SELECT * FROM students ORDER BY score ASC LIMIT 1;
		

Этот запрос сначала отсортирует ВСЕ ЗАПИСИ в таблице по возрастанию оценок и затем вернет нам одну (первую) запись из этого списка. То есть мы получим запись студента с минимальной оценкой.

			|--------------|------------|-------|
| name         | course     | score |
|--------------|------------|-------|
| Илья Краснов | Литература | 3     |
		

Если таких студентов несколько то результатом всё равно будет одна строка. Для того чтобы уточнить желаемый результат мы можем добавить ещё один уровень сортировки. Например в случае равных оценок взять первого по алфавиту студента. Мы уже использовали такую многоступенчатую сортировку на прошлом уроке. Напомню что каждый следующий уровень сортировки работает только если предыдущий дал одинаковый результат для нескольких строк.

			SELECT * FROM students ORDER BY score ASC, name ASC LIMIT 1;
		
			|-------------|--------|-------|
| name        | course | score |
|-------------|--------|-------|
| Илья Долгов | Физика | 3     |
		

Применив это новое слово вы сможете пройти этот тест.

Ещё несколько примеров.

Чтобы найти трёх лучших по успеваемости студентов нужно выполнить запрос:

			SELECT * FROM students ORDER BY score DESC LIMIT 3;
		

А для поиска трёх отстающих – нужно поменять порядок сортировки на противоположный:

			SELECT * FROM students ORDER BY score ASC LIMIT 3;
		

Таким образом ключевое слово лимит позволяет ограничивать выдачу заданным количеством строк. А что делать в случае если нам нужно найти четвёртого студента в списке? Тут придется выучить ещё одно слово – OFFSET.

OFFSET переводится с английского как отступ, а в SQL позволяет ограничить выдачу сверху. Вот пример для выборки четвёртого по алфавиту студента:

			SELECT * FROM students ORDER BY name ASC LIMIT 1 OFFSET 3;
		

При выполнении этого запроса база данных снова отсортирует все записи в таблице students по полю name в алфавитном порядке, пропустит первых три записи и выдаст одну (четвёртую) в соответствии с введённым запросом.

Попробуйте воспользоваться этим для решения тестов 4 и 5.

Кроме выполнения тестов Вы можете свободно экспериментировать с SQL запросами на площадке SQLize.online а если возникли вопросы спросить профессионалов в нашем чате.

Если вам всё понятно и задания не вызвали затруднений переходите к следующей теме.

Следите за новыми постами
Следите за новыми постами по любимым темам
457 открытий1К показов