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

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