Какие виды операций соединения (JOIN) знаешь в SQL?

Ответ

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

  • INNER JOIN (или просто JOIN): Возвращает только те строки, для которых есть совпадение в обеих таблицах.

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

    SELECT employees.name, projects.title
    FROM employees
    LEFT JOIN projects ON employees.id = projects.lead_id;
    -- Покажет всех сотрудников, даже тех, кто не ведёт проект
  • RIGHT (OUTER) JOIN: Аналогичен LEFT JOIN, но приоритет отдан правой таблице. Возвращает все строки из правой таблицы и совпадения из левой.

  • FULL (OUTER) JOIN: Возвращает все строки из обеих таблиц. Если для строки из одной таблицы нет совпадения в другой, недостающие поля заполняются NULL.

  • CROSS JOIN: Возвращает декартово произведение таблиц — каждая строка первой таблицы соединяется с каждой строкой второй. Может генерировать очень большие результирующие наборы.

    SELECT sizes.size, colors.color
    FROM sizes
    CROSS JOIN colors;
    -- Создаст все возможные комбинации размеров и цветов
  • SELF JOIN: Технически это обычный JOIN таблицы с самой собой. Часто используется для работы с иерархическими данными (например, таблица сотрудников с полем manager_id).

    SELECT e1.name AS Employee, e2.name AS Manager
    FROM employees e1
    LEFT JOIN employees e2 ON e1.manager_id = e2.id;

Ответ 18+ 🔞

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

Смотри, есть у тебя таблицы — как отдельные кучки людей. JOIN — это когда ты их начинаешь сводить по какому-то признаку, типа «у кого одинаковые бейджики от одной конторы».

INNER JOIN (или просто JOIN) — это самый строгий, блядь, тусовщик. Берёт только тех, у кого есть пара. Если у человека из левой таблицы нет брата-близнеца в правой — его нахуй выкидывают из итоговой вечеринки. Чистая элита совпадений.

SELECT employees.name, departments.name
FROM employees
INNER JOIN departments ON employees.department_id = departments.id;

Вот тут выведутся только сотрудники, у которых отдел реально существует. Безотцовщина не пройдёт.

LEFT JOIN — это уже по-нашему, по-человечески. Он берёт всех чуваков из левой таблицы (первой, которую написал), и пытается к ним пристегнуть данные из правой. Не нашёл пару? Да и хуй с ним, оставит поля пустыми (NULL). Главное — левые не потеряются.

SELECT employees.name, projects.title
FROM employees
LEFT JOIN projects ON employees.id = projects.lead_id;
-- Покажет всех сотрудников, даже тех, кто не ведёт проект

Вот это — жизнь. Видно и героев труда, и лодырей, которые проект не ведут. Справа у лодырей будет NULL.

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

FULL JOIN — это, бля, полный бардак. Он вываливает на тебя вообще всех с обеих сторон. Был совместимый друг — хорошо. Не было — поля так и останутся пустыми с той или иной стороны. Полная картина, но часто — пиздец как много строк.

CROSS JOIN — это, ядрёна вошь, адский механизм. Он тупо берёт каждую строчку из первой таблицы и соединяет с КАЖДОЙ строчкой из второй. Если в первой таблице 100 строк, а во второй 1000 — получишь 100 000 строк, ебать копать! Полезно только для каких-то суперспецифичных задач, типа генерации всех комбинаций размеров и цветов.

SELECT sizes.size, colors.color
FROM sizes
CROSS JOIN colors;
-- Создаст все возможные комбинации размеров и цветов

Будь с ним осторожен, а то сервак взвоет.

SELF JOIN — звучит умно, а на деле просто таблица сама с собой знакомится. Чаще всего, чтобы найти кто чей начальник в одной таблице сотрудников.

SELECT e1.name AS Employee, e2.name AS Manager
FROM employees e1
LEFT JOIN employees e2 ON e1.manager_id = e2.id;

Вот смотри: ты берёшь таблицу employees, даёшь ей псевдоним e1 (это сами сотрудники), и соединяешь её с той же таблицей, но под псевдонимом e2 (это начальники). Связываешь по полю manager_id. И вуаля — видишь, кто кем рулит. Если начальника нет (NULL) — LEFT JOIN покажет сотрудника всё равно, а графа «Manager» будет пустой. Красота!

Вот и вся магия. Главное — понять, кого ты хочешь видеть в результате: только парочек (INNER), всех левых и их подруг (LEFT), или устроить тотальную сходку всех со всеми (CROSS), после которой терпения ебать ноль.