Ответ
LEFT JOIN (или LEFT OUTER JOIN) возвращает все строки из левой (первой) таблицы и совпадающие строки из правой таблицы. Если совпадения нет, в колонках правой таблицы будут значения NULL.
Синтаксис и пример:
SELECT
employees.name,
departments.department_name
FROM employees
LEFT JOIN departments
ON employees.department_id = departments.id;
Этот запрос вернет всех сотрудников, включая тех, кто не привязан ни к одному отделу (в department_name будет NULL).
Ключевые особенности и применение:
- Порядок таблиц важен:
A LEFT JOIN B≠B LEFT JOIN A. - Условие соединения: Указывается в
ON. Для фильтрации результата после соединения используетсяWHERE. - Поиск отсутствующих записей: Частый кейс — найти записи в левой таблице, для которых нет соответствия в правой.
-- Найти сотрудников без отдела SELECT employees.name FROM employees LEFT JOIN departments ON employees.department_id = departments.id WHERE departments.id IS NULL; - Дублирование строк: Если в правой таблице несколько строк подходят под условие
ON, строка из левой таблицы будет продублирована для каждого совпадения.
Почему LEFT JOIN, а не INNER? INNER JOIN вернет только пересечение, отфильтровав сотрудников без отдела, что не всегда требуется для анализа.
Ответ 18+ 🔞
А, ну это же классика, блядь! LEFT JOIN, ёпта! Это как если бы ты пришёл на вечеринку со всеми своими друзьями, а потом к тебе ещё и соседи подтянулись, если они, конечно, есть. А если нет — ну и хуй с ними, сиди со своими.
Смотри, сука, как это работает. Берёшь главную таблицу — левую, она у нас как бы базовая. И говоришь: «Всё, что у тебя есть, мне вываливай. А потом, блядь, попробуй к каждой твоей записи прилепить что-нибудь из вот этой второй, правой таблицы, по какому-нибудь признаку».
Если нашлось что прилепить — красота, будет полная строка. Если не нашлось — ну, значит, в полях от правой таблицы будут торчать эти самые NULL, как пустые бутылки после гулянки.
Вот смотри на код, он тут правильный, не трогаю его:
SELECT
employees.name,
departments.department_name
FROM employees
LEFT JOIN departments
ON employees.department_id = departments.id;
Перевод на человеческий: «Дай мне всех работяг, и для каждого, ебать, попробуй найти его контору (отдел). Нашёл — пиши название. Не нашёл — ну, пиши, что он бомж без отдела, NULL значит».
А теперь, блядь, главные фишки, чтобы не облажаться:
- Порядок — всё, ёбаный насос!
Таблица_А LEFT JOIN Таблица_БиТаблица_Б LEFT JOIN Таблица_А— это две большие разницы, как говорят в Одессе. В первом случае в приоритете А, во втором — Б. Не перепутай, а то получишь не то, что хотел. - Где фильтровать — вот в чём вопрос. Условие, по которому ты соединяешь таблицы, пихай в
ON. А если хочешь отфильтровать уже готовый результат — вот тогда твоё место вWHERE. Это важно, ёпта, а то отфильтруешь лишнего. - Супер-приём: найти сирот. Самый частый запрос, который все делают на LEFT JOIN — это как раз найти тех, у кого нет пары в правой таблице. Типа «найди всех сотрудников-одиночек, которых на отделы не разобрали».
SELECT employees.name FROM employees LEFT JOIN departments ON employees.department_id = departments.id WHERE departments.id IS NULL; -- Вот он, магический IS NULL!Смысл: мы взяли всех, а потом отсеяли тех, кому нашлось совпадение. Остались те, кому не нашлось. Гениально и просто, как три копейки.
- Осторожно, дубли! Если в правой таблице на одну запись левой нашлось несколько подходящих строк — левая запись начнёт клонироваться, как сумасшедшая. Одна строка слева, а справа к ней прилипло три — получишь на выходе три строки. Это не баг, это фича, но про неё надо помнить, чтобы потом не охуеть от количества данных.
И главный вопрос: нахуя это, если есть INNER JOIN? А вот нахуя: INNER JOIN — это строгий вышибала на входе в клуб. Нет твоего друга в списке (нет совпадения в правой таблице) — тебя, сука, и твоего друга не пускают вообще. А LEFT JOIN — это добрый охранник. Тебя-то он пропустит в любом случае, а вот твоего друга — если он есть. Если нет — будешь тусить один. Для отчётов и анализа часто нужно видеть всю картину, включая «бомжей», а не только тех, у кого всё в порядке. Вот для этого он и нужен, этот самый левый джоин, ёбана!