Ответ
JOIN — это операция SQL, которая позволяет комбинировать строки из двух или более таблиц на основе связанного между ними столбца (ключа).
Основные типы JOIN (на примере таблиц Users и Orders):
| Тип JOIN | Описание | Визуализация (результат содержит...) |
|---|---|---|
INNER JOIN |
Возвращает только те записи, где есть совпадение в обеих таблицах. | Пересечение множеств. |
LEFT (OUTER) JOIN |
Возвращает все записи из левой таблицы и совпадающие записи из правой. Если совпадения нет, в правой части — NULL. |
Вся левая таблица + пересечение. |
RIGHT (OUTER) JOIN |
Возвращает все записи из правой таблицы и совпадающие записи из левой. Если совпадения нет, в левой части — NULL. |
Вся правая таблица + пересечение. |
FULL (OUTER) JOIN |
Возвращает все записи, когда есть совпадение в левой или правой таблице. Отсутствующие совпадения заполняются NULL. |
Объединение левой и правой таблиц. |
CROSS JOIN |
Возвращает декартово произведение таблиц — все возможные комбинации строк. | Все строки A × все строки B. |
Пример INNER JOIN:
SELECT Users.name, Orders.order_id, Orders.amount
FROM Users
INNER JOIN Orders ON Users.id = Orders.user_id;
-- Результат: только пользователи, у которых есть заказы.
Пример LEFT JOIN:
SELECT Users.name, Orders.order_id
FROM Users
LEFT JOIN Orders ON Users.id = Orders.user_id;
-- Результат: ВСЕ пользователи, даже если у них нет заказов.
-- Для пользователей без заказов order_id будет NULL.
Выбор типа JOIN зависит от того, какие данные необходимо получить: только связанные записи или все записи из одной таблицы независимо от наличия связей.
Ответ 18+ 🔞
А, блядь, JOIN! Ну это ж классика, ёпта, основа основ, а половина народа её как об стенку горох! Слушай сюда, сейчас разжую, как для дебила, но ты не обижайся.
Представь, что у тебя есть две таблицы. Одна — Users, типа список мужиков в баре. Другая — Orders, это список заказов, кто сколько пива накидал. И вот тебе надо их скрестить, чтобы понять, кто пиво пьёт, а кто просто стул греет.
INNER JOIN — это как самый строгий вышибала. Он пропустит только тех, у кого и в списке гостей (Users) запись есть, и в списке заказов (Orders) чек наличествует. Нет заказа — пошёл нахуй, не вижу тебя. Чистое пересечение, деловое.
LEFT JOIN — это уже подкупленный бармен. Он тебе всех мужиков из списка гостей (Users) покажет, даже если они воду минеральную пьют. А если заказа у какого-то лоха нет, то в графе «заказ» будет написано NULL. Типа, «сидит, блядь, место занимает».
RIGHT JOIN — это та же самая хуйня, только наоборот. Все заказы (Orders) будут, даже если чувак, который их сделал, уже свалил и из списка гостей (Users) его вычеркнули. Рядом с таким заказом в графе «имя» будет NULL. Призрак какой-то, блядь.
FULL OUTER JOIN — это полный пиздец и бардак. Он вывалит на тебя вообще всё: и всех гостей, и все заказы. Кто совпал — молодца, кто нет — так и будет висеть с NULL напротив. Полная картина, хоть и ебола.
CROSS JOIN — это, сука, декартово произведение, ёпта! Он возьмёт каждого мужика из первой таблицы и женит его на каждой записи из второй. Если в первой таблице 10 строк, а во второй 5, получишь 50 строк ебанистических комбинаций. Обычно это случайно выходит, когда забываешь прописать ON, и потом охуеваешь от результата.
SELECT Users.name, Orders.order_id, Orders.amount
FROM Users
INNER JOIN Orders ON Users.id = Orders.user_id;
-- Видишь? Только те, кто и есть, и заказал. Остальные — в пизду.
SELECT Users.name, Orders.order_id
FROM Users
LEFT JOIN Orders ON Users.id = Orders.user_id;
-- А тут все юзеры как на ладони. Даже Петрович, который второй час сидит и в телефоне тырит.
-- У него order_id будет NULL, хитрая жопа.
Короче, выбирай тип JOIN, исходя из того, какую дичь ты хочешь увидеть: только честных плательщиков, всех посетителей, все заказы или полный хаос. Главное — не перепутай, а то насчитаешь себе овердохуища не тех данных.