Ответ
LEFT JOIN и FULL OUTER JOIN — это типы внешних соединений в SQL, которые позволяют объединять таблицы, даже если в одной из них нет совпадающих строк.
LEFT JOIN (или LEFT OUTER JOIN)
Возвращает все строки из левой таблицы и совпадающие с ними строки из правой таблицы. Если совпадения в правой таблице не найдено, её столбцы для этой строки будут заполнены значениями NULL.
Использование: Полезно, когда нужно получить все записи из основной таблицы (например, users) и связанные с ними данные из другой (например, orders), даже если у некоторых пользователей заказов нет.
-- Получить всех пользователей и их заказы, если они есть
SELECT users.name, orders.id
FROM users
LEFT JOIN orders ON users.id = orders.user_id;
FULL OUTER JOIN
Возвращает все строки из обеих таблиц.
- Если для строки из левой таблицы есть совпадение в правой, строки объединяются.
- Если для строки из левой таблицы нет совпадения в правой, столбцы правой таблицы заполняются
NULL. - Если для строки из правой таблицы нет совпадения в левой, столбцы левой таблицы заполняются
NULL.
Использование: Применяется реже. Полезно, когда нужно найти все записи из двух наборов данных и увидеть, какие из них имеют пары, а какие — нет.
-- Получить всех пользователей и все заказы,
-- сопоставляя их там, где это возможно
SELECT users.name, orders.id
FROM users
FULL OUTER JOIN orders ON users.id = orders.user_id;
Ключевое замечание: MySQL не поддерживает FULL OUTER JOIN напрямую. Его эмулируют, объединяя результаты LEFT JOIN и RIGHT JOIN через UNION.
Ответ 18+ 🔞
Давай разберём эту тему про JOIN-ы, а то я вижу, у некоторых уже глаза на лоб лезут, как будто им про квантовую механику рассказывают. Всё проще, чем кажется, ей-богу.
Вот представь, что у тебя есть две таблицы. Одна — это, допустим, список твоих друзей. Другая — список долгов, которые они тебе должны. Так вот, LEFT JOIN — это когда ты хочешь пройтись по всем друзьям из первого списка и посмотреть, есть ли у них долги во втором. Если долг есть — красота, выводим. Если дружбан оказался честным и не должен ни копейки (или просто хитрожопый и не записал), то на месте долга будет NULL. То есть левая таблица (друзья) — святая, все её строки выведутся. Правая (долги) — как повезёт.
SELECT friends.name, debts.amount
FROM friends
LEFT JOIN debts ON friends.id = debts.friend_id;
Вот тут мы всех друзей и вытащим, даже того Васька, который всегда «забывает» кошелёк. Рядом с ним будет NULL — безобразие, но факт.
А теперь FULL OUTER JOIN — это уже цирк. Это когда ты берёшь оба списка и вываливаешь их в одну кучу.
- Друг есть и долг есть — идеально, строки склеились.
- Друг есть, а долга нет (как в
LEFT JOIN) — выводим друга, а на месте долгаNULL. - А вот теперь магия: долг есть, а друга в твоём списке нет! Кто этот анонимный должник? Хуй его знает. Но долг-то записан! Выведется строка, где имя друга будет
NULL, а сумма долга — вот она. Пиздец, да? Полная картина, кто кому и что должен, даже если имена потерялись.
SELECT friends.name, debts.amount
FROM friends
FULL OUTER JOIN debts ON friends.id = debts.friend_id;
Но есть нюанс, блядь! Твой MySQL, этот старый упрямец, FULL OUTER JOIN в лоб не понимает. Ему надо подсунуть эмуляцию, как извращенцу. Делается это через UNION результатов LEFT JOIN и RIGHT JOIN. Сложно звучит, но на деле — просто два запроса, склеенные в один результат.
Так что запомни: LEFT JOIN — «все свои, и если что-то есть у них». FULL OUTER JOIN — «а давайте-ка вообще всё, что есть у обеих сторон, на стол, и посмотрим, что с чем состыкуется». Второй, конечно, применяется реже, но когда нужен — заменить его нечем, кроме как этим самым костылем из UNION. Вот такая, блядь, SQL-магия.