← Назад к вопросам

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

2.0 Middle🔥 241 комментариев
#Базы данных и SQL

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Разница между UNION и JOIN в SQL

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

Оператор JOIN (Соединение таблиц)

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

Основные типы JOIN (на примере таблиц Employees (id, name, dept_id)иDepartments (id, dept_name)):

-- INNER JOIN: только совпадающие строки из обеих таблиц
SELECT e.name, d.dept_name
FROM Employees e
INNER JOIN Departments d ON e.dept_id = d.id;

-- LEFT JOIN: все строки из левой таблицы + совпадения справа
SELECT e.name, d.dept_name
FROM Employees e
LEFT JOIN Departments d ON e.dept_id = d.id;

-- FULL OUTER JOIN: все строки из обеих таблиц
SELECT e.name, d.dept_name
FROM Employees e
FULL OUTER JOIN Departments d ON e.dept_id = d.id;

Ключевые особенности JOIN:

  • Объединяет таблицы по условию (ON или USING).
  • Увеличивает количество столбцов в результате.
  • Количество строк зависит от типа соединения и наличия совпадений.
  • Столбцы в результирующем наборе могут быть из любой из объединенных таблиц.

Оператор UNION (Объединение наборов результатов)

UNION используется для объединения результатов двух или более SELECT-запросов в один набор данных. Запросы должны иметь одинаковое количество столбцов с совместимыми типами данных. UNION работает как операция над множествами, по умолчанию удаляя дубликаты строк.

-- Выбираем список всех городов из таблиц клиентов и поставщиков
SELECT city FROM Customers
UNION -- Удалит дубликаты городов
SELECT city FROM Suppliers
ORDER BY city;

-- UNION ALL: сохранит все дубликаты, работает быстрее
SELECT city FROM Customers
UNION ALL
SELECT city FROM Suppliers;

Ключевые особенности UNION:

  • Объединяет результаты запросов, а не таблицы напрямую.
  • Увеличивает количество строк в результате.
  • Столбцы в каждом SELECT должны совпадать по количеству, порядку и типу.
  • Имена столбцов в результате берутся из первого SELECT-запроса.
  • Существует UNION ALL для более быстрого объединения без проверки на дубликаты.

Сводная таблица различий

КритерийJOINUNION
НазначениеСвязать данные из разных таблиц по ключуСложить данные из похожих наборов "столбец-в-столбец"
НаправлениеГоризонтальное (добавляет столбцы)Вертикальное (добавляет строки)
УсловиеТребуется условие соединения ON/USINGНе требует условия соединения
СтруктураСтолбцы могут быть любымиВсе SELECT должны иметь одинаковую структуру
ДубликатыСохраняются (являются разными записями)UNION удаляет, UNION ALL сохраняет
АналогияСклеить два листа бумаги по горизонталиСложить стопку одинаковых бланков

Практический пример из тестирования (QA Perspective)

Представьте, что вы тестируете отчет. Вам нужно проверить данные:

  • Сценарий для JOIN: Вам нужно проверить полную информацию о заказе: данные из таблицы Orders (номер, дата) и данные клиента из таблицы Customers (имя, адрес). Вы используете JOIN, чтобы связать заказы с клиентами по customer_id и убедиться, что в отчете корректно отображаются связанные данные.

    -- Проверка целостности данных для отчета "Детали заказа"
    SELECT o.id, o.order_date, c.name, c.email
    FROM test_orders o
    JOIN test_customers c ON o.customer_id = c.id
    WHERE o.id = 12345;
    
  • Сценарий для UNION: Вам нужно создать общий справочник всех контрагентов системы для выгрузки. Вы хотите получить единый список всех email-адресов, которые есть и среди клиентов, и среди поставщиков.

    -- Создание общего списка контактов для рассылки (тест данных)
    SELECT 'Customer' as type, email FROM test_customers WHERE email IS NOT NULL
    UNION ALL
    SELECT 'Supplier' as type, email FROM test_suppliers WHERE email IS NOT NULL
    ORDER BY type;
    

Вывод для QA-инженера: Понимание разницы между UNION и JOIN критически важно для:

  1. Написания корректных проверочных запросов при тестировании целостности данных и сложных отчетов.
  2. Анализа результатов выполнения запросов.
  3. Поиска причин дефектов, связанных с некорректным отображением объединенных данных (например, когда разработчик по ошибке использовал UNION вместо JOIN или наоборот).
  4. Эффективной работы с базой данных при создании тестовых дата-сетов.
В чем разница между UNION и JOIN? | PrepBro