0Pricing
SQL Academy · Урок

LEFT/RIGHT JOIN и внешние соединения

Используйте LEFT JOIN, чтобы сохранять несопоставленные строки, разберитесь с RIGHT и FULL OUTER JOIN и находите отсутствующие данные с помощью WHERE x IS NULL

«LEFT/RIGHT JOIN и внешние соединения» — бесплатный урок SQL Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения SQL Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс SQL Academy содержит 4 уроков всего.

LEFT JOIN: сохранить все строки слева

LEFT JOIN возвращает каждую строку левой таблицы, добавляя соответствующие столбцы правой таблицы или NULL, если соответствия нет.

SELECT u.id, u.email, o.id AS order_id
FROM users u
LEFT JOIN orders o ON o.user_id = u.id;

-- Users without orders still appear, with order_id = NULL.

RIGHT JOIN

Зеркальный вариант LEFT JOIN — сохраняет все строки RIGHT. Для удобства чтения большинство разработчиков просто переписывают RIGHT-соединения как LEFT:

SELECT u.id, u.email, o.id
FROM orders o
RIGHT JOIN users u ON u.id = o.user_id;

-- Equivalent to LEFT JOIN with sides swapped:
SELECT u.id, u.email, o.id
FROM users u
LEFT JOIN orders o ON o.user_id = u.id;

FULL OUTER JOIN

Сохраняет строки с обеих сторон. В столбцах без соответствия находятся NULL:

SELECT u.email, o.id AS order_id
FROM users u
FULL OUTER JOIN orders o ON o.user_id = u.id;

Поиск отсутствующих соответствий

LEFT JOIN с условием WHERE right.id IS NULL находит строки левой таблицы, для которых нет соответствия справа, — это классический «антисоединение»:

SELECT u.id, u.email
FROM users u
LEFT JOIN orders o ON o.user_id = u.id
WHERE o.id IS NULL;        -- users who have never placed an order

LEFT JOIN с агрегатной функцией

Полезно для отчетов, в которых при отсутствии данных нужно показывать «0»:

SELECT u.id, u.email, COUNT(o.id) AS order_count
FROM users u
LEFT JOIN orders o ON o.user_id = u.id
GROUP BY u.id, u.email
ORDER BY order_count DESC;

Позиция фильтра имеет значение

Фильтры по правой таблице в WHERE превращают LEFT JOIN обратно в INNER JOIN. Поместите их в ON, чтобы сохранить поведение LEFT:

-- Drops users without paid orders entirely:
SELECT u.id, COUNT(o.id)
FROM users u
LEFT JOIN orders o ON o.user_id = u.id
WHERE o.status = 'paid'
GROUP BY u.id;

-- Keeps users with no paid orders:
SELECT u.id, COUNT(o.id)
FROM users u
LEFT JOIN orders o
  ON o.user_id = u.id AND o.status = 'paid'
GROUP BY u.id;

Несколько LEFT JOIN

Объединяйте их в цепочку. Каждый LEFT сохраняет строки с левой стороны соответствующего оператора:

SELECT u.email, o.id, p.name
FROM users u
LEFT JOIN orders o   ON o.user_id = u.id
LEFT JOIN products p ON p.id = o.product_id;

Производительность LEFT JOIN

LEFT JOIN немного затратнее INNER, поскольку планировщик должен сохранять строки без соответствий. Обычно разница несущественна, но если строки без соответствий не нужны, INNER JOIN будет немного эффективнее.

Внешнее соединение и результат NULL

Результат NULL после LEFT JOIN может удивить код, который обрабатывает данные дальше. Используйте COALESCE, чтобы задать значения по умолчанию:

SELECT u.email, COALESCE(SUM(o.total), 0) AS revenue
FROM users u
LEFT JOIN orders o ON o.user_id = u.id
GROUP BY u.email;

CROSS JOIN — когда нужны все пары

Соединяет каждую строку A с каждой строкой B. Используйте с осторожностью:

SELECT d.date, u.id
FROM users u
CROSS JOIN generate_series('2024-01-01', '2024-01-07', INTERVAL '1 day') AS d(date);

Шаблоны антисоединения

Три идиоматичных способа найти «строки слева без соответствия»:

-- LEFT JOIN ... WHERE IS NULL
SELECT u.* FROM users u
LEFT JOIN orders o ON o.user_id = u.id
WHERE o.id IS NULL;

-- NOT EXISTS (often the planner's favourite)
SELECT u.* FROM users u
WHERE NOT EXISTS (SELECT 1 FROM orders o WHERE o.user_id = u.id);

Итоги

Внешние соединения сохраняют строки без соответствий.

  • LEFT = все строки слева, NULL справа при отсутствии соответствия
  • RIGHT = зеркальный вариант; для удобства чтения используйте LEFT
  • FULL OUTER = строки с обеих сторон
  • Антисоединение = LEFT JOIN ... WHERE right IS NULL

Быстрая проверка

Какой тип JOIN возвращает пользователей, даже если у них NO заказов?

Часто задаваемые вопросы

Урок «LEFT/RIGHT JOIN и внешние соединения» бесплатный?

Да — полный текст урока «LEFT/RIGHT JOIN и внешние соединения» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс SQL Academy, подпишись на CoddyKit PRO. Курс SQL Academy содержит 4 уроков всего.

Чему я научусь в уроке «LEFT/RIGHT JOIN и внешние соединения»?

Используйте LEFT JOIN, чтобы сохранять несопоставленные строки, разберитесь с RIGHT и FULL OUTER JOIN и находите отсутствующие данные с помощью WHERE x IS NULL Ты практикуешь SQL Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать SQL Academy?

Предыдущий опыт не требуется. SQL Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.

Сколько времени занимает урок «LEFT/RIGHT JOIN и внешние соединения»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке SQL Academy?

Да. Каждый урок SQL Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Зачем нужны JOIN (повторение реляционной модели)
  2. Механика INNER JOIN
  3. LEFT/RIGHT JOIN и внешние соединения
  4. Самосоединения и псевдонимы
← Назад к SQL Academy