SQL JOIN: INNER и LEFT JOIN на примере
JOIN соединяет строки таблиц по условию ON. INNER JOIN оставляет только совпавшие пары, а LEFT JOIN сохраняет все строки слева и добавляет данные справа, если совпадение найдено. Для отсутствующей связанной записи поля правой таблицы будут NULL.
Подготовить таблицы и выполнить JOIN
CREATE TEMP TABLE customers (id int, name text);
CREATE TEMP TABLE orders (id int, customer_id int, total numeric);
INSERT INTO customers VALUES (1, 'Ира'), (2, 'Антон');
INSERT INTO orders VALUES (10, 1, 120), (11, 1, 80);
SELECT c.name, o.id AS order_id, o.total
FROM customers c
INNER JOIN orders o ON o.customer_id = c.id
ORDER BY o.id;Результат INNER JOIN содержит две строки Иры; Антон без заказа в выборку не попадёт.
Показать также клиентов без заказов
WITH customers(id, name) AS (VALUES (1, 'Ира'), (2, 'Антон')),
orders(id, customer_id, total) AS (VALUES (10, 1, 120), (11, 1, 80))
SELECT c.name, o.id AS order_id, o.total
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
ORDER BY c.id, o.id;У Антона order_id и total будут NULL. Чтобы оставить только строки без заказа, добавьте WHERE o.id IS NULL.
Тип | Какие строки сохраняет |
|---|---|
| Только строки с совпадением с обеих сторон |
| Все строки слева и совпавшие справа |
| Все строки обеих таблиц, если СУБД поддерживает |
Как соединить три таблицы?
Добавьте второй JOIN с отдельным условием ON, связывающим ключи следующей таблицы. Проверяйте, что отношение не размножает строки неожиданно.
Почему после JOIN стало больше строк?
Вероятно, справа несколько совпадений на одну левую строку. Проверьте уникальность ключа и ожидаемую кардинальность связи.