В чем разница между операторами SQL UNION и JOIN?

Ответ

UNION и JOIN — это операторы для комбинирования данных, но они работают в разных плоскостях.

  • JOIN объединяет таблицы по горизонтали (добавляет столбцы), связывая строки по условию совпадения значений в связанных столбцах.
  • UNION объединяет результаты запросов по вертикали (добавляет строки), складывая наборы записей один под другим.

Визуализация:

JOIN (Горизонтальное объединение):
Таблица A: [id, name]      Таблица B: [id, city]
        JOIN ON A.id = B.id
Результат: [id, name, city]

UNION (Вертикальное объединение):
Запрос 1: [id, name] из Таблицы X
        UNION
Запрос 2: [id, name] из Таблицы Y
Результат: [id, name] (все строки из X и Y)

Ключевые отличия:

Параметр JOIN UNION
Направление Горизонтальное (столбцы) Вертикальное (строки)
Условие ON / USING (ключи связи) Совпадение количества, порядка и типов столбцов
Дубликаты Сохраняются (каждая комбинация) Удаляются (если не UNION ALL)
Структура Результирующая таблица содержит столбцы из всех исходных таблиц Результирующая таблица имеет такую же структуру, как каждый из запросов

Пример JOIN (INNER JOIN):

-- Объединяем заказы с информацией о клиентах
SELECT o.order_id, o.amount, c.customer_name
FROM orders o
JOIN customers c ON o.customer_id = c.id;

Пример UNION:

-- Объединяем списки email из разных источников
SELECT email FROM current_clients
UNION -- Удалит повторяющиеся email
SELECT email FROM archived_clients
ORDER BY email;

-- Чтобы сохранить дубликаты, используем UNION ALL
SELECT email FROM current_clients
UNION ALL
SELECT email FROM archived_clients;

Практическое правило: Используйте JOIN, когда нужно дополнить строку данными из другой таблицы. Используйте UNION, когда нужно объединить похожие наборы записей из разных источников.

Ответ 18+ 🔞

А, ну это же классика, блядь! Вечная путаница, как в бане с вениками. Слушай сюда, сейчас разложу по полочкам, а то голова кругом идёт.

Представь, что у тебя есть две таблицы. Одна — про клиентов, другая — про их заказы. JOIN — это когда ты, сука, берёшь строку про клиента и приклеиваешь к ней справа данные из его заказа. Горизонтально, блядь! Получается одна жирная строка с информацией и оттуда, и отсюда. Без этого оператора мы бы, как слепые кроты, тыкались носом в разрозненные данные.

А вот UNION — это совсем другая, блядь, операция. Это когда у тебя, допустим, список email'ов из таблицы активных клиентов и точно такой же список из таблицы архивных клиентов. И тебе надо их свалить в одну кучу, один под другим. Вертикально, ёпта! Как два мешка картошки высыпать в один большой. Главное, чтобы в каждом мешке картошка была одного сорта — то есть столбцы в запросах одинаковые по типу и количеству, иначе SQL тебе мозги выест.

Проще говоря:

  • JOIN — «расширь мне эту строку, добавь данных из соседней таблицы».
  • UNION — «собери все строки отсюда и оттуда и покажи мне одним списком».

Вот смотри на примерах, тут всё понятно становится, как божий день.

Пример JOIN (самый частый случай):

-- Берём заказы, находим, какому клиенту они принадлежат, и склеиваем в одну строку
SELECT o.id, o.total, c.name, c.phone
FROM orders o
JOIN customers c ON o.customer_id = c.id;

Видишь? Из заказа (o) мы взяли id и total, а из клиентов (c) — name и phone. Всё слилось в одну широкую запись. Красота!

Пример UNION (когда нужно сгрести всё в кучу):

-- Хотим получить ВСЕ уникальные email и из новых, и из старых рассылок
SELECT email FROM newsletter_subscribers
UNION -- Автоматом выкинет повторы, как мусор!
SELECT email FROM legacy_mailing_list
ORDER BY email;

-- А если повторы нам не враги и мы хотим ВСЁ, даже дубли
SELECT email FROM current_week_logs
UNION ALL -- Ничего не выкидываем, валим всё подряд
SELECT email FROM previous_week_logs;

Вот и вся магия. JOIN склеивает по бокам, UNION ставит сверху. Запомни это, и половина твоих проблем с SQL нахуй испарится.