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

«Какие основные виды JOIN существуют в SQL и чем они отличаются?» — вопрос из категории Базы данных, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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 создает все комбинации.