Union — у мовах, подібних до SQL, DML-операція об'єднання записів в одну таблицю. Критерій відбору записів для об'єднання визначається виразом Where. Обидва запити повинні повертати однакове число стовпців і мати сумісні типи даних у відповідних стовпцях. Цей оператор було описано у другому стандарті SQL — .
Синтаксис
Оператор вказується між запитами. У спрощеному вигляді це виглядає так:
<запит1> UNION [ALL] <запит2> UNION [ALL] <запит3> .....
За замовчуванням, будь-які повторювані записи автоматично ігноруються, якщо не використано вираз UNION ALL
.
Необхідно зазначити, що UNION
сам по собі не гарантує порядок рядків. Рядки з другого запиту можуть виявитися на початку, в кінці або взагалі змішатися з рядками з першого запиту. У випадках, коли потрібно забезпечити певний порядок, необхідно використовувати вираз Order by.
Правила використання
Існують два основні правила, що регламентують порядок використання оператора UNION
:
- Число та порядок видобутих стовпців повинні збігатися в усіх запитах, що об'єднуються;
- Типи даних у відповідних стовпцях повинні бути сумісні.
Визначення стовпців, дані з яких беруться в об'єднувальних запитах, не повинні збігатися, проте повинні бути сумісними шляхом неявного перетворення. Якщо типи даних різняться, то тип даних, що вийшов, визначається на основі правил черговості типів даних (для конкретної СКБД). Якщо типи збігаються, але розрізняються в точності, масштабі або довжині, результат визначається на основі правил, використовуваних для об'єднання виразів (для конкретної СКБД). Типи даних, не визначені ANSI, такі як DATA
і BINARY
, зазвичай повинні збігатися з іншими стовпцями такого ж нестандартного типу.
У Microsoft SQL Server стовпці з типом даних XML повинні бути еквівалентними. Всі стовпчики повинні або мати тип, визначений у XML-схемі, або бути нетипізованими. Типізовані стовпці повинні стосуватися однієї і тієї ж колекції XML-схем.
Ще одне обмеження на сумісність — це заборона порожніх значень (NULL
) у будь-якому стовпці об'єднання, причому ці значення необхідно заборонити і для всіх відповідних стовпців в інших запитах об'єднання, оскільки порожні значення (NULL
) заборонені з обмеженням NOT NULL
. Крім того, не можна використовувати UNION
у підзапитах, а також не можна використовувати агрегатні функції в реченні Select запиту в об'єднанні (проте більшість СКБД нехтують цими обмеженнями).
Приклади
Використання UNION при вибірці з двох таблиць
Дано дві таблиці:
person | amount |
---|---|
Петро | 1000 |
Павло | 2000 |
Василь | 5000 |
person | amount |
---|---|
Петро | 2000 |
Павло | 2000 |
Семен | 35000 |
При виконанні запиту
SELECT * FROM sales-2008 UNION SELECT * FROM sales-2010;
виходить результатний набір, однак порядок рядків може бути довільним, оскільки ключовий вираз ORDER BY
не було використано:
person | amount |
---|---|
Петро | 1000 |
Павло | 2000 |
Василь | 5000 |
Петро | 2000 |
Семен | 35000 |
У результаті буде два рядки з Петром, оскільки вони відрізняються значеннями, але рядок з Павлом буде один, бо рядки повністю ідентичні.
Використання UNION ALL при вибірці з двох таблиць
Використання UNION ALL
дає інший результат, оскільки дублікати не ігноруються. Отже, виконання запиту:
SELECT * FROM sales-2008 UNION ALL SELECT * FROM sales-2010;
дає наступний результат:
person | amount |
---|---|
Петро | 1000 |
Петро | 2000 |
Павло | 2000 |
Павло | 2000 |
Василь | 5000 |
Семен | 35000 |
Використання UNION при вибірці з однієї таблиці
Аналогічним чином можна поєднувати два різні запити з однієї таблиці (хоча замість цього, як правило, необхідні параметри комбінують в одному запиті за допомогою ключових слів AND
і OR
в умові Where):
SELECT person, amount FROM sales-2008 WHERE amount=1000 UNION SELECT person, amount FROM sales-2010 WHERE person like 'Василь';
У результаті отримаємо:
person | amount |
---|---|
Петро | 1000 |
Василь | 5000 |
Використання UNION як зовнішнє об'єднання
За допомогою UNION
можна створювати також повні зовнішні об'єднання (іноді використовується за відсутності вбудованої прямої підтримки зовнішніх об'єднань):
SELECT * FROM employee LEFT JOIN department ON employee.DepartmentID = department.DepartmentID UNION SELECT * FROM employee RIGHT JOIN department ON employee.DepartmentID = department.DepartmentID;
Але при цьому необхідно пам'ятати, що це все-таки не одне і те саме, що й оператор JOIN
.
Примітки
- Кузнецов, С. Д. (2001). Язык баз данных SQL/89 [Мова баз даних SQL/89]. CITForum (російською) . оригіналу за 29 грудня 2016. Процитовано 28 грудня 2016.
- UNION (Transact-SQL). MSDN (російською) . оригіналу за 23 вересня 2010. Процитовано 28 грудня 2016.
- Использование предложения UNION [Використання виразу UNION]. Sql.ru (російською) . оригіналу за 9 лютого 2010. Процитовано 28 грудня 2016.
Посилання
- SQL UNION Operator [Оператор SQL UNION]. W3Schools (англійською) . оригіналу за 7 жовтня 2010. Процитовано 28 грудня 2016.
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Union u movah podibnih do SQL DML operaciya ob yednannya zapisiv v odnu tablicyu Kriterij vidboru zapisiv dlya ob yednannya viznachayetsya virazom Where Obidva zapiti povinni povertati odnakove chislo stovpciv i mati sumisni tipi danih u vidpovidnih stovpcyah Cej operator bulo opisano u drugomu standarti SQL SintaksisOperator vkazuyetsya mizh zapitami U sproshenomu viglyadi ce viglyadaye tak lt zapit 1 gt UNION ALL lt zapit 2 gt UNION ALL lt zapit 3 gt Za zamovchuvannyam bud yaki povtoryuvani zapisi avtomatichno ignoruyutsya yaksho ne vikoristano viraz UNION ALL Neobhidno zaznachiti sho UNION sam po sobi ne garantuye poryadok ryadkiv Ryadki z drugogo zapitu mozhut viyavitisya na pochatku v kinci abo vzagali zmishatisya z ryadkami z pershogo zapitu U vipadkah koli potribno zabezpechiti pevnij poryadok neobhidno vikoristovuvati viraz Order by Pravila vikoristannyaIsnuyut dva osnovni pravila sho reglamentuyut poryadok vikoristannya operatora UNION Chislo ta poryadok vidobutih stovpciv povinni zbigatisya v usih zapitah sho ob yednuyutsya Tipi danih u vidpovidnih stovpcyah povinni buti sumisni Viznachennya stovpciv dani z yakih berutsya v ob yednuvalnih zapitah ne povinni zbigatisya prote povinni buti sumisnimi shlyahom neyavnogo peretvorennya Yaksho tipi danih riznyatsya to tip danih sho vijshov viznachayetsya na osnovi pravil chergovosti tipiv danih dlya konkretnoyi SKBD Yaksho tipi zbigayutsya ale rozriznyayutsya v tochnosti masshtabi abo dovzhini rezultat viznachayetsya na osnovi pravil vikoristovuvanih dlya ob yednannya viraziv dlya konkretnoyi SKBD Tipi danih ne viznacheni ANSI taki yak DATA i BINARY zazvichaj povinni zbigatisya z inshimi stovpcyami takogo zh nestandartnogo tipu U Microsoft SQL Server stovpci z tipom danih XML povinni buti ekvivalentnimi Vsi stovpchiki povinni abo mati tip viznachenij u XML shemi abo buti netipizovanimi Tipizovani stovpci povinni stosuvatisya odniyeyi i tiyeyi zh kolekciyi XML shem She odne obmezhennya na sumisnist ce zaborona porozhnih znachen NULL u bud yakomu stovpci ob yednannya prichomu ci znachennya neobhidno zaboroniti i dlya vsih vidpovidnih stovpciv v inshih zapitah ob yednannya oskilki porozhni znachennya NULL zaboroneni z obmezhennyam NOT NULL Krim togo ne mozhna vikoristovuvati UNION u pidzapitah a takozh ne mozhna vikoristovuvati agregatni funkciyi v rechenni Select zapitu v ob yednanni prote bilshist SKBD nehtuyut cimi obmezhennyami PrikladiVikoristannya UNION pri vibirci z dvoh tablic Dano dvi tablici sales 2008 person amount Petro 1000 Pavlo 2000 Vasil 5000 sales 2010 person amount Petro 2000 Pavlo 2000 Semen 35000 Pri vikonanni zapitu SELECT FROM sales 2008 UNION SELECT FROM sales 2010 vihodit rezultatnij nabir odnak poryadok ryadkiv mozhe buti dovilnim oskilki klyuchovij viraz ORDER BY ne bulo vikoristano person amount Petro 1000 Pavlo 2000 Vasil 5000 Petro 2000 Semen 35000 U rezultati bude dva ryadki z Petrom oskilki voni vidriznyayutsya znachennyami ale ryadok z Pavlom bude odin bo ryadki povnistyu identichni Vikoristannya UNION ALL pri vibirci z dvoh tablic Vikoristannya UNION ALL daye inshij rezultat oskilki dublikati ne ignoruyutsya Otzhe vikonannya zapitu SELECT FROM sales 2008 UNION ALL SELECT FROM sales 2010 daye nastupnij rezultat person amount Petro 1000 Petro 2000 Pavlo 2000 Pavlo 2000 Vasil 5000 Semen 35000 Vikoristannya UNION pri vibirci z odniyeyi tablici Analogichnim chinom mozhna poyednuvati dva rizni zapiti z odniyeyi tablici hocha zamist cogo yak pravilo neobhidni parametri kombinuyut v odnomu zapiti za dopomogoyu klyuchovih sliv AND i OR v umovi Where SELECT person amount FROM sales 2008 WHERE amount 1000 UNION SELECT person amount FROM sales 2010 WHERE person like Vasil U rezultati otrimayemo person amount Petro 1000 Vasil 5000 Vikoristannya UNION yak zovnishnye ob yednannya Za dopomogoyu UNION mozhna stvoryuvati takozh povni zovnishni ob yednannya inodi vikoristovuyetsya za vidsutnosti vbudovanoyi pryamoyi pidtrimki zovnishnih ob yednan SELECT FROM employee LEFT JOIN department ON employee DepartmentID department DepartmentID UNION SELECT FROM employee RIGHT JOIN department ON employee DepartmentID department DepartmentID Ale pri comu neobhidno pam yatati sho ce vse taki ne odne i te same sho j operator JOIN PrimitkiKuznecov S D 2001 Yazyk baz dannyh SQL 89 Mova baz danih SQL 89 CITForum rosijskoyu originalu za 29 grudnya 2016 Procitovano 28 grudnya 2016 UNION Transact SQL MSDN rosijskoyu originalu za 23 veresnya 2010 Procitovano 28 grudnya 2016 Ispolzovanie predlozheniya UNION Vikoristannya virazu UNION Sql ru rosijskoyu originalu za 9 lyutogo 2010 Procitovano 28 grudnya 2016 PosilannyaSQL UNION Operator Operator SQL UNION W3Schools anglijskoyu originalu za 7 zhovtnya 2010 Procitovano 28 grudnya 2016