Ответ
В SQL JOIN используется для объединения строк из двух или более таблиц на основе связанного столбца. Основные типы:
1. INNER JOIN Возвращает только те строки, где есть совпадение в обеих таблицах. Самый распространенный тип.
SELECT users.name, orders.amount
FROM users
INNER JOIN orders ON users.id = orders.user_id;
-- Результат: только пользователи, сделавшие заказы.
2. LEFT (OUTER) JOIN
Возвращает все строки из левой таблицы и совпадающие строки из правой. Если совпадения нет, поля из правой таблицы будут NULL.
SELECT users.name, orders.amount
FROM users
LEFT JOIN orders ON users.id = orders.user_id;
-- Результат: все пользователи, даже те, у кого нет заказов.
3. RIGHT (OUTER) JOIN
Обратный LEFT JOIN. Возвращает все строки из правой таблицы и совпадающие из левой. Используется реже.
4. FULL (OUTER) JOIN
Возвращает все строки, когда есть совпадение либо в левой, либо в правой таблице. Отсутствующие значения заполняются NULL. Не поддерживается в MySQL напрямую, эмулируется через UNION LEFT и RIGHT JOIN.
5. CROSS JOIN Возвращает декартово произведение таблиц: каждая строка первой таблицы соединяется с каждой строкой второй. Может генерировать огромные результаты.
SELECT sizes.size, colors.color
FROM sizes
CROSS JOIN colors;
-- Результат: все возможные комбинации размеров и цветов.
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 и LEFT JOIN используются в 90% случаев. Важно понимать разницу: INNER JOIN фильтрует данные, а LEFT JOIN сохраняет все записи из основной таблицы.
Ответ 18+ 🔞
Давай разберём эти ваши JOIN'ы, а то некоторые их как мантру повторяют, а толком нихуя не понимают, что там внутри происходит.
Вот смотри, представь, что у тебя есть таблица с пользователями и таблица с заказами. И тебе надо их склеить. Ну, JOIN для этого и придумали, ёпта. Но не всё так просто — есть же разные способы эту склейку сделать, и от выбора зависит, что в итоге вывалится в результатах.
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;
-- Результат: все юзеры, даже те, кто только зарегался и нихуя не сделал. Справа у них будет NULL — и это нормально, не пугайся.
3. RIGHT JOIN — то же самое, но наоборот Всё как LEFT JOIN, только наоборот: тащим всех из правой таблицы, а левая подтягивается если есть. Честно говоря, я им пользуюсь редко — обычно просто меняю таблицы местами и делаю LEFT JOIN, чтоб голова не болела. Но знать надо, а то на собеседовании спросят — будешь выглядеть как полупидор.
4. FULL JOIN — склейка всего со всем Хочешь получить вообще все записи из обеих таблиц? Вот FULL JOIN тебе в помощь. Он выведет и пользователей без заказов, и заказы без пользователей. Где совпадений нет — будет NULL. В MySQL его нет нативно, но можно сэмулить через UNION — это уже на любителя, конечно. Волнение ебать, когда такой запрос на проде запускаешь.
5. CROSS JOIN — декартово ебалово А вот это, блядь, самая опасная штука. Она тупо перемножает каждую строку первой таблицы на каждую строку второй. Если в первой таблице 1000 записей, а во второй 1000 — получишь миллион строк на выходе. Овердохуища просто. Используй с умом, а то база ляжет и админы тебе впендюрят.
SELECT sizes.size, colors.color
FROM sizes
CROSS JOIN colors;
-- Получишь все комбинации размеров и цветов. Например, "XL красный", "S зелёный" и так далее. Иногда полезно, но чаще — пиздец как нагружает систему.
6. SELF JOIN — когда таблица сама с собой разговаривает Бывает, что нужно соединить таблицу саму с собой. Например, у тебя есть сотрудники и их менеджеры, а менеджеры — тоже сотрудники. Вот тут SELF JOIN выручает.
SELECT e1.name AS employee, e2.name AS manager
FROM employees e1
LEFT JOIN employees e2 ON e1.manager_id = e2.id;
-- Смотри: берём сотрудника e1, ищем его менеджера через manager_id и подтягиваем его имя из той же таблицы, но как будто это другой человек (e2). Если менеджера нет — будет NULL. Всё гениальное просто, да?
Короче, запомни главное: в 90% случаев тебе хватит INNER JOIN и LEFT JOIN. Первый — когда нужны только совпадения, второй — когда надо сохранить всех из основной таблицы, даже если справа нихуя нет. Остальные JOIN'ы — уже на специфические случаи, но знать их тоже надо, а то однажды попадёшь в ситуацию, где без них нихуя не решишь. Удачи, не накосячь!