Union (SQL)В языке SQL операция UNION применяется для объединения двух наборов строк, возвращаемых SQL-запросами. Оба запроса должны возвращать одинаковое число столбцов, и столбцы с одинаковым порядковым номером должны иметь совместимые типы данных. Результат получает структуру (названия и типы столбцов) первого (левого) запроса, то есть операция не является симметричной. При объединении нескольких запросов подряд результат последовательно вычисляется слева направо. Данный оператор был описан в первом стандарте SQL — SQL/89[1]. СинтаксисОператор указывается между запросами. В упрощенном виде это выглядит следующим образом: <запрос1>
UNION [ALL]
<запрос2>
UNION [ALL]
<запрос3>
.....;
По умолчанию любые дублирующие записи автоматически скрываются, если не использовано выражение Необходимо отметить, что Правила использованияСуществуют два основных правила, регламентирующие порядок использования оператора
Типы данных столбцов, данные из которых извлекаются в объединяемых запросах, не обязательно должны полностью совпадать, однако должны быть совместимыми путём неявного преобразования. Если типы данных различаются, то получившийся тип данных определяется на основе правил очередности типов данных (для конкретной СУБД). Если типы совпадают, но различаются в точности, масштабе или длине, результат определяется на основе правил, используемых для объединения выражений (для конкретной СУБД)[2]. Типы не определенные ANSI, такие как DATA и BINARY, обычно должны совпадать с другими столбцами такого же нестандартного типа[3]. В Microsoft SQL Server столбцы с типом данных XML должны быть эквивалентными. Все столбцы должны либо иметь тип, определенный в XML-схеме, либо быть нетипизированными. Типизированные столбцы должны относиться к одной и той же коллекции XML-схем[2]. Ещё одно ограничение на совместимость — это запрет пустых значений (NULL) в любом столбце объединения, причем эти значения необходимо запретить и для всех соответствующих столбцов в других запросах объединения, поскольку пустые значения (NULL) запрещены с ограничением NOT NULL. Кроме того, нельзя использовать UNION в подзапросах, а также нельзя использовать агрегатные функции в предложении SELECT запроса в объединении (однако большинство СУБД пренебрегают этими ограничениями)[3]. Применение
Также стоит отметить, что ПримерыИспользование UNION при выборке из двух таблицДаны две таблицы:
При выполнении следующего запроса: (SELECT * FROM sales2005)
UNION
(SELECT * FROM sales2006);
получается результирующий набор, однако порядок строк может произвольно меняться, поскольку ключевое выражение
В результате отобразятся две строки с Иваном, так как эти строки различаются значениями в столбцах. Но при этом в результате присутствует лишь одна строка с Алексеем, поскольку значения в столбцах полностью совпадают. Использование UNION ALL при выборке из двух таблицПрименение (SELECT * FROM sales2005)
UNION ALL
(SELECT * FROM sales2006);
даст следующий результат, выводимый без упорядочивания ввиду отсутствия выражения
Использование UNION при выборке из одной таблицыАналогичным образом можно объединять два разных запроса из одной и той же таблицы (хотя вместо этого, как правило, необходимые параметры комбинируют в одном запросе при помощи ключевых слов AND и OR в условии WHERE): (SELECT person, amount FROM sales2005 WHERE amount=1000)
UNION
(SELECT person, amount FROM sales2005 WHERE person like 'Сергей');
В результате получится:
Использование UNION как внешнее объединениеПри помощи (SELECT *
FROM employee
LEFT JOIN department
ON employee.DepartmentID = department.DepartmentID)
UNION
(SELECT *
FROM employee
RIGHT JOIN department
ON employee.DepartmentID = department.DepartmentID);
Но при этом необходимо помнить, что это все же не одно и то же, что и оператор См. такжеПримечания
Пункт 4 - нерабочая ссылка (на 08.11.2012) СсылкиОбщее описание
Реализация в MS SQL Server
Реализация в MySQL
Реализация в PostgreSQL
Реализация в Oracle
Реализация в Informix |