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 | Шкаф | Bosch | 125.00 | 15 |
| 6 | Полка | Полка | 25.00 | 114 |
| 7 | Телевизор | LG | 350.00 | 4 |
| 8 | Лампа | LG | 15.00 | 100 |
| 9 | Комод | IKEA | 99.00 | 10 |
| 10 | Плита | Bosch | 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 | Шкаф | Bosch | 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 | Кресло | Bosch | 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 |
| Bosch |
| Bosch |
| LG |
| LG |
| IKEA |
| Bosch |
| Bosch |
| SmartFlower |
| IKEA |
Несложно увидеть, что в этой таблице есть строки-дубликаты. Именно чтобы дубликатов не было и нужно использовать ключевое слово DISTINCT. Вот как будет выглядеть исправленные запрос:
SELECT DISTINCT brand
FROM product
Получим такой результат запроса:
| brand |
|---|
| IKEA |
| Bosch |
| 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 | Полка | Bosch | 25.00 | 114 |
| 11 | Кресло | Bosch | 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 | Полка | Bosch | 25.00 | 114 |
| 5 | Шкаф | Bosch | 125.00 | 15 |
| 10 | Плита | Bosch | 199.00 | 10 |
| 11 | Кресло | Bosch | 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 |
Посмотри внимательно на таблицу – ее строки отсортированы по названию бренда (алфавитный порядок), а строки с одинаковым названием бренда отсортированы по убыванию количества продуктов (последняя колонка).
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