Ответ
В PostgreSQL UNION — это оператор для объединения результирующих наборов двух или более SELECT-запросов в один общий набор. Он автоматически удаляет дублирующиеся строки из финального результата.
Синтаксис и ключевые правила:
SELECT column1, column2 FROM table1
UNION
SELECT column1, column2 FROM table2;
- Количество и порядок столбцов во всех объединяемых
SELECTдолжны совпадать. - Типы данных соответствующих столбцов должны быть совместимыми (PostgreSQL попытается выполнить неявное приведение типов, если это возможно).
- Удаление дубликатов:
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;
Вот на что надо смотреть, а то потом охуеешь от ошибок:
- Количество и порядок столбцов во всех
SELECTдолжны быть одинаковые. Нельзя в первом запросе выбрать три поля, а во втором — пять, иначе будет пиздец. - Типы данных в соответствующих столбцах должны быть совместимы. PostgreSQL попробует их подружить, если сможет, но лучше не надеяться на авось.
- Удаление дубликатов — это ресурсы. Операция не бесплатная, база будет сортировать и сравнивать, чтобы выкинуть повторы. На больших данных это может быть овердохуища затратно.
А есть же 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 — это твой главный инструмент, когда данные логически одни, но физически разбросаны по разным таблицам или даже шардам. Без него никуда.