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

Ответ

В 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) или шардированной структурой, где логически связанные данные физически хранятся в разных таблицах.

Ответ 18+ 🔞

Слушай, вот объясняю, как работает UNION в PostgreSQL, чтобы ты не накосячил. Это оператор, который склеивает результаты нескольких SELECT-запросов в одну общую кучу. Главная фишка — он автоматически выкидывает все повторяющиеся строки, как будто у тебя в кармане три одинаковых чека, а ты оставляешь один. Ёпта, удобно же.

Как это выглядит и что важно помнить:

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

Вот на что надо смотреть, а то потом охуеешь от ошибок:

  1. Количество и порядок столбцов во всех SELECT должны быть одинаковые. Нельзя в первом запросе выбрать три поля, а во втором — пять, иначе будет пиздец.
  2. Типы данных в соответствующих столбцах должны быть совместимы. PostgreSQL попробует их подружить, если сможет, но лучше не надеяться на авось.
  3. Удаление дубликатов — это ресурсы. Операция не бесплатная, база будет сортировать и сравнивать, чтобы выкинуть повторы. На больших данных это может быть овердохуища затратно.

А есть же UNION ALL, хитрая жопа! Если тебе не нужно вычищать дубли, а просто слить всё в одну кучу — используй UNION ALL. Он работает быстрее, потому что не парится с поиском одинаковых строк.

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

Теперь примеры из жизни, чтобы было понятно:

Пример 1: Собрать всех людей в одном списке. Допустим, у тебя есть штатные сотрудники и подрядчики в разных таблицах. Хочешь получить один алфавитный список имён — вот тебе UNION.

-- Берём уникальные имена отовсюду
SELECT first_name FROM employees
UNION
SELECT contractor_name FROM contractors
ORDER BY first_name; -- И сортируем уже конечный результат

Пример 2: Быстрый сбор логов без лишней возни. Допустим, есть два источника логов: интерфейс и API. За последний день дубли маловероятны, а скорость важна. Бери 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 ALL с литералами — твой друг.

SELECT 1 AS id, 'Active' AS status
UNION ALL
SELECT 2, 'Inactive'
UNION ALL
SELECT 3, 'Pending';

И главное, запомни: UNION — это твой главный инструмент, когда данные логически одни, но физически разбросаны по разным таблицам или даже шардам. Без него никуда.