Ответ
JOIN — операция для объединения строк из двух или более таблиц на основе связанного столбца.
Основные виды:
-
INNER JOIN
- Возвращает только те строки, где есть совпадение в обеих таблицах.
SELECT users.name, orders.amount FROM users INNER JOIN orders ON users.id = orders.user_id;
- Возвращает только те строки, где есть совпадение в обеих таблицах.
-
LEFT (OUTER) JOIN
- Возвращает все строки из левой таблицы и совпадающие строки из правой. При отсутствии совпадений в правой таблице возвращаются
NULL.SELECT users.name, orders.amount FROM users LEFT JOIN orders ON users.id = orders.user_id; -- Покажет всех пользователей, даже без заказов
- Возвращает все строки из левой таблицы и совпадающие строки из правой. При отсутствии совпадений в правой таблице возвращаются
-
RIGHT (OUTER) JOIN
- Аналогичен
LEFT JOIN, но приоритет отдается правой таблице. Используется реже.
- Аналогичен
-
FULL (OUTER) JOIN
- Возвращает все строки из обеих таблиц. Если совпадения нет, для недостающих столбцов подставляется
NULL.
- Возвращает все строки из обеих таблиц. Если совпадения нет, для недостающих столбцов подставляется
-
CROSS JOIN
- Возвращает декартово произведение таблиц — каждая строка первой таблицы соединяется с каждой строкой второй.
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;
- Соединение таблицы с самой собой (часто через псевдонимы). Используется для работы с иерархическими данными.
Ответ 18+ 🔞
А, слушай, смотри, вот этот ваш JOIN, блядь... Это ж как в жизни, понимаешь? Хочешь данные из двух таблиц склеить — ну, типа, список пользователей и их заказов. Так вот, есть у нас варианты, как это сделать, и каждый — отдельная история, блядь.
Смотри, самый частый гость — INNER JOIN. Это как два приличных человека договорились встретиться. Вернёт он только те строки, где есть совпадение в обеих таблицах. Кто не пришёл — тот хуй с горы, его в выдаче нет.
SELECT users.name, orders.amount
FROM users
INNER JOIN orders ON users.id = orders.user_id;
А вот LEFT JOIN — это уже драма, ёпта. Он возвращает всех из левой таблицы, даже самых распиздяев, которые заказов не делали. А из правой — только тех, кто совпал. Кто не совпал — там будет NULL, пустота, грусть-тоска.
SELECT users.name, orders.amount
FROM users
LEFT JOIN orders ON users.id = orders.user_id;
-- Вот тут покажет всех юзеров, даже того Ваську, который нихуя не купил, а только в корзине тыкал.
RIGHT JOIN — это то же самое, только наоборот, приоритет правой таблице. Но его редко используют, честно говоря, обычно левым обходятся, переставив таблицы местами. Ну, на любителя, блядь.
FULL OUTER JOIN — это уже полный пиздец и бардак, извини за выражение. Он вывалит ВСЕХ и оттуда, и отсюда. Кто нашёл пару — молодцы, кто нет — у того в соседних колонках NULL красуется. Типа общая тусовка, все приглашены.
А вот CROSS JOIN — это, блядь, декартово произведение, ебать мои старые костыли! Каждую строку из первой таблицы склеивает с КАЖДОЙ строкой из второй. Ну, типа, все размеры со всеми цветами.
SELECT sizes.size, colors.color
FROM sizes
CROSS JOIN colors;
-- Получишь 'XL красный', 'XL синий', 'L красный'... Овердохуища комбинаций!
И наконец, 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) работает на Петю (e2). А Петя, пидарас шерстяной, сам на кого работает? Вот тут и выяснится.
Вот и вся магия, блядь. Главное — не перепутать, когда кого вызывать, а то вместо списка клиентов получишь ебанистическое месиво из всех со всеми.