4.1 LIMIT

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

SQL позволяет очень легко ограничить количество строк в результате запроса с помощью ключевого слова LIMIT. Это ключевое слово используется в самом конце SQL-запроса и имеет вид:


LIMIT количество
        

Давай напишем запрос к таблице product, которая содержит список продуктов нашего магазина. Но так как у нас очень успешный магазин и продуктов мы продаем очень много, то хотим получить только первые 10 строк ответа. Вот как этот запрос будет выглядеть:


SELECT * FROM product 
LIMIT 10
        

И получим такой результат запроса:

id name brand price count
1 Стол IKEA 20.00 15
2 Стул IKEA 5.00 45
3 Диван IKEA 80.00 10
4 Кровать IKEA 75.00 10
5 Шкаф Bosh 125.00 15
6 Полка Полка 25.00 114
7 Телевизор LG 350.00 4
8 Лампа LG 15.00 100
9 Комод IKEA 99.00 10
10 Плита Bosh 199.00 10

Теперь запросим только первые 5 строк. Вот как этот запрос будет выглядеть:


SELECT * FROM product 
LIMIT 5
        

Получим такой результат запроса:

id name brand price count
1 Стол IKEA 20.00 15
2 Стул IKEA 5.00 45
3 Диван IKEA 80.00 10
4 Кровать IKEA 75.00 10
5 Шкаф Bosh 125.00 15

4.2 OFFSET

В предыдущий раз мы научились ограничивать количество строк в ответе сервера. И теперь вместо тысяч строк из таблицы product можем получить 10 первых строк и отобразить их пользователю. Это отлично. Но как нам отобразить вторые 10 строк? А третьи?

Если мы будем писать LIMIT 20, или LIMIT 30, разве сервер не вернет 20 и 30 строк соответственно?

Именно на этот случай у SQL есть специальное ключевое слово OFFSET с помощью которого можно попросить сервер пропустить N строк в его ответе. Это ключевое слово используется в самом конце SQL-запроса (после LIMIT) и имеет вид:


OFFSET количество
        

Давай напишем запрос к таблице product и попробуем получить записи с 11 по 15. Другими словами мы просим сервер вернуть нам 5 строк, но сначала пропустить первые 10 строк ответа. Вот как этот запрос будет выглядеть:


SELECT * FROM product 
LIMIT 5
OFFSET 10
        

Получим такой результат запроса:

id name brand price count
11 Кресло Bosh 44.00 8
12 Вазон SmartFlower 99.00 9
13 Подставка IKEA 100.00 10

Сервер вернул всего 3 строки, а значит в нашей таблице всего было 13 строк. Сервер пропустил первые 10 и вернул следующие 5.

4.3 SELECT DISTINCT

Есть еще одно полезное ключевое слов – это DISTINCT. Оно используется, когда в таблице есть дублирующиеся записи и мы хотим удалить дубликаты.

Откуда же взяться в нашей таблице дубликатам? В таблице дубликатов может и не быть, а вот в результате запроса – легко. Давай напишем запрос, который вернет бренды всех товаров, которые мы продаем. Вот как этот запрос будет выглядеть:


SELECT brand FROM product 
        

Получим такой результат запроса:

brand
IKEA
IKEA
IKEA
IKEA
Bosh
Bosh
LG
LG
IKEA
Bosh
Bosh
SmartFlower
IKEA

Несложно увидеть, что в этой таблице есть строки-дубликаты. Именно чтобы дубликатов не было и нужно использовать ключевое слово DISTINCT. Вот как будет выглядеть исправленные запрос:


SELECT DISTINCT brand 
FROM product 
        

Получим такой результат запроса:

brand
IKEA
Bosh
LG
SmartFlower

Так гораздо лучше. Неправда ли? ;)

4.4 ORDER BY

И наконец мы добрались до сортировки. Для того чтобы отсортировать результаты запроса нужно использовать ключевое слово ORDER BY. Технически – это два слова, но не суть важно. Слова два, а оператор один.

