Ответ
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... да похуй на него, честно.
Видео-ответы
▶
▶
▶
▶
▶
▶
▶
▶