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

Что сравнивает union

1.8 Middle🔥 121 комментариев
#Soft skills и карьера

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

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

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

Union в контексте SQL и тестирования

В SQL оператор UNION сравнивает и объединяет результаты двух или более SELECT-запросов по принципу объединения множеств из теории множеств. Основная цель — сравнить строки из разных таблиц или запросов по их полному составу данных (по всем столбцам в выборке) и вернуть объединённый набор уникальных строк.

Что именно сравнивает UNION?

  1. Сравнение всей строки как единого множества данных. UNION выполняет сравнение не по одному полю, а по всей комбинации значений всех столбцов, включенных в SELECT. Две строки считаются одинаковыми и будут "схлопнуты" в одну в финальном результате только если все значения во всех столбцах полностью идентичны.

  2. Типы данных и порядок столбцов. Для успешного сравнения и объединения критически важны два условия:

    *   **Количество столбцов** в каждом SELECT-запросе должно совпадать.
    *   **Типы данных** соответствующих столбцов (или их возможность быть преобразованными) должны быть совместимы. Порядок столбцов также имеет значение — сравнение происходит "по позиции": первый столбец первого запроса сравнивается с первым столбцом второго запроса, второй со вторым, и так далее.

Пример и демонстрация сравнения

Рассмотрим две таблицы: employees_usa и employees_europe.

-- Таблица 1: employees_usa
SELECT id, full_name, department FROM employees_usa;
-- Результат:
| id | full_name   | department  |
|----|-------------|-------------|
| 1  | John Doe    | Engineering |
| 2  | Jane Smith  | Sales       |
| 3  | Alex Brown  | Engineering |

-- Таблица 2: employees_europe
SELECT id, full_name, department FROM employees_europe;
-- Результат:
| id | full_name     | department  |
|----|---------------|-------------|
| 2  | Jane Smith    | Sales       | -- Совпадает со строкой из USA
| 4  | Maria Garcia  | Marketing   |
| 5  | Alex Brown    | Support     | -- Имя совпадает, но department другой!

Применяем UNION:

SELECT id, full_name, department FROM employees_usa
UNION
SELECT id, full_name, department FROM employees_europe
ORDER BY id;

Результат UNION:

| id | full_name     | department  |
|----|---------------|-------------|
| 1  | John Doe      | Engineering |
| 2  | Jane Smith    | Sales       | -- Одна уникальная строка, дубли удалены!
| 3  | Alex Brown    | Engineering |
| 4  | Maria Garcia  | Marketing   |
| 5  | Alex Brown    | Support     |

Анализ сравнения, выполненного UNION:

  • Строка (2, 'Jane Smith', 'Sales') присутствует в обеих исходных выборках. Все три значения (id=2, full_name='Jane Smith', department='Sales') идентичны. Поэтому UNION сравнил их как полные наборы данных, признал дубль и включил в финальный результат только одну уникальную строку.
  • Строки с full_name='Alex Brown' не были признаны дублями, потому что сравнение проводилось по всем столбцам. Для id=3 department Engineering, а для id=5 department Support. Состав данных разный, значит, строки разные.

Ключевые отличия от похожих операторов (UNION ALL, JOIN)

  • UNION vs UNION ALL: UNION ALL также объединяет результаты, но НЕ выполняет сравнение для удаления дубликатов. Он просто конкатенирует все строки. Если в примере выше использовать UNION ALL, в результате будет две строки для Jane Smith. UNION — это сравнение + объединение уникальных, UNION ALL — просто объединение.

    SELECT id, full_name, department FROM employees_usa
    UNION ALL
    SELECT id, full_name, department FROM employees_europe;
    -- Строка (2, 'Jane Smith', 'Sales') появится дважды.
    
  • UNION vs JOIN: JOIN (например, INNER JOIN) сравнивает значения указанных столбцов (через условие ON) между таблицами и создаёт новые строки, комбинируя данные из обеих таблиц. UNION не создаёт комбинации, он складывает "вертикально" независимые наборы строк, сравнивая их целиком.

Практическое применение и тестирование

Для QA Engineer понимание UNION важно в нескольких контекстах:

  1. Тестирование отчетов и аналитических функций: Многие отчеты в приложениях строятся на сложных SQL-запросах, часто использующих UNION для объединения данных из различных логических разделов (например, "активные пользователи" + "новые пользователи").
  2. Валидация данных и проверка консистентности: Можно использовать UNION для сравнения данных из двух источников (например, основной БД и таблицы-выгрузки). Если ожидается, что данные должны быть уникальными, но UNION возвращает меньше строк, чем UNION ALL, это явный признак наличия дубликатов, требующих исследования.
  3. Написание проверок в тестовых сценариях: При автоматизации тестов через базу данных можно напрямую проверять корректность бизнес-операций.
    -- Пример проверки: после миграции пользователей из старой системы в новую,
    -- общее количество уникальных пользователей должно остаться неизменным.
    SELECT COUNT(*) FROM (
        SELECT user_id, email FROM legacy_system_users
        UNION
        SELECT user_id, email FROM new_system_users
    ) AS combined_users;
    -- Этот COUNT должен равняться сумме COUNT из каждой системы,
    -- если дубликатов (одинаковых user_id и email) нет.
    

Основной вывод: UNION сравнивает целые строки (все столбцы из выборки) на предмет полной идентичности с целью формирования множества уникальных записей из нескольких источников. Это фундаментальный оператор для работы с множествами данных в SQL, и его корректное функционирование — важная точка внимания при тестировании данных и бизнес-логики, связанной с агрегацией информации.