- Union (SQL)
-
- Правильный заголовок этой статьи — UNION. Он показан некорректно из-за технических ограничений.
В языке SQL ключевое слово
UNION
применяется для объединения результатов двух SQL-запросов в единую таблицу, состоящую из схожих строк. Оба запроса должны возвращать одинаковое число столбцов и совместимые типы данных в соответствующих столбцах. Данный оператор был описан уже в самом первом стандарте 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
может быть весьма полезным в приложениях для хранения данных, где таблицы редко бывают абсолютно нормализированы. Простой пример: в базе есть таблицыsales2005
иsales2006
, обладающие идентичной структурой, но разделены ради повышения производительности. Запрос со словомUNION
позволяет объединить результаты из обеих таблиц.Также стоит отметить, что
UNION ALL
работает быстрее, чем простоUNION
, поскольку по умолчанию при использовании оператораUNION
проводится дополнительная фильтрация результата аналогичнаяSELECT DISTINCT
, а при использованииUNION ALL
— нет[4].Примеры
Использование UNION при выборке из двух таблиц
Даны две таблицы:
sales2005 person amount Иван 1000 Алексей 2000 Сергей 5000 sales2006 person amount Иван 2000 Алексей 2000 Петр 35000 При выполнении следующего запроса:
(SELECT * FROM sales2005) UNION (SELECT * FROM sales2006);
получается результирующий набор, однако порядок строк может произвольно меняться, поскольку ключевое выражение
ORDER BY
не было использовано:person amount Иван 1000 Алексей 2000 Сергей 5000 Иван 2000 Петр 35000 В результате отобразятся две строки с Иваном, так как эти строки различаются значениями в столбцах. Но при этом в результате присутствует лишь одна строка с Алексеем, поскольку значения в столбцах полностью совпадают.
Использование UNION ALL при выборке из двух таблиц
Применение
UNION ALL
дает другой результат, так как дубликаты не скрываются. Выполнение запроса:(SELECT * FROM sales2005) UNION ALL (SELECT * FROM sales2006);
даст следующий результат, выводимый без упорядочивания ввиду отсутствия выражения
ORDER BY
:person amount Иван 1000 Иван 2000 Алексей 2000 Алексей 2000 Сергей 5000 Петр 35000 Использование UNION при выборке из одной таблицы
Аналогичным образом можно объединять два разных запроса из одной и той же таблицы (хотя вместо этого, как правило, необходимые параметры комбинируют в одном запросе при помощи ключевых слов AND и OR в условии WHERE):
(SELECT person, amount FROM sales2005 WHERE amount=1000) UNION (SELECT person, amount FROM sales2005 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
.См. также
Примечания
- ↑ Язык баз данных SQL/89 (рус.)
- ↑ 1 2 UNION (Transact-SQL) (рус.)
- ↑ 1 2 Использование предложения UNION (рус.)
- ↑ Оптимизация запросов (рус.)
Пункт 4 - нерабочая ссылка (на 08.11.2012)
Ссылки
- Общее описание
- Понимание SQL. Глава 14. Использование предложения UNION (рус.)
- SQL UNION Operator (англ.)
- UNION (DISTINCT) and UNION ALL (англ.)
- Реализация в MS SQL Server
- Реализация в MySQL
- Querying data by using SQL UNION (примеры использования в MySQL) (англ.)
- UNION Syntax (в MySQL) (англ.)
- Реализация в PostgreSQL
- UNION Clause (в PostgreSQL) (англ.)
- Реализация в Oracle
- Реализация в Informix
SQL Версии SQL-86 • SQL-89 • SQL-92 • SQL:1999 • SQL:2003 • SQL:2008 Ключевые слова Create • Delete • From • Having • Insert • Join • Merge • Null • Order by • Prepare • Select • Top • Truncate • Union • Update • Where Related Эдгар Кодд • Реляционная база данных Категории:- Ключевые слова SQL
- Статьи с примерами кода SQL
Wikimedia Foundation. 2010.