Уникальные значения с DISTINCT
Какие жанры есть в магазине? SELECT genre FROM games; даёт 20 строк, по одной на каждую игру, и большинство жанров встречаются там по нескольку раз. DISTINCT сразу после SELECT оставляет каждую отличающуюся строку только один раз:
SELECT DISTINCT genre
FROM games
ORDER BY genre;| genre |
|---|
| Action |
| Adventure |
| Puzzle |
| RPG |
| Racing |
| Simulation |
| Sports |
| Strategy |
Восемь жанров вместо двадцати строк. Сам DISTINCT ничего не сортирует: жанры идут по алфавиту благодаря ORDER BY, а без него они могли бы идти в любом порядке. (RPG стоит раньше Racing, потому что заглавные буквы идут раньше строчных, как вы видели в начале этого урока.)
Если столбцов несколько, DISTINCT убирает только те строки, которые совпадают во всех столбцах. По каким ценам продавалась каждая игра?
SELECT DISTINCT game_id, price
FROM order_items
ORDER BY game_id, price;| game_id | price |
|---|---|
| 1 | 40 |
| 2 | 15 |
| 3 | 20 |
| 4 | 30 |
| 5 | 15 |
| 5 | 25 |
| … | … |
Большинство игр встречаются один раз, но некоторые дважды, например игра 5, Shadow Ninja: её продавали за $25, а в «чёрную пятницу» — за $15. Важно сочетание значений в строке, а не каждый столбец сам по себе. NULL тоже считается значением: если у нескольких строк NULL, DISTINCT оставит одну из них.
DISTINCT пишется один раз, сразу после SELECT, и относится ко всей строке. Типичная ошибка — поставить его перед одним из столбцов. SELECT game_id, DISTINCT price FROM order_items; заканчивается ошибкой near "DISTINCT": syntax error.
Задание
- 1
Запрос в редакторе показывает город каждого клиента, и города повторяются. Измените его так, чтобы каждый город встречался один раз, в алфавитном порядке. Клиенты без города добавляют ещё одну строку,
NULL:city NULL Bristol Leeds London Manchester - 2
Ниже покажите номера клиентов, которые что-нибудь заказывали: столбец
customer_idтаблицыorders, каждый номер один раз, от самого маленького. Клиентов с номерами 12 и 14 там не будет, потому что они ни разу ничего не заказывали:customer_id 1 2 3 4 … - 3
Наконец, выясните, какие возрастные рейтинги есть у каждого жанра: покажите каждое сочетание
genreиage_ratingтолько один раз, отсортировав по жанру, а затем по возрастному рейтингу:genre age_rating Action 12 Action 16 Action 18 Adventure 7 … …