Данная статья относится к циклу статей, посвященных PostgreSQL. В предыдущей статье мы говорили об условии PostgreSQL HAVING. Теперь же мы углубимся в изучение оператора UNION, при помощи которого мы будем объединять наборы результатов нескольких запросов в один.
Введение в оператор PostgreSQL UNION
Оператор UNION объединяет наборы результатов двух или более операторов SELECT в один общий. Ниже показан синтаксис вызова оператора UNION, объединяющего наборы результатов из двух запросов:
SELECT
column_1,
column_2
FROM
tbl_name_1
UNION
SELECT
column_1,
column_2
FROM
tbl_name_2;
Ниже приведены правила, применяемые к запросам:
- Оба запроса должны возвращать одинаковое количество столбцов.
- Соответствующие столбцы в запросах должны иметь совместимые типы данных.
Оператор UNION убирает все повторяющиеся строки, если не используется UNION ALL.
Оператор UNION может размещать строки из первого запроса до, после или между строками из набора результатов второго запроса. Чтобы отсортировать строки в объединённом результирующем наборе по указанному столбцу, используйте условие ORDER BY.
Оператор UNION зачастую используется для объединения данных из схожих таблиц, которые не являются полностью нормализованными. Эти таблицы часто встречаются в системе отчётности или хранилище данных.
Примеры использования оператора PostgreSQL UNION
Обратим внимание на следующие таблицы:
- sales2007q1: продажи магазина за первый квартал 2017 года.
- sales2007q2: продажи магазина за второй квартал 2017 года.
sales2007q1 data:
sales2007q2 data:
Пример использования оператора PostgreSQL UNION
Мы используем оператор UNION для объединения данных из обеих таблиц следующим образом:
SELECT *
FROM
sales2007q1
UNION
SELECT *
FROM
sales2007q2;
Запрос возвращает следующий результат:
Пример использования оператора PostgreSQL UNION ALL
В объединенном наборе результатов пять строк, так как оператор UNION удаляет дублирующие строки. Чтобы получить все строки, содержащие дубликаты, вам необходимо использовать оператор UNION ALL следующим образом:
SELECT *
FROM
sales2007q1
UNION ALL
SELECT *
FROM
sales2007q2;
Пример использования оператора PostgreSQL UNION совместно с условием ORDER BY
Для сортировки объединённого набора результатов, возвращённого оператором UNION, используйте условие ORDER BY. Вам необходимо поместить условие ORDER BY в запрос следующим образом:
SELECT *
FROM
sales2007q1
UNION ALL
SELECT *
FROM
sales2007q2
ORDER BY
name ASC,
amount DESC;
Если же поместить условие ORDER BY в конец каждого запроса, объединённый набор результатов не будет отсортирован так, как вы ожидаете. Связано это с тем, что когда оператор UNION объединяет отсортированные наборы результатов из каждого запроса, он [оператор] не гарантирует сохранение порядка строк в окончательном наборе результатов.
На этом мы заканчиваем изучение оператора PostgreSQL UNION и переходим к оператору INTERSECT, использующийся для объединения двух или более операторов SELECT в один набор результатов.
Источник: PostgreSQL Tutorial from Scratch