Все строки с LEFT JOIN
JOIN отбрасывает строки без пары: в списке клиентов с их заказами нет ни Henry Scott, ни Max Baker. Но часто нужны все строки одной таблицы, есть у них пара или нет. Для этого и нужен LEFT JOIN:
SELECT c.name, o.id, o.ordered_at
FROM customers AS c
LEFT JOIN orders AS o ON o.customer_id = c.id
ORDER BY o.ordered_at, c.name;| name | id | ordered_at |
|---|---|---|
| Henry Scott | NULL | NULL |
| Max Baker | NULL | NULL |
| Emma Clark | 1 | 2024-01-20 |
| Liam Turner | 2 | 2024-02-14 |
| … | … | … |
Таблица перед LEFT JOIN, здесь customers, — это левая таблица, а таблица после него — правая. LEFT JOIN сохраняет каждую строку левой таблицы. Строки, у которых есть пара, соединяются так же, как при JOIN. Строка без пары остаётся в результате один раз, а столбцы правой таблицы в ней равны NULL: у Henry Scott нет заказа, поэтому идентификатор и дата его заказа равны NULL. А поскольку при сортировке NULL идёт первым, клиенты без заказов оказываются вверху.
Теперь важно, какая таблица стоит первой. FROM orders AS o LEFT JOIN customers AS c … сохраняет каждый заказ, и так как у каждого заказа есть клиент, это не даёт ничего сверх обычного JOIN. Ставьте первой ту таблицу, строки которой хотите сохранить. Вам может встретиться и LEFT OUTER JOIN — это то же самое.
Есть ещё RIGHT JOIN, который сохраняет каждую строку правой таблицы, и FULL JOIN, который сохраняет строки обеих. В SQLite есть оба, но они редко нужны: RIGHT JOIN — это LEFT JOIN с поменянными местами таблицами, и большинство программистов пишут LEFT JOIN.
Осторожно, когда после LEFT JOIN присоединяется ещё одна таблица. Допустим, вам нужны ещё и названия игр в заказах каждого клиента, и вы добавляете JOIN order_items AS i ON i.order_id = o.id. У Henry Scott o.id равен NULL, а NULL не равен ничему, поэтому для его строки не находится ни одной позиции, и обычный JOIN снова выбрасывает её. Таблице, которая присоединяется к правой таблице LEFT JOIN, обычно тоже нужен LEFT JOIN.
Задание
- 1
Покажите каждую игру со звёздами её отзывов, включая игры, о которых никто не написал:
titleиstars, отсортированные поtitle, затем поstarsот большего к меньшему. У Castle Siege нет отзывов, поэтому звёзды у неё равны NULL:title stars Bakery Story 4 Castle Siege NULL Cube Logic 5 Cube Logic 3 … … - 2
Ниже выведите каждого клиента с названиями игр, на которые он написал отзывы:
nameиtitleиз трёх таблиц —customers,reviewsиgames. Клиенты, которые ничего не оценили, должны остаться в результате. Отсортируйте строки поtitle, затем поname:name title Henry Scott NULL Max Baker NULL Mia Lewis Bakery Story Emma Clark Cube Logic Olivia Brown Cube Logic Ava Green Dragon Forge … …