Писать его нужно после ключевого слова WHERE, но перед LIMIT и OFFSET. Если ты напишешь ORDER BY после LIMIT, то SQL-сервер просто вернет тебе ошибку.

В общем виде выглядит этот оператор так:


ORDER BY колонка порядок

Где колонка – это имя колонки в таблице / результате сортировки. А порядок – это порядок сортировки.

Порядок сортировки может быть трех вариантов:

  • ASC (от Ascending) – по возрастанию;
  • DESC (от Descending) – по убыванию;
  • Не указан – будет использован ASC

Давай напишем запрос, который вернет нам список продуктов, отсортированных по возрастанию цены. Вот как этот запрос будет выглядеть:


SELECT * FROM product 
ORDER BY price ASC
LIMIT 10
        

Получим такой результат запроса:

id name brand price count
2 Стул IKEA 5.00 45
8 Лампа LG 15.00 100
1 Стол IKEA 20.00 15
6 Полка Bosh 25.00 114
11 Кресло Bosh 44.00 8
4 Кровать IKEA 75.00 10
3 Диван IKEA 80.00 10
12 Вазон SmartFlower 99.00 9
9 Комод IKEA 99.00 10
13 Подставка IKEA 100.00 10

Тот же результат мы получим, если не укажем порядок сортировки – пропустим слово ASC.

4.5 ORDER BY по нескольким колонкам

Оператор ORDER BY позволяет отсортировать результат по нескольким колонкам. Это бывает очень полезно, когда в первой колонке очень много повторяющихся элементов. Общий вид этого оператора такой:


ORDER BY колонка1 порядок1, колонка2 порядок2, колонка3 порядок3

        

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

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


SELECT * FROM product 
ORDER BY brand ASC, count
DESC
        

Получим такой результат запроса:

id name brand price count
6 Полка Bosh 25.00 114
5 Шкаф Bosh 125.00 15
10 Плита Bosh 199.00 10
11 Кресло Bosh 44.00 8
2 Стул IKEA 5.00 45
1 Стол IKEA 20.00 15
9 Комод IKEA 99.00 10
13 Подставка IKEA 100.00 10
4 Кровать IKEA 75.00 10
3 Диван IKEA 80.00 10
8 Лампа LG 15.00 100
7 Телевизор LG 350.00 4
12 Вазон SmartFlower 99.00 9

Посмотри внимательно на таблицу – ее строки отсортированы по названию бренда (алфавитный порядок), а строки с одинаковым названием бренда отсортированы по убыванию количества продуктов (последняя колонка).

