Каковы основные компоненты и типы оператора JOIN в SQL?

Ответ

Оператор JOIN в SQL используется для объединения строк из двух или более таблиц на основе логической связи между ними.

Структура JOIN-запроса:

  1. Ключевое слово типа соединения: INNER, LEFT [OUTER], RIGHT [OUTER], FULL [OUTER], CROSS.
  2. Имя присоединяемой таблицы.
  3. Условие соединения: Ключевое слово ON с предикатом или USING для столбцов с одинаковыми именами.

Основные типы JOIN:

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

    SELECT orders.id, customers.name
    FROM orders
    INNER JOIN customers ON orders.customer_id = customers.id;
  • LEFT (OUTER) JOIN: Возвращает все строки из левой таблицы и совпадающие из правой. При отсутствии совпадения поля правой таблицы будут NULL.

    SELECT employees.name, departments.name AS dept_name
    FROM employees
    LEFT JOIN departments ON employees.dept_id = departments.id;
  • RIGHT JOIN и FULL JOIN: Аналогичны LEFT JOIN, но приоритет отдается правой таблице или возвращаются все строки из обеих таблиц соответственно.

  • CROSS JOIN: Возвращает декартово произведение (все возможные комбинации строк).

  • SELF JOIN: Соединение таблицы с самой собой (требуется использование псевдонимов).

    SELECT e1.name AS employee, e2.name AS manager
    FROM employees e1
    LEFT JOIN employees e2 ON e1.manager_id = e2.id;

Почему важен правильный выбор типа JOIN? INNER JOIN фильтрует данные, а LEFT JOIN сохраняет все записи основной таблицы, что критично для отчетов, где нужно видеть все сущности, даже без связанных данных.

Ответ 18+ 🔞

Давай разжую тебе про эти ваши JOIN'ы, а то смотрю, народ путается, как в тёмной комнате хуй с пальцем. Представь, что у тебя есть две таблицы — как два стола с бумажками. На одном — заказы, на другом — клиенты. И тебе надо их склеить, чтобы понять, кто что заказал. Вот для этого и нужен JOIN, а не чтобы мозги ебать.

Смотри, структура проще, чем кажется:

  1. Сначала говоришь, как склеивать: INNER, LEFT, RIGHT, FULL или CROSS (последний — это вообще отдельная песня, про него позже).
  2. Потом — какую таблицу присобачиваем.
  3. И наконец, по какому признаку их сродняешь: через ON с условием или USING, если столбцы называются одинаково.

Основные типы, без которых нихуя не сделаешь:

  • INNER JOIN: Самый частый, жадный до совпадений. Берёт только те строки, где есть связь в обеих таблицах. Если у заказа нет клиента или у клиента нет заказов — нихуя не увидишь.

    SELECT orders.id, customers.name
    FROM orders
    INNER JOIN customers ON orders.customer_id = customers.id;
  • LEFT JOIN: Вот это уже интереснее. Он возвращает всё из левой таблицы (той, что в FROM), а из правой — только то, что совпало. Нет совпадения? Получаешь NULL, и сидишь думаешь, почему этот сотрудник без отдела, как манда с ушами.

    SELECT employees.name, departments.name AS dept_name
    FROM employees
    LEFT JOIN departments ON employees.dept_id = departments.id;
  • RIGHT JOIN и FULL JOIN: RIGHT — это тот же LEFT, только наоборот, приоритет правой таблице. А FULL — вообще анархист, выдаёт всё из обеих, совпало там что-то или нет. В жизни RIGHT используют редко, потому что можно просто таблицы местами поменять и сделать LEFT.

  • CROSS JOIN: О, это ебать мои старые костыли! Декартово произведение, блядь. Каждую строку из первой таблицы соединяет с каждой строкой из второй. Получается овердохуища записей. Полезно, только если ты специально хочешь сгенерировать все возможные комбинации, а не просто так, от нехуй делать.

  • SELF JOIN: Когда таблица должна соединиться сама с собой. Например, чтобы найти, кто чей начальник. Без псевдонимов (aliases) тут вообще нихуя не получится, запутаешься, как муха в паутине.

    SELECT e1.name AS employee, e2.name AS manager
    FROM employees e1
    LEFT JOIN employees e2 ON e1.manager_id = e2.id;

А теперь главное, нахуй: выбор типа JOIN — это не просто так, "а давайте вот это". Если выберешь INNER, когда нужен LEFT, ты потеряешь кучу данных, которые просто не совпали. Например, всех клиентов, которые ещё ничего не купили. А если наоборот, LEFT вместо INNER, — натащишь кучу NULL'ов и потом будешь ебаться с фильтрацией. Так что думай, что тебе нужно: строгий отбор совпадений или сохранение всей исходной картины, даже с дырами.