Какие типы JOIN в SQL вы знаете? Приведите примеры использования.

Ответ

В работе с реляционными базами данных я постоянно использую различные типы JOIN для объединения данных из связанных таблиц.

Основные типы JOIN (на примере PostgreSQL/MySQL синтаксиса):

Предположим, у нас есть две таблицы: users (id, name) и orders (id, user_id, amount).

  1. INNER JOIN Возвращает только те строки, где есть совпадение в обеих таблицах. Это самый частый JOIN в моих запросах.

    -- Найти всех пользователей, сделавших заказы, и их заказы
    SELECT users.name, orders.amount, orders.id
    FROM users
    INNER JOIN orders ON users.id = orders.user_id;

    Пользователи без заказов и заказы без привязанного пользователя (если такое возможно) в результат не попадут.

  2. LEFT (OUTER) JOIN Возвращает все строки из левой таблицы (users), даже если для них нет совпадений в правой. Если совпадения нет, поля из правой таблицы будут NULL.

    -- Найти ВСЕХ пользователей и их заказы (если есть)
    SELECT users.name, orders.amount
    FROM users
    LEFT JOIN orders ON users.id = orders.user_id;

    Этот запрос вернет и пользователей, которые никогда не делали заказов. Для них orders.amount будет NULL. Я часто использую LEFT JOIN для анализа полноты данных или построения отчетов, где нужно видеть всех клиентов.

  3. RIGHT (OUTER) JOIN Аналог LEFT JOIN, но возвращает все строки из правой таблицы. На практике использую его гораздо реже, так как любой RIGHT JOIN можно переписать как LEFT JOIN, поменяв таблицы местами.

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

    -- Получить полную картину связей, включая "осиротевшие" записи
    SELECT users.name, orders.id
    FROM users
    FULL OUTER JOIN orders ON users.id = orders.user_id;

    Полезен для аудита данных, чтобы найти как пользователей без заказов, так и заказы без валидного пользователя.

  5. CROSS JOIN Возвращает декартово произведение строк — каждую строку из первой таблицы со всеми строками из второй. Использую осознанно и редко, например, для генерации всех возможных комбинаций (все дни месяца × все товары).

    SELECT sizes.size, colors.color
    FROM sizes
    CROSS JOIN colors;
  6. SELF JOIN Это не отдельный синтаксис, а паттерн, когда таблица соединяется сама с собой. Часто требуется для иерархических данных (например, таблица employees с полем manager_id).

    -- Найти сотрудников и их непосредственных руководителей
    SELECT e.name AS employee, m.name AS manager
    FROM employees e
    LEFT JOIN employees m ON e.manager_id = m.id;

Ключевое для производительности — наличие корректных индексов на полях, участвующих в условии ON (в нашем случае users.id и orders.user_id).

Ответ 18+ 🔞

Давай разберём эти ваши JOIN'ы, а то народ постоянно в них путается, как будто в тёмной комнате хуй с горы ищет. Ситуация проще, чем кажется, если не усложнять.

Представь, есть две таблицы: users (пользователи) и orders (их заказы). Связь через user_id. Поехали.

1. INNER JOIN Это когда тебе нужны только те, у кого всё есть и всё совпало. Как на хорошей вечеринке — только пары. Пользователи без заказов и заказы-сироты нахуй не нужны, их в результат не берут.

SELECT users.name, orders.amount
FROM users
INNER JOIN orders ON users.id = orders.user_id;

Вот и всё. Только совпадения. Самый частый запрос, основа основ.

2. LEFT JOIN А вот это уже интереснее. Тут мы говорим: «Дайте мне всех пользователей, ёпта, даже если они нищеброды и ни разу не заказали». Заказы для них будут NULL, но пользователи-то будут! Овердохуища полезная штука для отчётов.

SELECT users.name, orders.amount
FROM users
LEFT JOIN orders ON users.id = orders.user_id;

Вот смотри: Вася купил 100 рублей — будет строка. Петя нихуя не купил — тоже будет строка, но в amount будет NULL. Всех видно. Удобно для начальства, которое орёт: «Где список всех клиентов?!».

3. RIGHT JOIN Честно? Практически не использую. Это как LEFT JOIN, но наоборот — все строки из правой таблицы. Любой RIGHT JOIN можно перевернуть в LEFT, просто поменяв таблицы местами. Зачем мозги ломать? Да похуй на него.

4. FULL OUTER JOIN Вот это уже полный разгул демократии. Берём вообще всё из обеих таблиц. И пользователей без заказов, и заказы, которые кто-то хуй знает кто создал. Все NULL'ы будут на своих местах. Штука для аудита, когда подозрение ебать чувствуешь, что в данных пиздец и бардак.

SELECT users.name, orders.id
FROM users
FULL OUTER JOIN orders ON users.id = orders.user_id;

Найдёшь и дыры в данных, и аномалии. Сильно грузит базу, если таблицы большие, имей в виду.

5. CROSS JOIN О, это декартово произведение, ёбана-мать! Каждую строку из первой таблицы соединяет с каждой строкой из второй. Если в первой таблице 100 строк, а во второй 1000 — получишь 100 000 строк на выходе. Ядрёна вошь! Используй только когда тебе реально нужны все возможные комбинации (все размеры × все цвета). Иначе сервак накроется медным тазом.

SELECT sizes.size, colors.color
FROM sizes
CROSS JOIN colors;

6. SELF JOIN Отдельного слова нет, это просто паттерн. Когда таблица соединяется сама с собой. Классика — таблица сотрудников, где у каждого есть manager_id, ссылающийся на id другого сотрудника в этой же таблице. Выглядит как магия, но работает.

SELECT e.name AS employee, m.name AS manager
FROM employees e
LEFT JOIN employees m ON e.manager_id = m.id;

Видишь? employees e и employees m — это одна и та же таблица, но мы делаем вид, что это две разные. И находим, кто кому начальник. Хитрая жопа, но логичная.

И главное, чувак, запомни на всю жизнь: чтобы эти JOIN'ы не превратились в пиздопроебибну по производительности, индексы на поля в условии ON (users.id, orders.user_id) должны быть! Без них запрос будет выполняться до второго пришествия, а ты будешь сидеть и бздеть, что база тормозит. Всё просто.