Какие типы JOIN используются в SQL?

Ответ

В SQL оператор JOIN используется для объединения строк из двух или более таблиц на основе связанного столбца между ними. Это фундаментальная операция для работы с реляционными базами данных, позволяющая получать комплексные наборы данных из нескольких источников. Существуют следующие основные типы JOIN:

  1. INNER JOIN

    • Назначение: Возвращает только те строки, для которых есть совпадения в обеих таблицах. Это наиболее часто используемый тип JOIN, так как он позволяет получить только релевантные, связанные данные.
    • Пример:
      SELECT Orders.OrderID, Customers.CustomerName
      FROM Orders
      INNER JOIN Customers ON Orders.CustomerID = Customers.CustomerID;
  2. LEFT (OUTER) JOIN

    • Назначение: Возвращает все строки из левой таблицы и совпадающие строки из правой таблицы. Если для строки из левой таблицы нет совпадений в правой, столбцы из правой таблицы будут содержать NULL. Используется, когда нужно получить все данные из одной таблицы, даже если они не имеют соответствий в другой.
    • Пример:
      SELECT Customers.CustomerName, Orders.OrderID
      FROM Customers
      LEFT JOIN Orders ON Customers.CustomerID = Orders.CustomerID;
  3. RIGHT (OUTER) JOIN

    • Назначение: Аналогичен LEFT JOIN, но возвращает все строки из правой таблицы и совпадающие строки из левой таблицы. Если для строки из правой таблицы нет совпадений в левой, столбцы из левой таблицы будут содержать NULL.
    • Пример:
      SELECT Orders.OrderID, Customers.CustomerName
      FROM Orders
      RIGHT JOIN Customers ON Orders.CustomerID = Customers.CustomerID;
  4. FULL (OUTER) JOIN

    • Назначение: Возвращает все строки, когда есть совпадение в одной из таблиц. Если совпадений нет, столбцы из отсутствующей таблицы будут содержать NULL. Объединяет результаты LEFT JOIN и RIGHT JOIN, полезен для анализа всех возможных связей.
    • Пример:
      SELECT Customers.CustomerName, Orders.OrderID
      FROM Customers
      FULL JOIN Orders ON Customers.CustomerID = Orders.CustomerID;
  5. CROSS JOIN

    • Назначение: Создает декартово произведение двух таблиц, то есть каждая строка первой таблицы объединяется с каждой строкой второй таблицы. Используется редко, обычно для генерации всех возможных комбинаций или для тестирования.
    • Пример:
      SELECT Products.ProductName, Colors.ColorName
      FROM Products
      CROSS JOIN Colors;
  6. SELF JOIN

    • Назначение: Это не отдельный тип JOIN, а техника, при которой таблица объединяется сама с собой. Используется для сравнения строк внутри одной таблицы или для работы с иерархическими данными (например, поиск менеджера для сотрудника в таблице сотрудников).
    • Пример:
      SELECT E1.Name AS EmployeeName, E2.Name AS ManagerName
      FROM Employees E1
      JOIN Employees E2 ON E1.ManagerID = E2.EmployeeID;

Примечание: Ключевое слово OUTER в LEFT JOIN, RIGHT JOIN и FULL JOIN является необязательным и часто опускается.

Ответ 18+ 🔞

Э, слушай, а вот этот ваш SQL, блядь... Ну, JOIN, понимаешь? Это ж как в жизни, сука! Хочешь данные из двух таблиц получить — их надо, блядь, поженить как-то, связать! А то сидят они по разным углам базы, как два дурака на диване, и нихуя не происходит.

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

1. INNER JOIN Это как честный брак по любви, блядь. Берёшь левую таблицу, правую таблицу и соединяешь ТОЛЬКО там, где у них ключи совпали. Всё, что без пары — нахуй не нужно, в результат не попадает. Самый частый, рабочий вариант.

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

Вот видишь? Заказы только с теми клиентами, которые реально есть. Если клиент призрак — его заказы нам, блядь, не интересны.

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

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

Тут мы получим ВСЕХ клиентов, даже тех, кто нихуя не заказывал. И на месте OrderID у них будет гордый NULL. Дармоеды, блядь.

3. RIGHT (OUTER) JOIN Та же хуйня, только наоборот. Всех уродов из правой таблицы тащим в результат, а из левой — только если они с ними сошлись. Используется реже, потому что, ну, кто так пишет, блядь? Обычно LEFT JOIN'ом ту же логику можно сделать, переставив таблицы местами. Но для полноты картины пусть будет.

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

4. FULL (OUTER) JOIN О, это пиздец, ядрёна вошь! Берём ВСЕХ И ВСЯ! И из левой, и из правой. Сошлись — красота. Не сошлись — ну и хуй с ним, будут NULL'ы с той или иной стороны. Полная картина всех возможных связей и одиночек. Как общага после отбоя — кто-то пару нашёл, а кто-то один сидит.

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

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

SELECT Products.ProductName, Colors.ColorName
FROM Products
CROSS JOIN Colors;

Сделаешь это на больших таблицах — сервер ляжет, а ты будешь сидеть и думать: «Нахуя я это сделал?».

6. SELF JOIN А это, сука, когда таблица сама с собой соединяется, как нарцисс у зеркала! Часто нужно, когда в одной таблице есть ссылки на другие строки из этой же таблицы. Ну, типа, сотрудники и их менеджеры, которые тоже сотрудники.

SELECT E1.Name AS EmployeeName, E2.Name AS ManagerName
FROM Employees E1
JOIN Employees E2 ON E1.ManagerID = E2.EmployeeID;

Смотри, мы как бы создаём два экземпляра одной таблицы (E1 и E2) и соединяем их. Из E1 берём работника, а из E2 — его начальника. Хитро, блядь, да?

Короче, вот тебе и вся магия. Главное — не путать, когда тебе нужны все записи даже без пары (LEFT), а когда только те, у кого пары есть (INNER). Ошибёшься — получишь не те данные и потом будешь ебаться, как Герасим с Муму.