Что такое оператор JOIN в SQL и какие основные типы существуют?

Ответ

JOIN — это оператор SQL, предназначенный для объединения строк из двух или более таблиц на основе логической связи (условия совпадения) между столбцами этих таблиц.

Основные типы JOIN (на примере таблиц Orders и Customers):

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

    SELECT Orders.OrderID, Customers.CustomerName
    FROM Orders
    INNER JOIN Customers ON Orders.CustomerID = Customers.CustomerID;
  2. LEFT (OUTER) JOIN Возвращает все строки из левой таблицы (Orders) и совпадающие строки из правой. Если совпадения нет, в колонках правой таблицы будут NULL.

    SELECT Orders.OrderID, Customers.CustomerName
    FROM Orders
    LEFT JOIN Customers ON Orders.CustomerID = Customers.CustomerID;
  3. RIGHT (OUTER) JOIN Обратный LEFT JOIN. Возвращает все строки из правой таблицы и совпадающие строки из левой.

  4. FULL (OUTER) JOIN Возвращает все строки, когда есть совпадение либо в левой, либо в правой таблице. Если для строки одной таблицы нет совпадения в другой, недостающие колонки заполняются NULL. (Не поддерживается в MySQL, но может быть эмулирован).

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

    SELECT * FROM Table1 CROSS JOIN Table2;

Практические советы:

  • Для производительности всегда используйте индексы на столбцах, участвующих в условии ON.
  • INNER JOIN — самый распространенный и часто самый эффективный.
  • Четко понимайте бизнес-логику, чтобы выбрать между INNER и LEFT JOIN (нужны ли вам строки без соответствия?).
  • Избегайте CROSS JOIN и сложных соединений многих таблиц в одном запросе, если это возможно — это может серьезно снизить производительность.

Ответ 18+ 🔞

А, JOIN'ы, ну классика же! Это когда тебе надо склеить две таблицы, как два куска хлеба в бутерброд, чтобы между ними что-то осмысленное оказалось. По сути, берёшь строки из одной таблички и примазываешь к ним данные из другой по какому-то общему признаку, типа IDшника.

Смотри, какие бывают эти самые JOIN'ы, на примере заказов и клиентов:

  1. INNER JOIN (Внутреннее соединение) Самый частый гость. Берёт только те записи, где нашлось полное совпадение в ОБЕИХ таблицах. Всё остальное — нахуй в топку, не видит и не показывает.

    SELECT Orders.OrderID, Customers.CustomerName
    FROM Orders
    INNER JOIN Customers ON Orders.CustomerID = Customers.CustomerID;

    Вернёт только заказы, у которых есть прописанный клиент. Если клиент в справочнике удалён — такого заказа ты тут не увидишь.

  2. LEFT JOIN (Левое соединение) А вот это уже интереснее. Он говорит: "Мне ВСЕ заказы с левой таблицы, а из правой таблицы клиентов подтяни, что найдёшь". Если клиента нет — ну и хуй с ним, подставит NULL.

    SELECT Orders.OrderID, Customers.CustomerName
    FROM Orders
    LEFT JOIN Customers ON Orders.CustomerID = Customers.CustomerID;

    Вернёт ВСЕ заказы, даже те, которые висят в воздухе, как проклятые. Клиентское имя для них будет пустым.

  3. RIGHT JOIN (Правое соединение) Это тот же левый JOIN, только наоборот. Все клиенты справа, даже те, которые ни разу не заказывали, и заказы к ним, если есть. Честно говоря, им редко пользуются — обычно просто меняют таблицы местами и делают LEFT JOIN, чтоб не ебать мозг.

  4. FULL OUTER JOIN (Полное внешнее соединение) Это уже раздолье, ёпта! "Дай мне всё, что есть в левой таблице, и всё, что есть в правой. Совпадения склей, а где нет пары — так и покажи, с NULL'ами". В MySQL его нет, но можно схитрить.

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

Пару слов на прощание, чтобы не облажаться:

  • Индексы, блядь, индексы! Без них на больших таблицах JOIN превратится в долгую и мучительную смерть запроса.
  • Чаще всего тебе нужен INNER JOIN. LEFT JOIN — когда специально хочешь видеть хвосты и нестыковки.
  • Перед тем как JOIN'ить, подумай: "А какого хуя я это делаю?" Понимание задачи спасёт от тупых результатов.
  • И ради всего святого, не начинай JOIN'ить всё со всем в одном запросе, особенно через CROSS. Получишь такую ахинею, что сервер просто ляжет и умрёт, а тебя потом найдут и убьют.

Видео-ответы