Получить доступ

Какой JOIN вернёт все строки левой таблицы и совпавшие из правой (NULL там, где совпадений нет)?

JuniorJOIN, ключи и ограниченияSQL
Ещё спрашивают так:
  • Чем LEFT JOIN отличается от INNER JOIN?
  • Как найти клиентов без заказов?
Коротко

LEFT JOIN возвращает все строки левой таблицы и совпавшие из правой; где совпадений нет — в колонках правой NULL.

  • INNER JOIN — только пары с совпадением
  • RIGHT JOIN — зеркально, FULL JOIN — все строки обеих
  • Поиск «без пары»: LEFT JOIN … WHERE right.id IS NULL

А ещё Условие на правую таблицу в WHERE превращает LEFT JOIN в INNER — его ставят в ON

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

Виды соединений:

  • INNER JOIN — только строки, для которых нашлась пара по условию;
  • LEFT (OUTER) JOIN — все строки левой таблицы; если пары нет, колонки правой заполняются NULL;
  • RIGHT JOIN — все строки правой (обычно переписывают как LEFT, поменяв таблицы местами);
  • FULL OUTER JOIN — все строки обеих, непарные дополняются NULL;
  • CROSS JOIN — декартово произведение.

Если у левой строки несколько пар — она повторится несколько раз. Это частая причина «задвоенных» сумм после JOIN.

Ловушка с WHERE. Условие на колонку правой таблицы в WHERE (WHERE o.status = 'paid') отбрасывает строки, где правая часть NULL, — и LEFT JOIN фактически становится INNER. Если нужно «все клиенты и их оплаченные заказы», условие ставят в ON: LEFT JOIN orders o ON o.customer_id = c.id AND o.status = 'paid'.

Анти-соединение — найти строки без пары: LEFT JOIN … WHERE o.id IS NULL или NOT EXISTS.

Пример

-- все клиенты и число их заказов, включая клиентов без заказов
SELECT c.name, count(o.id) AS orders
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
GROUP BY c.name;

-- клиенты без заказов
SELECT c.* FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
WHERE o.id IS NULL;

Что хотят услышать

  • Определение LEFT JOIN и NULL для непарных строк.
  • Отличие от INNER, RIGHT, FULL.
  • Поиск строк без пары.
  • Ловушка условия в WHERE — плюс.

Частые ошибки

  • count(*) вместо count(o.id) — клиент без заказов получит 1.
  • Фильтр по правой таблице в WHERE.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✗INNER JOIN
  • ✓LEFT (OUTER) JOIN
  • ✗RIGHT JOIN
  • ✗CROSS JOIN

Что спросят дальше

  • Почему условие на правую таблицу лучше класть в ON, а не WHERE?
  • Что такое FULL OUTER JOIN?

Разбор темы

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем