Ответ
JOIN используется для объединения строк из двух или более таблиц на основе условия связи. Основные виды:
-
INNER JOIN(Внутреннее соединение) Возвращает только те строки, где есть совпадение в обеих таблицах.SELECT e.name, d.name FROM employees e INNER JOIN departments d ON e.department_id = d.id; -- Результат: только сотрудники с привязанным отделом. -
LEFT (OUTER) JOIN(Левое внешнее соединение) Возвращает все строки из левой таблицы и совпадающие строки из правой. Если совпадения нет, для правой таблицы возвращаютсяNULL.SELECT e.name, d.name FROM employees e LEFT JOIN departments d ON e.department_id = d.id; -- Результат: все сотрудники, даже без отдела. -
RIGHT (OUTER) JOIN(Правое внешнее соединение) ОбратноеLEFT JOIN. Возвращает все строки из правой таблицы и совпадающие из левой. -
FULL (OUTER) JOIN(Полное внешнее соединение) Возвращает все строки из обеих таблиц. Если совпадения нет, для недостающей стороны возвращаетсяNULL.SELECT e.name, d.name FROM employees e FULL JOIN departments d ON e.department_id = d.id; -- Результат: все сотрудники и все отделы. -
CROSS JOIN(Декартово произведение) Возвращает все возможные комбинации строк из обеих таблиц. Не имеет условия ON.SELECT e.name, d.name FROM employees e CROSS JOIN departments d; -- Каждый сотрудник будет сопоставлен с каждым отделом. -
SELF JOIN(Самосоединение) Соединение таблицы с самой собой (используется псевдонимы). Полезно для иерархических данных.SELECT e1.name AS employee, e2.name AS manager FROM employees e1 LEFT JOIN employees e2 ON e1.manager_id = e2.id;
Ключевое отличие: INNER JOIN фильтрует данные, оставляя только пересечение. OUTER JOIN (LEFT, RIGHT, FULL) сохраняет все строки одной или обеих таблиц, дополняя недостающие данные NULL. CROSS JOIN создает все комбинации.
Ответ 18+ 🔞
А, слушай, про эти ваши JOIN'ы, ну, блядь, классика жанра, как "Муму" Тургенева, только про таблицы! Сейчас разжую, как здоровый Герасим бы это объяснил, если б он не был немым, а стал бы, блядь, SQL-архитектором.
Представь, что у тебя есть таблица employees — это наши работнички, и таблица departments — отделы, где они сидят. JOIN — это такой способ их познакомить, сводить на свидание, но, блядь, по правилам.
1. INNER JOIN (Внутреннее соединение)
Это как самый строгий, блядь, тусовщик. Берёт только тех, у кого есть пара. Если у сотрудника нет отдела или у отдела нет сотрудников — нахуй, в пролёте. Только полное совпадение.
SELECT e.name, d.name
FROM employees e
INNER JOIN departments d ON e.department_id = d.id;
-- Результат: только те, кто не сидит, блядь, в подвале без отдела.
2. LEFT JOIN (Левое внешнее соединение)
Вот это уже по-человечески. "Всех левых (сотрудников) — на выход, с парой или без!" Если у чувака отдела нет — справа будет NULL, но он в отчёте будет, блядь, маячить.
SELECT e.name, d.name
FROM employees e
LEFT JOIN departments d ON e.department_id = d.id;
-- Результат: все работяги, даже Петрович, который, сука, уже три года в отпуске за свой счёт.
3. RIGHT JOIN (Правое внешнее соединение)
Та же хуйня, только наоборот. Все отделы выводим, даже если они пустые, как, блядь, совесть у менеджера после корпоратива.
(Пример опускаю, и так понятно, зеркало LEFT'а).
4. FULL JOIN (Полное внешнее соединение)
А это, ёпта, полный бардак, но иногда нужный. Выводим ВСЁ и отовсюду. Всех сотрудников, все отделы. Кто без пары — у того в графе NULL. Полная картина, блядь, хоть и с дырами.
SELECT e.name, d.name
FROM employees e
FULL JOIN departments d ON e.department_id = d.id;
-- Результат: и Петрович-одиночка, и отдел "Стратегического ничегонеделания", в котором ни одной штатной единицы.
5. CROSS JOIN (Декартово произведение)
Вот это, блядь, пиздец и хаос. Берёт каждого сотрудника и женит его на КАЖДОМ отделе. Никаких условий ON! Получается овердохуища строк. Нужен редко, но метко — например, для создания всех возможных комбинаций.
SELECT e.name, d.name
FROM employees e
CROSS JOIN departments d;
-- Результат: если 100 сотрудников и 10 отделов, получишь 1000 строк. Кароч, Аня из бухгалтерии теперь и в IT, и в охране, и в отделе кадров.
6. SELF JOIN (Самосоединение)
А это когда таблица, блядь, сама с собой соединяется, как шизофреник на два голоса. Нужно для иерархии — например, кто чей менеджер. Обязательно используй псевдонимы, а то сам себя не узнаешь.
SELECT e1.name AS employee, e2.name AS manager
FROM employees e1
LEFT JOIN employees e2 ON e1.manager_id = e2.id;
-- Результат: видно, кто над кем стоит и кто, сука, главный пахан.
Короче, суть:
INNER JOIN — только пересечение, строго. OUTER JOIN (LEFT/RIGHT/FULL) — сохраняем всех, кого указали, недостающее затыкаем NULL'ами. CROSS JOIN — всех со всеми, ебашь комбинации. А SELF JOIN — это для тех, кто, блядь, слишком много о себе думает и должен посмотреть на себя со стороны. Всё, вопросов нет?