Что такое оператор UNION в PostgreSQL?

«Что такое оператор UNION в PostgreSQL?» — вопрос из категории Базы данных, который задают на 24% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В PostgreSQL UNION — это оператор для объединения результирующих наборов двух или более SELECT-запросов в один общий набор. Он автоматически удаляет дублирующиеся строки из финального результата.

Синтаксис и ключевые правила:

SELECT column1, column2 FROM table1
UNION
SELECT column1, column2 FROM table2;
  1. Количество и порядок столбцов во всех объединяемых SELECT должны совпадать.
  2. Типы данных соответствующих столбцов должны быть совместимыми (PostgreSQL попытается выполнить неявное приведение типов, если это возможно).
  3. Удаление дубликатов: UNION выполняет сортировку и удаление дублей, что может быть ресурсоемкой операцией на больших наборах данных.

Оператор UNION ALL: Для объединения результатов без удаления дубликатов и, как следствие, быстрее, используется UNION ALL.

SELECT column1, column2 FROM table1
UNION ALL
SELECT column1, column2 FROM table2;

Практические примеры:

Пример 1: Сбор данных из разных таблиц с одинаковой структурой.

-- Получить уникальные имена всех сотрудников и подрядчиков
SELECT first_name FROM employees
UNION
SELECT contractor_name FROM contractors
ORDER BY first_name; -- ORDER BY применяется ко всему итоговому набору

Пример 2: Разделение логики с UNION ALL для производительности.

-- Получить все записи активности за последний день из двух логов,
-- где дубли маловероятны и не критичны.
SELECT user_id, action, created_at FROM ui_logs WHERE created_at >= NOW() - INTERVAL '1 day'
UNION ALL
SELECT user_id, action, created_at FROM api_logs WHERE created_at >= NOW() - INTERVAL '1 day';

Пример 3: Создание "виртуального" набора данных для тестирования или вычислений.

-- Использование UNION с литералами для создания временного набора
SELECT 1 AS id, 'Active' AS status
UNION ALL
SELECT 2, 'Inactive'
UNION ALL
SELECT 3, 'Pending';

Важное замечание: UNION часто используется для запросов к таблицам с разделенной (partitioned) или шардированной структурой, где логически связанные данные физически хранятся в разных таблицах.