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 |
Посмотри внимательно на таблицу – ее строки отсортированы по названию бренда (алфавитный порядок), а строки с одинаковым названием бренда отсортированы по убыванию количества продуктов (последняя колонка).