От автора: условие/оператор SQL UNION используется для объединения результатов двух или более инструкций SELECT без включения повторяющихся строк.
Для использования условия UNION, каждый оператор SELECT должен содержать
Такое же количество выбранных столбцов
Такое же количество выражений столбцов
Тот же тип данных
Онлайн курс «PHP-разработчик»
Изучите курс и создайте полноценный проект — облачное хранилище файлов
С нуля освоите язык программирования PHP, структурируете имеющиеся знания, а эксперты помогут разобраться с трудными для понимания темами, попрактикуетесь на реальных задачах. Напишете первый проект для портфолио.
Узнать подробнее
Освоите PHP, MySQL, SQL, фрейсворк Laravel
Научитесь работать со стандартом REST и RESTful API
Упор на практику. Поддержка экспертов
Они должны располагаться в том же порядке
Но они не обязательно должны быть одинаковой длины.
Синтаксис
Основной синтаксис условия 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/
Онлайн курс «PHP-разработчик»
Изучите курс и создайте полноценный проект — облачное хранилище файлов
С нуля освоите язык программирования PHP, структурируете имеющиеся знания, а эксперты помогут разобраться с трудными для понимания темами, попрактикуетесь на реальных задачах. Напишете первый проект для портфолио.
Узнать подробнее
Освоите PHP, MySQL, SQL, фрейсворк Laravel
Научитесь работать со стандартом REST и RESTful API
Упор на практику. Поддержка экспертов
Редакция: Команда webformyself.
В этом учебном материале вы узнаете, как использовать 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», который перечисляет, является ли контактное лицо «клиентом» или «поставщиком».
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
объединяет данные из
нескольких таблиц в одну при выборке. При
объединении количество столбцов во всех таблицах
должно совпадать, иначе будет ошибка Имена
столбцов будут такие же, как в основной таблице,
в которую добавляются данные из других таблиц.
Внимание: если не используется ключевое
слово ALL для UNION, все возвращенные строки
будут уникальными, так как по умолчанию подразумевается
DISTINCT
,
который удаляет неуникальные значения. Чтобы
отменить такое поведение — нужно указать
ключевое слово ALL
, вот так: UNION
ALL.
Синтаксис
С удалением дублей:
SELECT * FROM имя_таблицы1 WHERE условие
UNION SELECT * FROM имя_таблицы2 WHERE условие
Без удаления дублей:
SELECT * FROM имя_таблицы1 WHERE условие
UNION ALL SELECT * FROM имя_таблицы2 WHERE условие
Можно объединять не две таблицы, а три или более:
SELECT * FROM имя_таблицы1 WHERE условие
UNION SELECT * FROM имя_таблицы2 WHERE условие
UNION SELECT * FROM имя_таблицы3 WHERE условие
UNION SELECT * FROM имя_таблицы4 WHERE условие
Таблицы для примеров
id айди |
name название |
---|---|
1 | Беларусь |
2 | Россия |
3 | Украина |
id айди |
name название |
country_id айди страны |
---|---|---|
1 | Минск | 1 |
2 | Минск | 1 |
3 | Москва | 2 |
4 | Киев | 3 |
Пример
В данном примере объединяются записи из двух
таблиц:
SELECT id, name FROM countries UNION ALL SELECT id, name FROM cities
Результат выполнения кода:
id айди |
name название |
---|---|
1 | Беларусь |
2 | Россия |
3 | Украина |
1 | Минск |
2 | Минск |
3 | Москва |
4 | Киев |
Пример
В данном примере отсутствует ключевое слово
ALL, однако дубли не будут удалены, так как
дублями считается полное совпадение строк:
SELECT id, name FROM countries UNION SELECT id, name FROM cities
Результат выполнения кода:
id айди |
name название |
---|---|
1 | Беларусь |
2 | Россия |
3 | Украина |
1 | Минск |
2 | Минск |
3 | Москва |
4 | Киев |
Пример
А вот теперь дубли будут удалены (из двух
Минсков останется один), так как будет иметь
место полное совпадение строк (потому что
поле осталось одно, но это не обязательно):
SELECT name FROM countries UNION SELECT name FROM cities
Результат выполнения кода:
name название |
---|
Беларусь |
Россия |
Украина |
Минск |
Москва |
Киев |
Пример
А теперь добавим слово ALL — и дубли не будут
удалятся:
SELECT name FROM countries UNION ALL SELECT name FROM cities
Результат выполнения кода:
name название |
---|
Беларусь |
Россия |
Украина |
Минск |
Минск |
Москва |
Киев |
Пример
В данном примере демонстрируется работа условий
WHERE
в комбинации с UNION:
SELECT id, name FROM countries WHERE id>=2
UNION SELECT id, name FROM cities WHERE id<=2
Результат выполнения кода:
id айди |
name имя |
---|---|
2 | Россия |
3 | Украина |
1 | Минск |
2 | Минск |
Пример
Имена колонок берутся из первой таблицы (то
есть имена колонок таблиц, подключенных через
UNION нигде себя не проявят):
SELECT id as country_id, name as country_name FROM countries
UNION SELECT id, name FROM cities
Результат выполнения кода:
country_id айди |
country_name имя |
|
---|---|---|
1 | Беларусь | |
2 | Россия | |
3 | Украина | |
1 | Минск | 1 |
2 | Минск | 1 |
3 | Москва | 2 |
4 | Киев | 3 |
Пример
Такой запрос выдаст ошибку, так как в таблицах
не совпадает количество колонок:
SELECT id, name FROM countries UNION SELECT id, name, country_id FROM cities
И такой запрос тоже выдаст ошибку в нашем
случае — количество колонок в обеих таблицах
не совпадает:
SELECT * FROM countries UNION SELECT * FROM cities
Пример
Если нам очень надо забрать из какой-либо
таблицы столько полей, что в другой таблице
столько и нет, можно создавать дополнительные
поля вручную.
К примеру, мы хотим забрать 3
поля
из второй таблицы, а в первой таблице полей
только 2
. Решим эту проблему создав
поле с именем country_id и содержимым 0
для первой таблицы (вот так: 0 as country_id):
SELECT id, name, 0 as country_id FROM countries
UNION SELECT id, name, country_id FROM cities
Результат выполнения кода:
id айди |
name имя |
country_id айди страны |
---|---|---|
1 | Беларусь | 0 |
2 | Россия | 0 |
3 | Украина | 0 |
1 | Минск | 1 |
2 | Минск | 1 |
3 | Москва | 2 |
4 | Киев | 3 |
Смотрите также
-
команду
JOIN
,
которая объединяет связанные таблицы