В чем разница между LEFT JOIN и RIGHT JOIN в SQL?

Ответ

LEFT JOIN и RIGHT JOIN — это типы внешних соединений (OUTER JOIN), которые определяют, какие строки из соединяемых таблиц будут включены в результирующий набор, даже если для них нет совпадений.

LEFT JOIN

Возвращает все строки из левой (первой) таблицы и только совпадающие строки из правой таблицы. Если совпадения нет, поля из правой таблицы заполняются NULL.

-- Найти всех клиентов и их заказы (включая клиентов без заказов)
SELECT c.CustomerName, o.OrderId, o.OrderDate
FROM Customers c
LEFT JOIN Orders o ON c.CustomerID = o.CustomerID;

RIGHT JOIN

Возвращает все строки из правой (второй) таблицы и только совпадающие строки из левой таблицы. Если совпадения нет, поля из левой таблицы заполняются NULL.

-- Найти все заказы и информацию о клиентах (включая заказы без привязанного клиента)
SELECT c.CustomerName, o.OrderId, o.OrderDate
FROM Customers c
RIGHT JOIN Orders o ON c.CustomerID = o.CustomerID;

Ключевое отличие и практика

  • LEFT JOIN используется гораздо чаще, так как запросы обычно строятся от основной сущности (например, от клиентов к их заказам).
  • Любой RIGHT JOIN можно переписать как LEFT JOIN, просто поменяв таблицы местами. Поэтому RIGHT JOIN встречается редко — для единообразия кода предпочитают использовать только LEFT JOIN.
  • INNER JOIN (внутреннее соединение) возвращает только строки, где есть совпадение в обеих таблицах, в отличие от внешних соединений.

Ответ 18+ 🔞

А, ну это же про эти ваши JOIN'ы, блядь! Слушай, тут всё просто, как три копейки, но если не врубиться — можно ебучую путаницу в голове устроить, как в коммуналке.

LEFT JOIN — это как будто ты взял левую таблицу и говоришь: «Всё, сука, ты у меня главная! Я тебя всю выведу, всю, до последней строчки!». А правую таблицу тащишь за уши: «Ну и ты иди сюда, если есть что по делу. Если нет — сиди, молчи, и в колонках у тебя будет NULL, как пустое место в голове у идиота».

-- Давай всех клиентов, даже тех распиздяев, которые ни разу не заказали!
SELECT c.CustomerName, o.OrderId, o.OrderDate
FROM Customers c
LEFT JOIN Orders o ON c.CustomerID = o.CustomerID;

Видишь? Все клиенты будут. А если заказов нет — так OrderId и OrderDate просто будут пустые. Как карманы у бомжа.

RIGHT JOIN — это та же хуйня, только наоборот. Тут уже правая таблица — царица бала. «Ты, — говоришь ей, — выходи вся, не стесняйся!». А левую — только если она нашлась, как родственники, когда наследство делить.

-- Давай все заказы, даже если их кто-то оформил и сбежал, как пидарас!
SELECT c.CustomerName, o.OrderId, o.OrderDate
FROM Customers c
RIGHT JOIN Orders o ON c.CustomerID = o.CustomerID;

Но честно? RIGHT JOIN — это такая редкостная дичь. Его почти не используют, потому что любой RIGHT JOIN можно перевернуть, как блин, и сделать LEFT JOIN'ом, просто таблицы местами поменяв. А зачем плодить сущности, если можно обойтись одним инструментом? Это как иметь один хороший разводной ключ вместо целого ящика херни, которой ты всё равно не пользуешься.

И не путай это всё с INNER JOIN, ёпта! INNER JOIN — это строгий, блядь, отец: «Нет совпадения по условию? Иди нахуй, тебя в результатах не будет!». А LEFT/RIGHT — они более всепрощающие, как бабушка: «Ладно, иди сюда, посиди, даже если у тебя нихуя нет».

Вот и вся философия. Главное — определи, кто у тебя главный в запросе, и тащи его через LEFT JOIN. А RIGHT JOIN... да похуй на него, честно.