Какие основные виды JOIN в SQL?

Ответ

JOIN — операция для объединения строк из двух или более таблиц на основе связанного столбца.

Основные виды:

  1. INNER JOIN

    • Возвращает только те строки, где есть совпадение в обеих таблицах.
      SELECT users.name, orders.amount
      FROM users
      INNER JOIN orders ON users.id = orders.user_id;
  2. LEFT (OUTER) JOIN

    • Возвращает все строки из левой таблицы и совпадающие строки из правой. При отсутствии совпадений в правой таблице возвращаются NULL.
      SELECT users.name, orders.amount
      FROM users
      LEFT JOIN orders ON users.id = orders.user_id;
      -- Покажет всех пользователей, даже без заказов
  3. RIGHT (OUTER) JOIN

    • Аналогичен LEFT JOIN, но приоритет отдается правой таблице. Используется реже.
  4. FULL (OUTER) JOIN

    • Возвращает все строки из обеих таблиц. Если совпадения нет, для недостающих столбцов подставляется NULL.
  5. CROSS JOIN

    • Возвращает декартово произведение таблиц — каждая строка первой таблицы соединяется с каждой строкой второй.
      SELECT sizes.size, colors.color
      FROM sizes
      CROSS JOIN colors;
      -- Все комбинации размеров и цветов
  6. 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). А Петя, пидарас шерстяной, сам на кого работает? Вот тут и выяснится.

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