Сортировка по нескольким столбцам
Некоторые игры стоят одинаково: Pixel Racer, Ocean Deep и Bakery Story стоят по $15. Если сортировать по цене, они равны между собой, и в каком порядке они пойдут, решает база данных. Как и порядок строк без ORDER BY, он не гарантирован.
Чтобы развести такие строки, добавьте через запятую второй столбец. Строки сортируются по первому столбцу, а строки с одинаковым значением в нём — по второму:
SELECT title, price
FROM games
ORDER BY price, title;| title | price |
|---|---|
| Cube Logic | 5 |
| Word Quest | 10 |
| Bakery Story | 15 |
| Ocean Deep | 15 |
| Pixel Racer | 15 |
| … | … |
Теперь три игры за $15 идут по алфавиту. Если двух столбцов мало, добавьте третий и так далее. Столбец, значения которого никогда не повторяются, например id, разводит любые строки наверняка.
У каждого столбца своё направление. DESC относится только к столбцу, за которым стоит: ORDER BY price DESC, title сортирует цены от самой высокой, а игры с одинаковой ценой всё равно идут от A к Z. Чтобы оба столбца шли по убыванию, напишите DESC после каждого из них: ORDER BY price DESC, title DESC.
Типичная ошибка — ждать, что один DESC в конце относится ко всем столбцам. В запросе ORDER BY age_rating, title DESC возрастные рейтинги по-прежнему идут от самого низкого; только названия игр с одинаковым рейтингом идут от Z к A.
Можно сортировать и по столбцу, которого нет в результате. Этот запрос показывает только имена клиентов, начиная с зарегистрировавшегося последним. Порядок такой же, как во втором запросе предыдущего упражнения, только без дат:
SELECT name
FROM customers
ORDER BY joined DESC;| name |
|---|
| Max Baker |
| Sophie Adams |
| Henry Scott |
| … |
Задание
- 1
Покажите имя и город каждого клиента, отсортировав по городу, а клиентов из одного города — по имени. Клиенты без города идут первыми:
name city Ava Green NULL Henry Scott NULL Max Baker Bristol Mia Lewis Bristol … … - 2
Ниже покажите жанр, название и цену каждой игры, отсортировав по жанру от A до Z, а игры каждого жанра — от самой дорогой:
genre title price Action Robot Rebellion 40 Action Star Pilots 35 Action Zombie Town 30 … … … - 3
Наконец, покажите номер клиента и номер каждого заказа (столбцы
customer_idиidтаблицыorders, именно в таком порядке). Отсортируйте заказы по номеру клиента, а заказы каждого клиента — от самого нового. Порядок определяет столбецordered_at, но показывать его не нужно:customer_id id 1 26 1 14 1 4 1 1 … …