undefined
1
Задача
Модуль 4. Работа с БД, 1 уровень, 3 лекция
Недоступна
task0128
Выбрать все колонки (используй *) из таблицы car. Выбрать нужно только первых три записи. Нужно использовать: LIMIT
undefined
1
Задача
Модуль 4. Работа с БД, 1 уровень, 3 лекция
Недоступна
task0129
Выбрать все колонки (используй *) из таблицы car. Выбрать нужно только первых одиннадцать записей. Нужно использовать: LIMIT
undefined
1
Задача
Модуль 4. Работа с БД, 1 уровень, 3 лекция
Недоступна
task0130
Выбрать колонки brand, model, quantity (в указанном порядке) из таблицы car. Выбрать нужно только первых 115 записей. Нужно использовать: LIMIT
undefined
1
Задача
Модуль 4. Работа с БД, 1 уровень, 3 лекция
Недоступна
task0131
Выбрать все колонки (используй *) из таблицы ip2country. При выборе пропустить первых 50 строк. Нужно использовать: OFFSET
undefined
1
Задача
Модуль 4. Работа с БД, 1 уровень, 3 лекция
Недоступна
task0132
Выбрать колонки country_code, ip_from, ip_to (в указанном порядке) из таблицы ip2country. При выборе пропустить первых 78 строк. Нужно использовать: OFFSET
undefined
1
Задача
Модуль 4. Работа с БД, 1 уровень, 3 лекция
Недоступна
task0133
Выбрать колонки country_code, ip_from, ip_to (в указанном порядке) из таблицы ip2country. При выборе пропустить первых 33 строки. Выбрать нужно только 12 строк. Нужно использовать: LIMIT и OFFSET
undefined
1
Задача
Модуль 4. Работа с БД, 1 уровень, 3 лекция
Недоступна
task0134
Выбрать все колонки (используй *) из таблицы ip2country. При выборе пропустить первых 62 строки. Выбрать нужно только 7 строк. Нужно использовать: LIMIT и OFFSET
undefined
1
Задача
Модуль 4. Работа с БД, 1 уровень, 3 лекция
Недоступна
task0135
Выбрать колонки country_code, ip_from, ip_to (в указанном порядке) из таблицы ip2country у которых country_code равен DE При выборе пропустить первых 3 строки. Выбрать нужно только 5 строк. Нужно использовать: WHERE, LIMIT и OFFSET
undefined
1
Задача
Модуль 4. Работа с БД, 1 уровень, 3 лекция
Недоступна
task0136
Выбрать все уникальные значения колонки country_code из таблицы ip2country Нужно использовать: DISTINCT
undefined
1
Задача
Модуль 4. Работа с БД, 1 уровень, 3 лекция
Недоступна
task0137
Выбрать все уникальные значения колонки country_name из таблицы ip2country, у которых в названии (колонка country_name) нет символа пробел. Нужно использовать: DISTINCT, WHERE и NOT LIKE
undefined
1
Задача
Модуль 4. Работа с БД, 1 уровень, 3 лекция
Недоступна
task0138
Выбрать все колонки (используй *) из таблицы ip2country. Результат отсортируй по колонке ip_from. Нужно использовать: ORDER BY
undefined
1
Задача
Модуль 4. Работа с БД, 1 уровень, 3 лекция
Недоступна
task0139
Выбрать колонки country_code, ip_from, ip_to (в указанном порядке) из таблицы ip2country. Результат отсортируй по колонке ip_from в возрастающем порядке. Выбрать нужно только 17 строк. Нужно использовать: ORDER BY, ASC, LIMIT
undefined
1
Задача
Модуль 4. Работа с БД, 1 уровень, 3 лекция
Недоступна
task0140
Выбрать колонки ip_from, ip_to, country_name (в указанном порядке) из таблицы ip2country. Результат отсортируй по колонке ip_to в убывающем порядке. При выборе пропустить первых 74 строки. Нужно использовать: ORDER BY, DESC, OFFSET
undefined
1
Задача
Модуль 4. Работа с БД, 1 уровень, 3 лекция
Недоступна
task0141
Выбрать все колонки (используй *) из таблицы parts. Результат отсортируй по полю required по убыванию, и по полю id по возрастанию. Нужно использовать: ORDER BY, DESC, ASC
undefined
1
Задача
Модуль 4. Работа с БД, 1 уровень, 3 лекция
Недоступна
task0142
Выбрать колонки id, identifier, description (в указанном порядке) из таблицы parts. Результат отсортируй по полю identifier по убыванию, по полю required по убыванию и по полю description по возрастанию. Нужно использовать: ORDER BY, DESC, ASC
undefined
1
Задача
Модуль 4. Работа с БД, 1 уровень, 3 лекция
Недоступна
task0143
Выбрать колонки id, identifier, description (в указанном порядке) из таблицы parts. Результат отсортируй по полю identifier по возрастанию, по полю required по убыванию и по полю description по убыванию. Выбрать только первых 7 строк. Нужно использовать: ORDER BY, DESC, ASC, LIMIT
undefined
1
Задача
Модуль 4. Работа с БД, 1 уровень, 3 лекция
Недоступна
task0144
Выбрать колонку description из таблицы parts. Результат отсортируй по полю required по убыванию, по полю identifier по убыванию и по полю description по убыванию. Пропусти первых 23 строки. Нужно использовать: ORDER BY, DESC, OFFSET