Соединения с WHERE и ORDER BY
Соединение сочетается со всем, что вы знаете: WHERE, ORDER BY, LIMIT и функциями. WHERE и ORDER BY стоят после соединений и могут использовать столбцы всех соединённых таблиц. Какие игры были в возвращённых заказах?
SELECT o.id, o.ordered_at, g.title
FROM order_items AS i
JOIN orders AS o ON i.order_id = o.id
JOIN games AS g ON i.game_id = g.id
WHERE o.status = 'refunded'
ORDER BY o.ordered_at, g.title;| id | ordered_at | title |
|---|---|---|
| 7 | 2024-06-01 | Shadow Ninja |
| 18 | 2025-03-28 | Galaxy Trader |
Вспомните из урока о группировке порядок, в котором выполняются части запроса. Первым идёт FROM, теперь уже со всеми своими JOIN: они строят соединённые строки. Затем WHERE оставляет часть из них, а после него идут GROUP BY, HAVING, SELECT, ORDER BY и LIMIT. Поэтому WHERE и ORDER BY видят столбцы каждой соединённой таблицы, показываете вы их или нет. Запрос выше фильтрует по o.status и сортирует по o.ordered_at и работал бы, даже если бы ни того, ни другого не было в SELECT.
Соединение позволяет и сравнивать столбцы двух таблиц друг с другом, чего не может ни один запрос к одной таблице. Какие позиции продали дешевле цены игры в каталоге?
SELECT i.order_id, g.title, g.price AS list_price, i.price AS paid
FROM order_items AS i
JOIN games AS g ON i.game_id = g.id
WHERE i.price < g.price
ORDER BY i.order_id, g.title;| order_id | title | list_price | paid |
|---|---|---|---|
| 28 | Shadow Ninja | 25 | 15 |
| 28 | Zombie Town | 30 | 20 |
Это только две игры из заказа в «Чёрную пятницу». В WHERE полные имена так же важны, как и в SELECT: WHERE price > 20 закончилось бы ошибкой ambiguous column name: price.
Типичная ошибка — WHERE перед JOIN. Порядок частей неизменен: все JOIN относятся к FROM, а WHERE идёт после последнего из них. Иначе вы получите ошибку near "JOIN": syntax error.
Задание
- 1
Какие игры купили клиенты из Leeds? Покажите
nameклиента, дату заказа (ordered_at) иtitleигры, только для клиентов, у которыхcityравен Leeds. Отсортируйте строки поordered_at, затем поtitle:name ordered_at title Noah Wilson 2024-04-02 Castle Siege Noah Wilson 2024-04-02 Galaxy Trader Noah Wilson 2024-12-23 Tiny Kingdoms Isla Young 2025-11-20 Knight's Oath Noah Wilson 2025-12-22 Bakery Story Noah Wilson 2025-12-22 Moon Farm - 2
Ниже найдите заказы, которые клиенты сделали меньше чем через две недели после регистрации в магазине: покажите
nameклиента, день регистрации (joined) и дату заказа (ordered_at) для заказов, у которых разница между двумя датами меньше 14 дней. Используйтеjulianday()из урока о функциях. Отсортируйте строки поordered_at:name joined ordered_at Oscar King 2024-11-30 2024-12-05 Grace Hall 2025-02-12 2025-02-14 Sophie Adams 2025-08-21 2025-08-30