Union — у мовах, подібних до SQL, DML-операція об'єднання записів в одну таблицю. Критерій відбору записів для об'єднання визначається виразом Where. Обидва запити повинні повертати однакове число стовпців і мати сумісні типи даних у відповідних стовпцях. Цей оператор було описано у другому стандарті SQL — SQL-89[1].

Синтаксис ред.

Оператор вказується між запитами. У спрощеному вигляді це виглядає так:

<запит1>
UNION [ALL]
<запит2>
UNION [ALL]
<запит3>
 .....

За замовчуванням, будь-які повторювані записи автоматично ігноруються, якщо не використано вираз UNION ALL.

Необхідно зазначити, що UNION сам по собі не гарантує порядок рядків. Рядки з другого запиту можуть виявитися на початку, в кінці або взагалі змішатися з рядками з першого запиту. У випадках, коли потрібно забезпечити певний порядок, необхідно використовувати вираз Order by.

Правила використання ред.

Існують два основні правила, що регламентують порядок використання оператора UNION:

  • Число та порядок видобутих стовпців повинні збігатися в усіх запитах, що об'єднуються;
  • Типи даних у відповідних стовпцях повинні бути сумісні.

Визначення стовпців, дані з яких беруться в об'єднувальних запитах, не повинні збігатися, проте повинні бути сумісними шляхом неявного перетворення. Якщо типи даних різняться, то тип даних, що вийшов, визначається на основі правил черговості типів даних (для конкретної СКБД). Якщо типи збігаються, але розрізняються в точності, масштабі або довжині, результат визначається на основі правил, використовуваних для об'єднання виразів (для конкретної СКБД)[2]. Типи даних, не визначені ANSI, такі як DATA і BINARY, зазвичай повинні збігатися з іншими стовпцями такого ж нестандартного типу[3].

У Microsoft SQL Server стовпці з типом даних XML повинні бути еквівалентними. Всі стовпчики повинні або мати тип, визначений у XML-схемі, або бути нетипізованими. Типізовані стовпці повинні стосуватися однієї і тієї ж колекції XML-схем[2].

Ще одне обмеження на сумісність — це заборона порожніх значень (NULL) у будь-якому стовпці об'єднання, причому ці значення необхідно заборонити і для всіх відповідних стовпців в інших запитах об'єднання, оскільки порожні значення (NULL) заборонені з обмеженням NOT NULL. Крім того, не можна використовувати UNION у підзапитах, а також не можна використовувати агрегатні функції в реченні Select запиту в об'єднанні (проте більшість СКБД нехтують цими обмеженнями)[3].

Приклади ред.

Використання UNION при вибірці з двох таблиць ред.

Дано дві таблиці:

sales-2008
person amount
Петро 1000
Павло 2000
Василь 5000
sales-2010
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.

Примітки ред.

  1. Кузнецов, С. Д. (2001). Язык баз данных SQL/89 [Мова баз даних SQL/89]. CITForum (російською) . Архів оригіналу за 29 грудня 2016. Процитовано 28 грудня 2016.
  2. а б UNION (Transact-SQL). MSDN (російською) . Архів оригіналу за 23 вересня 2010. Процитовано 28 грудня 2016.
  3. а б Использование предложения UNION [Використання виразу UNION]. Sql.ru (російською) . Архів оригіналу за 9 лютого 2010. Процитовано 28 грудня 2016.

Посилання ред.

  • SQL UNION Operator [Оператор SQL UNION]. W3Schools (англійською) . Архів оригіналу за 7 жовтня 2010. Процитовано 28 грудня 2016.