Какие виды JOIN в SQL ты знаешь?

Ответ

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

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

    SELECT users.name, orders.total
    FROM users
    INNER JOIN orders ON users.id = orders.user_id;
  2. LEFT (OUTER) JOIN Возвращает все строки из левой таблицы и совпадающие строки из правой. Если совпадения нет, для полей правой таблицы возвращается NULL. Полезен, например, для получения списка всех пользователей и их заказов, включая тех, у кого заказов нет.

    SELECT users.name, orders.total
    FROM users
    LEFT JOIN orders ON users.id = orders.user_id;
  3. RIGHT (OUTER) JOIN Обратный LEFT JOIN: возвращает все строки из правой таблицы и совпадающие из левой. Используется реже.

  4. FULL (OUTER) JOIN Возвращает все строки из обеих таблиц, объединяя результаты LEFT и RIGHT JOIN. Отсутствующие совпадения заполняются NULL. Не поддерживается в MySQL напрямую, но может быть эмулирован через UNION.

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

  6. SELF JOIN Соединение таблицы с самой собой, часто используется для работы с иерархическими данными.

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

Ответ 18+ 🔞

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

INNER JOIN — это типа базовый, классический. Берёт две таблицы и склеивает только там, где ключи совпали. Всё просто: есть совпадение — строка в результат попала. Нет совпадения — иди на хуй, тебя в выдаче не будет. Как будто ты пришёл на тусовку без друга — тебя просто не пустили. Самый частый сценарий, без него нихуя не собрать.

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

LEFT JOIN — вот тут уже интереснее, хитрая жопа. Он возвращает ВСЁ из левой таблицы (той, что в FROM), и если для какой-то строки в правой таблице нашлась парочка — он её приклеит. А если не нашлось — так и напишет NULL. Идеально, когда тебе надо, например, всех пользователей вывести, даже тех, кто нихуя не заказал. Они будут в списке, просто с пустой графой заказа. Удобно, ёба!

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

RIGHT JOIN — это полная противоположность LEFT JOIN. Он возвращает всё из правой таблицы. Но честно? В жизни его используют овердохуища реже. Чаще всего просто переписывают запрос, поменяв таблицы местами, и используют LEFT JOIN. Так понятнее, чувак.

FULL JOIN — а это уже полный разгул. Он вываливает ВСЁ из обеих таблиц. Совпало — отлично, склеил. Не совпало слева — оставил NULL справа. Не совпало справа — оставил NULL слева. В MySQL его, сука, нет нативно, приходится выкручиваться через UNION. Но иногда без него — нихуя.

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

SELF JOIN — звучит умно, а на деле — просто соединение таблицы самой с собой. Чаще всего нужно, когда в одной таблице есть иерархия. Например, таблица сотрудников, где у каждого есть manager_id, который ссылается на id другого сотрудника в ЭТОЙ ЖЕ таблице. Чтобы вывести имя сотрудника и имя его начальника, как раз и юзаешь SELF JOIN.

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

Вот и вся магия. Главное — понимать, что тебе нахуй нужно от данных, а дальше просто выбираешь подходящий инструмент. А то бывает, смотришь на запрос коллеги с тремя LEFT JOIN и одним CROSS где-то посередине — и волнение ебать, терпения ноль ебать, хочется спросить: «Мужик, ты вообще понимаешь, что этот запрос делает?».