От автора: условие/оператор SQL UNION используется для объединения результатов двух или более инструкций SELECT без включения повторяющихся строк.
Для использования условия UNION, каждый оператор SELECT должен содержать
Такое же количество выбранных столбцов
Такое же количество выражений столбцов
Тот же тип данных
Они должны располагаться в том же порядке
Но они не обязательно должны быть одинаковой длины.
Синтаксис
Основной синтаксис условия UNION следующий:
SELECT column1 [, column2 ] FROM table1 [, table2 ] [WHERE condition] UNION SELECT column1 [, column2 ] FROM table1 [, table2 ] [WHERE condition] |
Здесь данное условие может быть любым выражением, заданным исходя из ваших потребностей.
Пример
Рассмотрим следующие две таблицы. Таблица 1 — Таблица CUSTOMERS выглядит следующим образом.
Таблица 2 — Таблица ORDERS выглядит следующим образом.
Теперь давайте объединим эти две таблицы в инструкции SELECT следующим образом:
SELECT ID, NAME, AMOUNT, DATE FROM CUSTOMERS LEFT JOIN ORDERS ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID UNION SELECT ID, NAME, AMOUNT, DATE FROM CUSTOMERS RIGHT JOIN ORDERS ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID; |
Это даст следующий результат —
Условие UNION ALL
Оператор UNION ALL используется для объединения результатов двух операторов SELECT, с включением повторяющихся строк.
Те же правила, которые применяются к условию UNION, будут применяться к оператору UNION ALL.
Синтаксис
Основной синтаксис UNION ALL следующий.
SELECT column1 [, column2 ] FROM table1 [, table2 ] [WHERE condition] UNION ALL SELECT column1 [, column2 ] FROM table1 [, table2 ] [WHERE condition] |
Здесь данное условие может быть любым выражением, заданным исходя из ваших потребностей
Пример
Рассмотрим следующие две таблицы, Таблица 1 — Таблица CUSTOMERS выглядит следующим образом.
Таблица 2 — таблица ORDERS выглядит следующим образом.
Теперь давайте объединим эти две таблицы в инструкции SELECT следующим образом:
SELECT ID, NAME, AMOUNT, DATE FROM CUSTOMERS LEFT JOIN ORDERS ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID UNION ALL SELECT ID, NAME, AMOUNT, DATE FROM CUSTOMERS RIGHT JOIN ORDERS ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID; |
Это даст следующий результат:
Существует два других условия или оператора похожих на условие UNION.
Условие SQL INTERSECT − используется для объединения двух инструкций SELECT, но возвращает только строки из первого оператора SELECT, которые совпадают со строкой из второго оператора SELECT.
Условие SQL EXCEPT − объединяет два оператора SELECT и возвращает строки из первого оператора SELECT, которые не возвращаются вторым оператором SELECT.
Источник: //www.tutorialspoint.com/
Редакция: Команда webformyself.
UNION
объединяет информацию из 2-х и более
отдельных запросов SELECT
в один курсор или таблицу. При этом в
команде SELECT
можно использовать до 10 членов UNION,
связывая каждую инструкцию SELECT
с предыдущей. Результирующий набор,
созданный первой командой SELECT,
определяет требуемую структуру для
остальных команд SELECT.
Порядок, количество, размер и тип полей
в первой команде SELECT
определяет структуру для всех последующих
команд SELECT.
Например, для
получения списка всех студентов и
преподавателей фамилии которых заключены
между буквами «К» и «С»:
SELECT
SFAM, SIMIA FROM STUD; WHERE SFAM BETWEEN ‘K’ AND
‘C’; UNION; SELECT TFAM, TIMIA FROM TEACHER; WHERE TFAM BETWEEN
‘K’ AND ‘C’
Когда 2 или более
запросов подвергаются объединению, их
столбцы вывода должны быть совместимы
для объединения. Это означает для каждого
запроса необходимость включения
одинакового числа столбцов в том же
порядке, что и 1, 2, 3 и т.д. и при этом должна
присутствовать совместимость типов.
Например: символьные
поля должны иметь одинаковое число
символов. Кроме того нельзя использовать
агрегатные функции в запросе SELECT
при объединении. Агрегатные функции –
MIN,
MAX,
AVG,
SUM.
Также UNION
будет автоматически исключать дубликаты
строк из вывода.
Пусть таблица
STUD1
содержит поле, состоящее из 30 символов,
которые включают Имя и Фамилию.
Таблица TEACHER
содержит отдельные поля для имени и
фамилии. Сумма длин этих полей также
равна 30 символам.
В таблице STUD1
определено поле для хранения факультета,
а в таблице TEACHER
– нет. Для объединения данных результирующих
наборов необходимо согласовать эти
различия.
SELECT
STUD1.FAC
FROM
STUD;
UNION;
SELECT
PADR (ALLTRIM(TEACHER.FIRSTNAME)+ALLTRIM(TEACHER.LASTNAME), 30);
AS NAME, SPACE (10) AS FAK;
FROM
TEACHER
Член SPACE(10)
играет роль «заглушки», которая относится
к полю, содержащему имя факультета в
файле TEACHER.
Этот член заполняет поле с именем
факультета в объединенные результирующие
таблицы пробелами. Без подобной заглушки
операция UNION
корректно работать не будет. Подобную
заглушку можно поставить в любой
инструкции SELECT.
Можно поместить заглушку в первую
команду SELECT,
чтобы зарезервировать строку пробелов
для поля, которое существует только в
последующих командах SELECT.
Можно включить пробелы в одну из
внутренних команд SELECT,
чтобы обеспечить совпадение с первой
командой SELECT.
Функция ALLTRIM
удаляет пробелы слева и справа из
соответствующего имени учителя.
Функция PADR
создает поле с заданной длиной. Между
именем и фамилией поставлен разделительный
пробел (+). Если общая длина поля меньше
30-символьного ограничения, то будет
усечен последний символ.
Воздействие
ключевого слова UNION
аналогично действию DISTINCT.
Это значит, что каждая добавленная в
результирующий набор запись проверяется
на уникальность. Члены UNION
используются только для объединения
запросов, но никак не влияют на подзапросы.
Правила объединения
с помощью UNION:
-
Любое поле,
включенное в первый список полей, должно
быть представлено полем или заглушкой
в последующих списках полей. -
Любое поле из
последующих списков полей, которое не
входит в первый список полей, должно
быть представлено заглушкой в первом
списке -
В первом списке
не должно быть вычисляемых полей -
Члены ORDER
BY
и INTO
могут входить в любую инструкцию SELECT,
но только 1 раз и применяются ко всему
результату. -
Член ORDER
BY
должен ссылаться на поля, по их позициям
в списке, а не по имени. -
При отсутствии
члена ORDER
BY
для сортировки используется порядок
следования полей в списке. -
Члены GROUP
BY
и HAVING
могут присутствовать в каждой инструкции
SELECT,
причем их влияние ограничено только
результатами работы данной инструкции
SELECT. -
С помощью членов
UNION
нельзя объединять результаты подзапросов,
то есть члены UNION
нельзя применить к инструкциям SELECT,
используемым внутри члена WHERE
других инструкций SELECT. -
При построении
объединения можно использовать не
более 10 членов UNION.
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
- #
- #
- #
- #
- #
- #
- #
- #
- #
- #
- #
Оператор UNION
используется для объединения результатов двух или более запросов SELECT
в один набор результатов. Команда UNION отличается от JOIN-операторов, которые объединяют столбцы из двух таблиц. UNION создает новую таблицу, помещая все строки из двух исходных таблиц в таблицу результатов и располагая эти строки друг над другом.
Далее приведены основные правила объединения наборов результатов двух запросов SELECT
с помощью UNION
:
- Количество и порядок столбцов должны быть одинаковыми во всех запросах.
- Типы данных соответствующих столбцов должны быть совместимы.
Если эти критерии выполняются, то таблицы совместимы с оператором UNION
.
Синтаксис
Базовый синтаксис оператора UNION
представлен следующим образом:
SELECT список_столбцов FROM таблица1
UNION SELECT список_столбцов FROM таблица2;
Чтобы лучше понять, как работает оператор UNION
, предположим, что в таблицах employees
и departments
существуют некоторые гипотетические поля first_name
и last_name
. Обратите внимание, что эти поля на самом деле не существуют в демонстрационных таблицах.
Таблица employees |
Таблица departments |
+----+------------+-----------+--------+ | id | first_name | last_name | salary | +----+------------+-----------+--------+ | 1 | Ethan | Hunt | 5000 | | 2 | Tony | Montana | 6500 | | 3 | Sarah | Connor | 8000 | | 4 | Rick | Deckard | 7200 | | 5 | Martin | Blank | 5600 | +----+------------+-----------+--------+ |
+----+------------+-----------+----------+ | id | first_name | last_name | city | +----+------------+-----------+----------+ | 1 | Maria | Anders | Berlin | | 2 | Fran | Wilson | Madrid | | 3 | Dominique | Perrier | Paris | | 4 | Martin | Blank | Turin | | 5 | Thomas | Hardy | Portland | +----+------------+-----------+----------+ |
Выполним оператор UNION
, чтобы объединить результаты двух запросов.
Следующая команда вернет имена и фамилии всех клиентов и сотрудников:
SELECT first_name, last_name FROM employees
UNION
SELECT first_name, last_name FROM customers;
После выполнения приведенной выше команды вы получите такой результат:
+---------------+--------------+ | first_name | last_name | +---------------+--------------+ | Ethan | Hunt | | Tony | Montana | | Sarah | Connor | | Rick | Deckard | | Martin | Blank | | Maria | Anders | | Fran | Wilson | | Dominique | Perrier | | Thomas | Hardy | +---------------+--------------+
Оператор UNION
по умолчанию удаляет дублирующиеся строки из объединенного набора результатов. Вот почему приведенный выше запрос возвращает только 9 строк. Если вы заметили, имя Martin Blank встречается и в таблице employees
, и в таблице customers
.
Однако если вы хотите оставить дублирующиеся строки, используйте ключевое слово ALL
, как показано ниже:
SELECT first_name, last_name FROM employees
UNION ALL
SELECT first_name, last_name FROM customers;
В этом учебном материале вы узнаете, как использовать SQL оператор UNION с синтаксисом и примерами.
Описание
SQL оператор UNION используется для объединения результирующих наборов из 2 или более операторов SELECT. Он удаляет повторяющиеся строки между различными запросами SELECT.
Каждый оператор SELECT в UNION должен иметь одинаковое количество полей в наборах результатов с одинаковыми типами данных.
- UNION удаляет повторяющиеся строки
- Оператор UNION ALL не удаляет повторяющиеся строки
Синтаксис
Синтаксис для оператора UNION в SQL.
SELECT expression1, expression2, … expression_n
FROM tables
[WHERE conditions]
UNION
SELECT expression1, expression2, … expression_n
FROM tables
[WHERE conditions];
Параметры или аргумент
- expression1, expression2, expression_n
- Столбцы или расчеты, которые вы хотите получить
- tables
- Таблицы, из которых вы хотите получить записи. В предложении FROM должна быть указана хотя бы одна таблица
- WHERE conditions
- Необязательный. Условия, которые должны быть выполнены для записей, которые будут выбраны
Примечание
- В обоих операторах SELECT должно быть одинаковое количество выражений
- Соответствующие выражения должны иметь одинаковый тип данных в запросах SELECT. Например: expression1 должен иметь одинаковый тип данных как в первом, так и во втором операторе SELECT
- Смотрите также оператор UNION ALL
Пример — одиночное поле с тем же именем
Давайте посмотрим, как использовать SQL оператор UNION, который возвращает одно поле. В этом простом примере поле в обоих операторах SELECT будет иметь одинаковое имя и тип данных.
Например.
SELECT supplier_id FROM suppliers UNION SELECT supplier_id FROM orders ORDER BY supplier_id; |
В этом SQL примере оператора UNION, если supplier_id появилось в таблицах suppliers и orders, оно будет один раз в вашем наборе результатов. Оператор UNION удаляет дубликаты. Если вы не хотите удалить дубликаты, попробуйте использовать оператор UNION ALL.
Теперь давайте рассмотрим этот пример, далее приведем некоторые данные.
Если у вас была таблица suppliers, заполненная следующими записями.
supplier_id | supplier_name |
---|---|
1000 | Yandex |
2000 | |
3000 | Oracle |
4000 | Bing |
И таблица orders заполнена следующими записями.
order_id | order_date | supplier_id |
---|---|---|
2019-07-01 | 2000 | |
2019-07-01 | 6000 | |
2019-07-02 | 7000 | |
2019-07-03 | 8000 |
И вы выполнили следующий запрос UNION.
SELECT supplier_id FROM suppliers UNION SELECT supplier_id FROM orders ORDER BY supplier_id; |
Вы получите следующие результаты.
supplier_id |
---|
1000 |
2000 |
3000 |
4000 |
6000 |
7000 |
8000 |
Как видно из этого примера, UNION взял все значения supplier_id из таблицы suppliers, а также из таблицы orders и возвратил комбинированный набор результатов. Поскольку оператор UNION удалил дубликаты между результирующими наборами, поле supplier_id 2000 отображается только один раз, даже если оно находится в таблицах suppliers и orders. Если вы не хотите удалять дубликаты, попробуйте вместо этого использовать оператор UNION ALL.
Пример — разные имена полей
Нет необходимости, чтобы соответствующие столбцы в каждом операторе SELECT имели одинаковые имена, но они должны быть с одинаковыми, соответствующими типами данных.
Если у вас нет одинаковых имен столбцов между операторами SELECT, это становится немного сложнее, особенно если вы хотите упорядочить результаты запроса, используя оператор ORDER BY.
Давайте посмотрим, как использовать оператор UNION с разными именами столбцов и упорядочиванием результатов запроса.
Например.
SELECT supplier_id, supplier_name FROM suppliers WHERE supplier_id > 2000 UNION SELECT company_id, company_name FROM companies WHERE company_id > 1000 ORDER BY 1; |
В этом SQL примере UNION, поскольку имена столбцов в двух операторах SELECT различаются, более выгодно ссылаться на столбцы в ORDER BY по их положению в наборе результатов. В этом примере мы отсортировали результаты по supplier_id / company_id в порядке возрастания, как обозначено ORDER BY 1
. Поля supplier_id / company_id находятся в позиции № 1 в наборе результатов.
Теперь давайте рассмотрим этот пример подробнее с данными.
Если у вас была таблица suppliers, заполненная следующими записями.
supplier_id | supplier_name |
---|---|
1000 | Microsoft |
2000 | Oracle |
3000 | Apple |
4000 | Samsung |
И таблица companies заполнилась следующими записями.
company_id | company_name |
---|---|
1000 | Microsoft |
3000 | Apple |
7000 | Sony |
8000 | IBM |
И вы выполнили следующий оператор UNION.
SELECT supplier_id, supplier_name FROM suppliers WHERE supplier_id > 2000 UNION SELECT company_id, company_name FROM companies WHERE company_id > 1000 ORDER BY 1; |
Вы получите следующие результаты.
supplier_id | supplier_name |
---|---|
3000 | Apple |
4000 | Samsung |
7000 | Sony |
8000 | IBM |
Во-первых, обратите внимание, что запись с supplier_id, равной 3000, появляется только один раз в наборе результатов, поскольку запрос UNION удалил повторяющиеся записи.
Во-вторых, обратите внимание, что заголовки столбцов в наборе результатов называются supplier_id и supplier_name. Это потому, что это были имена столбцов, использованных в первом операторе SELECT в UNION.
Если бы вы хотели, вы могли бы присвоить псевдонимы столбцам следующим образом.
SELECT supplier_id AS ID_Value, supplier_name AS Name_Value FROM suppliers WHERE supplier_id > 2000 UNION SELECT company_id AS ID_Value, company_name AS Name_Value FROM companies WHERE company_id > 1000 ORDER BY 1; |
Теперь заголовки столбцов в результате будут иметь псевдоним как ID_Value для первого столбца и Name_Value для второго столбца.
ID_Value | Name_Value |
---|---|
3000 | Apple |
4000 | Samsung |
7000 | Sony |
8000 | IBM |
Оператор UNION
Оператор UNION используется для объединения результирующего набора из двух или более заявлений SELECT.
- Каждый оператор SELECT в UNION должен иметь одинаковое количество столбцов
- Столбцы также должны иметь схожие типы данных
- Столбцы в каждом заявлении SELECT также должны располагаться в том же порядке
Синтаксис UNION
SELECT column_name(s) FROM table1
UNION
SELECT column_name(s) FROM table2;
Синтаксис UNION ALL
Оператор UNION по умолчанию выбирает только отдельные значения. Чтобы разрешить повторяющиеся значения, использовать UNION ALL:
SELECT column_name(s) FROM table1
UNION ALL
SELECT column_name(s) FROM table2;
Примечание: Имена столбцов в результирующем наборе обычно равны именам столбцов в первом заявлении SELECT в UNION.
Демо база данных
В этом уроке мы будем использовать хорошо известный пример базы данных Northwind.
Ниже приведен выбор из таблицы «Customers»:
CustomerID | CustomerName | ContactName | Address | City | PostalCode | Country |
---|---|---|---|---|---|---|
1 | Alfreds Futterkiste | Maria Anders | Obere Str. 57 | Berlin | 12209 | Germany |
2 | Ana Trujillo Emparedados y helados | Ana Trujillo | Avda. de la Constitución 2222 | México D.F. | 05021 | Mexico |
3 | Antonio Moreno Taquería | Antonio Moreno | Mataderos 2312 | México D.F. | 05023 | Mexico |
И выбор из таблицы «Suppliers»:
SupplierID | SupplierName | ContactName | Address | City | PostalCode | Country |
---|---|---|---|---|---|---|
1 | Exotic Liquid | Charlotte Cooper | 49 Gilbert St. | London | EC1 4SD | UK |
2 | New Orleans Cajun Delights | Shelley Burke | P.O. Box 78934 | New Orleans | 70117 | USA |
3 | Grandma Kelly’s Homestead | Regina Murphy | 707 Oxford Rd. | Ann Arbor | 48104 | USA |
Пример SQL UNION
Следующая инструкция SQL возвращает города (только отдельные значения) как из таблицы «Customers», так и из таблицы «Suppliers»:
Пример
SELECT City FROM Customers
UNION
SELECT City FROM Suppliers
ORDER BY City;
Попробуйте сами »
Примечание: Если некоторые клиенты или поставщики имеют один и тот же город,
то каждый город будет указан только один раз, поскольку UNION выбирает только различные значения.
Используйте UNION ALL, чтобы также выбрать повторяющиеся значения!
Пример SQL UNION ALL
Следующая инструкция SQL возвращает города (также повторяющиеся значения) как из таблицы «Customers», так и из таблицы «Suppliers»:
Пример
SELECT City FROM Customers
UNION ALL
SELECT City FROM Suppliers
ORDER BY City;
Попробуйте сами »
Пример SQL UNION с WHERE
Следующая инструкция SQL возвращает немецкие города (только отдельные значения) как из таблицы «Customers», так и из таблицы «Suppliers»:
Пример
SELECT City, Country FROM Customers
WHERE Country=’Germany’
UNION
SELECT City, Country FROM Suppliers
WHERE Country=’Germany’
ORDER BY City;
Попробуйте сами »
Пример SQL UNION ALL с WHERE
Следующая инструкция SQL возвращает немецкие города (также повторяющиеся значения) как из таблицы «Customers», так и из таблицы «Suppliers»:
Пример
SELECT City, Country FROM Customers
WHERE Country=’Germany’
UNION ALL
SELECT City, Country FROM Suppliers
WHERE Country=’Germany’
ORDER BY City;
Попробуйте сами »
Пример UNION другой
Следующая инструкция SQL содержит список всех клиентов и поставщиков:
Пример
SELECT ‘Customer’ As Type, ContactName, City, Country
FROM Customers
UNION
SELECT ‘Supplier’, ContactName, City, Country
FROM Suppliers;
Попробуйте сами »
Обратите внимание на «AS Type» выше — это псевдоним.
Псевдонимы SQL используются для присвоения таблице или столбцу временного имени.
Псевдоним существует только на время выполнения запроса.
Итак, здесь мы создали временный столбец с именем «Type», который перечисляет, является ли контактное лицо «клиентом» или «поставщиком».