В этом учебном материале вы узнаете, как использовать SQL оператор UNION ALL с синтаксисом и примерами.
Описание
SQL оператор UNION ALL используется для объединения результирующих наборов из 2 или более операторов SELECT. Он не удаляет повторяющиеся строки между различными операторами SELECT (возвращаются все строки).
Каждый оператор SELECT в UNION ALL должен иметь одинаковое количество полей в наборах результатов с одинаковыми типами данных.
В чем разница между UNION и UNION ALL?
- Оператор UNION удаляет повторяющиеся строки.
- UNION ALL не удаляет повторяющиеся строки
Синтаксис
Синтаксис для оператора UNION ALL в SQL.
FROM tables
[WHERE conditions]
UNION ALL
SELECT expression1, expression2, ... expression_n
FROM tables
[WHERE conditions];
Параметры или аргумент
- expression1, expression2, expression_n
- Столбцы или расчеты, которые вы хотите получить
- tables
- Таблицы, из которых вы хотите получить записи. В предложении FROM должна быть указана хотя бы одна таблица
- WHERE conditions
- Необязательный. Условия, которые должны быть выполнены для записей, которые будут выбраны
Примечание
- В обоих запросах SELECT должно быть одинаковое количество выражений
- Соответствующие выражения должны иметь одинаковый тип данных в запросах SELECT. Например: expression1 должен иметь одинаковый тип данных как в первом, так и во втором операторе SELECT
- Смотрите также оператор UNION
Пример - одиночное поле с тем же именем
Давайте посмотрим, как использовать SQL оператор UNION ALL, который возвращает одно поле. В этом простом примере поле в обоих операторах SELECT будет иметь одинаковое имя и тип данных.
Например.
1 2 3 4 5 6 |
SELECT supplier_id FROM suppliers UNION ALL SELECT supplier_id FROM orders ORDER BY supplier_id; |
Этот SQL пример UNION ALL будет возвращать supplier_id несколько раз в наборе результатов, если это же значение появилось в таблицах suppliers и orders. SQL оператор UNION ALL не удаляет дубликаты. Если вы хотите удалить дубликаты, попробуйте использовать оператор UNION.
Теперь давайте рассмотрим этот пример, далее приведем некоторые данные.
Если у вас была таблица suppliers, заполненная следующими записями.
supplier_id | supplier_name |
---|---|
1000 | Microsoft |
2000 | Oracle |
3000 | Apple |
4000 | Samsung |
И таблица orders заполнена следующими записями.
order_id | order_date | supplier_id |
---|---|---|
2019-07-01 | 2000 | |
2019-07-01 | 6000 | |
2019-07-02 | 7000 | |
2019-07-03 | 8000 |
И вы выполнили следующий оператор UNION ALL.
1 2 3 4 5 6 |
SELECT supplier_id FROM suppliers UNION ALL SELECT supplier_id FROM orders ORDER BY supplier_id; |
Вы получите следующие результаты.
supplier_id |
---|
1000 |
2000 |
2000 |
3000 |
4000 |
6000 |
7000 |
8000 |
Как видно из этого примера, UNION ALL взял все значения supplier_id из таблицы suppliers, а также из таблицы orders и возвратил комбинированный набор результатов. Дубликаты не были удалены, как вы можете видеть по значению supplier_id 2000, которое дважды появляется в наборе результатов.
Пример - разные имена полей
Нет необходимости, чтобы соответствующие столбцы в каждом операторе SELECT имели одинаковые имена, но они должны быть с одинаковыми соответствующими типами данных.
Если у вас нет одинаковых имен столбцов в операторах SELECT, это становится немного сложнее, особенно если вы хотите упорядочить результаты запроса, используя оператор ORDER BY.
Давайте посмотрим, как использовать оператор UNION ALL с разными именами столбцов, и упорядочить результаты запроса.
Например.
1 2 3 4 5 6 7 8 9 |
SELECT supplier_id, supplier_name FROM suppliers WHERE supplier_id > 2000 UNION ALL SELECT company_id, company_name FROM companies WHERE company_id > 1000 ORDER BY 1; |
В этом SQL примере UNION ALL, поскольку имена столбцов в двух операторах 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 ALL.
1 2 3 4 5 6 7 8 9 |
SELECT supplier_id, supplier_name FROM suppliers WHERE supplier_id > 2000 UNION ALL SELECT company_id, company_name FROM companies WHERE company_id > 1000 ORDER BY 1; |
Вы получите следующие результаты.
supplier_id | supplier_name |
---|---|
3000 | Apple |
3000 | Apple |
4000 | Samsung |
7000 | Sony |
8000 | IBM |
Во-первых, обратите внимание, что запись с supplier_id, равной 3000, появляется дважды в наборе результатов, поскольку запрос UNION ALL возвращает все строки и не удаляет дубликаты.
Во-вторых, обратите внимание, что заголовки столбцов в наборе результатов называются supplier_id и supplier_name. Это потому, что это были имена столбцов, использованных в первом операторе SELECT в UNION ALL.
Если бы вы хотели, вы могли бы присвоить псевдонимы следующим образом.
1 2 3 4 5 6 7 8 9 |
SELECT supplier_id AS ID_Value, supplier_name AS Name_Value FROM suppliers WHERE supplier_id > 2000 UNION ALL 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 |
3000 | Apple |
4000 | Samsung |
7000 | Sony |
8000 | IBM |