Какой JOIN вернёт все строки левой таблицы и совпавшие из правой (NULL там, где совпадений нет)?
- Чем 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
Подробно
Виды соединений:
- 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
- ✗RIGHT (OUTER) JOIN
- ✓LEFT (OUTER) JOIN
- ✗CROSS JOIN
Что спросят дальше
- Почему условие на правую таблицу лучше класть в ON, а не WHERE?
- Что такое FULL OUTER JOIN?
Разбор темы
- JOIN, ключи и ограничения
INNER/OUTER/CROSS JOIN, ловушка ON vs WHERE, первичные/внешние/уникальные ключи и ссылочная целостность.
Связанные вопросы
- Что вернёт INNER JOIN? Junior
- Чем HAVING отличается от WHERE? Junior
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.