Ответ
INNER JOIN возвращает только те строки, для которых условие соединения (ON) выполняется в обеих таблицах. Строки без пары отбрасываются.
LEFT JOIN (или LEFT OUTER JOIN) возвращает все строки из левой (первой) таблицы, даже если для них нет совпадения в правой таблице. В таком случае все столбцы из правой таблицы в результирующей строке будут содержать NULL.
Визуализация:
Таблица A Таблица B INNER JOIN A и B LEFT JOIN A и B
-------- -------- --------------- ---------------
id | name id | value A.id | A.name | B.value A.id | A.name | B.value
1 | Alice 1 | 100 1 | Alice | 100 1 | Alice | 100
2 | Bob 3 | 300 3 | Carol | 300 2 | Bob | NULL
3 | Carol 3 | Carol | 300
Пример SQL-запросов:
-- INNER JOIN: Только клиенты, сделавшие заказы.
SELECT c.id, c.name, o.order_date
FROM customers c
INNER JOIN orders o ON c.id = o.customer_id;
-- LEFT JOIN: Все клиенты, даже те, кто не делал заказов.
SELECT c.id, c.name, o.order_date
FROM customers c
LEFT JOIN orders o ON c.id = o.customer_id
WHERE o.order_date IS NULL; -- Частый случай: найти клиентов без заказов.
Практическое правило:
- Используйте
INNER JOIN, когда вам нужны только связанные данные из обеих таблиц. - Используйте
LEFT JOIN, когда вам нужны все записи из основной (левой) таблицы, и дополнительная информация из связанной таблицы — если она есть.
Ответ 18+ 🔞
Давай разберём эту пиздопроебищну про JOIN'ы, чтобы у тебя в башке всё встало на свои ебучки-воробушки.
Представь, что у тебя есть две таблицы. Одна — это список твоих корешей, вторая — список долгов, которые они тебе должны. Вот и вся хуйня.
INNER JOIN — это как самый жадный и принципиальный коллектор. Он смотрит на обе таблицы и говорит: «Хуй с горы, чувак! Я верну тебе только тех, кто и в списке друзей и в списке должников!». Кто не должен — тот для него не существует, нахуй выкидывается. Только пересечение, только хардкор.
LEFT JOIN — это уже более лояльный тип, можно сказать, хитрая жопа. Он говорит: «Ладно, покажи мне всех своих друзей из левой таблицы. А из правой таблицы с долгами — прицепляй инфу, если должок есть. Если нет — ну и похуй, я просто поставлю NULL». То есть все друзья останутся в выдаче, даже те, кто нихуя не должен.
Вот тебе визуализация, чтобы не бздеть:
Друзья (A) Долги (B) INNER JOIN A и B LEFT JOIN A и B
-------- -------- --------------- ---------------
id | имя id | сумма A.id | A.имя | B.сумма A.id | A.имя | B.сумма
1 | Вася 1 | 100р 1 | Вася | 100р 1 | Вася | 100р
2 | Петя 3 | 300р 3 | Коля | 300р 2 | Петя | NULL
3 | Коля 3 | Коля | 300р
Видишь? INNER JOIN проигнорировал Петю, потому что тот, сука, чист перед законом. А LEFT JOIN его оставил, но с пустым кошельком в графе долга.
Примеры запросов, чтобы ты окончательно не охуел:
-- INNER JOIN: Только те, кто и друг, и должник. Реальные пацаны.
SELECT c.id, c.name, o.order_date
FROM customers c
INNER JOIN orders o ON c.id = o.customer_id;
-- LEFT JOIN: Все клиенты, даже те, кто нихуя не купил. А потом находим этих пидарасов.
SELECT c.id, c.name, o.order_date
FROM customers c
LEFT JOIN orders o ON c.id = o.customer_id
WHERE o.order_date IS NULL; -- Вот они, сраные халявщики!
Практическое правило, которое тебя спасёт:
INNER JOIN— когда тебе нужны только пары, только взаимные отношения. «Покажи пользователей, у которых есть заказы».LEFT JOIN— когда тебе нужны ВСЕ записи из главной таблицы, а данные из второй — так, по приколу, если есть. «Покажи всех пользователей и их заказы, если они вдруг были». Особенно кайфово искатьWHERE ... IS NULL— это те, кто нихуя не сделал.