Какие основные виды JOIN существуют в SQL и чем они отличаются?

Ответ

JOIN используется для объединения строк из двух или более таблиц на основе условия связи. Основные виды:

  1. INNER JOIN (Внутреннее соединение) Возвращает только те строки, где есть совпадение в обеих таблицах.

    SELECT e.name, d.name 
    FROM employees e
    INNER JOIN departments d ON e.department_id = d.id;
    -- Результат: только сотрудники с привязанным отделом.
  2. LEFT (OUTER) JOIN (Левое внешнее соединение) Возвращает все строки из левой таблицы и совпадающие строки из правой. Если совпадения нет, для правой таблицы возвращаются NULL.

    SELECT e.name, d.name 
    FROM employees e
    LEFT JOIN departments d ON e.department_id = d.id;
    -- Результат: все сотрудники, даже без отдела.
  3. RIGHT (OUTER) JOIN (Правое внешнее соединение) Обратное LEFT JOIN. Возвращает все строки из правой таблицы и совпадающие из левой.

  4. FULL (OUTER) 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;
    -- Каждый сотрудник будет сопоставлен с каждым отделом.
  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 создает все комбинации.

Ответ 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 — это для тех, кто, блядь, слишком много о себе думает и должен посмотреть на себя со стороны. Всё, вопросов нет?