Ответ
JOIN — это оператор SQL, предназначенный для объединения строк из двух или более таблиц на основе логической связи (условия совпадения) между столбцами этих таблиц.
Основные типы JOIN (на примере таблиц Orders и Customers):
-
INNER JOIN Возвращает только те строки, где есть совпадение в обеих таблицах.
SELECT Orders.OrderID, Customers.CustomerName FROM Orders INNER JOIN Customers ON Orders.CustomerID = Customers.CustomerID; -
LEFT (OUTER) JOIN Возвращает все строки из левой таблицы (
Orders) и совпадающие строки из правой. Если совпадения нет, в колонках правой таблицы будутNULL.SELECT Orders.OrderID, Customers.CustomerName FROM Orders LEFT JOIN Customers ON Orders.CustomerID = Customers.CustomerID; -
RIGHT (OUTER) JOIN Обратный
LEFT JOIN. Возвращает все строки из правой таблицы и совпадающие строки из левой. -
FULL (OUTER) JOIN Возвращает все строки, когда есть совпадение либо в левой, либо в правой таблице. Если для строки одной таблицы нет совпадения в другой, недостающие колонки заполняются
NULL. (Не поддерживается в MySQL, но может быть эмулирован). -
CROSS JOIN Возвращает декартово произведение таблиц — каждая строка первой таблицы соединяется с каждой строкой второй. Используется редко, требует осторожности.
SELECT * FROM Table1 CROSS JOIN Table2;
Практические советы:
- Для производительности всегда используйте индексы на столбцах, участвующих в условии
ON. INNER JOIN— самый распространенный и часто самый эффективный.- Четко понимайте бизнес-логику, чтобы выбрать между
INNERиLEFT JOIN(нужны ли вам строки без соответствия?). - Избегайте
CROSS JOINи сложных соединений многих таблиц в одном запросе, если это возможно — это может серьезно снизить производительность.
Ответ 18+ 🔞
А, JOIN'ы, ну классика же! Это когда тебе надо склеить две таблицы, как два куска хлеба в бутерброд, чтобы между ними что-то осмысленное оказалось. По сути, берёшь строки из одной таблички и примазываешь к ним данные из другой по какому-то общему признаку, типа IDшника.
Смотри, какие бывают эти самые JOIN'ы, на примере заказов и клиентов:
-
INNER JOIN (Внутреннее соединение) Самый частый гость. Берёт только те записи, где нашлось полное совпадение в ОБЕИХ таблицах. Всё остальное — нахуй в топку, не видит и не показывает.
SELECT Orders.OrderID, Customers.CustomerName FROM Orders INNER JOIN Customers ON Orders.CustomerID = Customers.CustomerID;Вернёт только заказы, у которых есть прописанный клиент. Если клиент в справочнике удалён — такого заказа ты тут не увидишь.
-
LEFT JOIN (Левое соединение) А вот это уже интереснее. Он говорит: "Мне ВСЕ заказы с левой таблицы, а из правой таблицы клиентов подтяни, что найдёшь". Если клиента нет — ну и хуй с ним, подставит NULL.
SELECT Orders.OrderID, Customers.CustomerName FROM Orders LEFT JOIN Customers ON Orders.CustomerID = Customers.CustomerID;Вернёт ВСЕ заказы, даже те, которые висят в воздухе, как проклятые. Клиентское имя для них будет пустым.
-
RIGHT JOIN (Правое соединение) Это тот же левый JOIN, только наоборот. Все клиенты справа, даже те, которые ни разу не заказывали, и заказы к ним, если есть. Честно говоря, им редко пользуются — обычно просто меняют таблицы местами и делают LEFT JOIN, чтоб не ебать мозг.
-
FULL OUTER JOIN (Полное внешнее соединение) Это уже раздолье, ёпта! "Дай мне всё, что есть в левой таблице, и всё, что есть в правой. Совпадения склей, а где нет пары — так и покажи, с NULL'ами". В MySQL его нет, но можно схитрить.
-
CROSS JOIN (Перекрёстное соединение) О, это охуенно! Это когда ты тупо берёшь каждую строчку из первой таблицы и приклеиваешь к КАЖДОЙ строчке из второй. Получается декартово произведение, а если таблицы хоть чуть больше игрушечных — запрос начинает жрать память и время, как не в себя. Используй с умом, а лучше вообще не используй без явной надобности.
Пару слов на прощание, чтобы не облажаться:
- Индексы, блядь, индексы! Без них на больших таблицах JOIN превратится в долгую и мучительную смерть запроса.
- Чаще всего тебе нужен INNER JOIN. LEFT JOIN — когда специально хочешь видеть хвосты и нестыковки.
- Перед тем как JOIN'ить, подумай: "А какого хуя я это делаю?" Понимание задачи спасёт от тупых результатов.
- И ради всего святого, не начинай JOIN'ить всё со всем в одном запросе, особенно через CROSS. Получишь такую ахинею, что сервер просто ляжет и умрёт, а тебя потом найдут и убьют.
Видео-ответы
▶
▶
▶
▶
▶
▶
▶
▶
▶
▶
▶
▶
▶
▶
▶