В языке SQL операция UNION применяется для объединения двух наборов строк, возвращаемых SQL-запросами. Оба запроса должны возвращать одинаковое число столбцов, и столбцы с одинаковым порядковым номером должны иметь совместимые типы данных. Результат получает структуру (названия и типы столбцов) первого (левого) запроса, то есть операция не является симметричной.
По умолчанию любые дублирующие записи автоматически скрываются, если не использовано выражение UNION ALL.
Необходимо отметить, что UNION сам по себе не гарантирует порядок строк. Строки из второго запроса могут оказаться в начале, в конце или вообще перемешаться со строками из первого запроса. В случаях, когда требуется определенный порядок, необходимо использовать выражение ORDER BY.
Существуют два основных правила, регламентирующие порядок использования оператора UNION:
UNION может быть весьма полезным в приложениях для хранения данных, где таблицы редко бывают абсолютно нормализированы. Простой пример: в базе есть таблицы sales2005 и sales2006, обладающие идентичной структурой, но разделены ради повышения производительности. Запрос со словом UNION позволяет объединить результаты из обеих таблиц.
- Использование UNION при выборке из двух таблиц
- Использование UNION ALL при выборке из двух таблиц
- Использование UNION при выборке из одной таблицы
- Использование UNION как внешнее объединение
- Описание
- Параметры или аргумент
- Примечание
- Пример — разные имена полей
- Параметры или аргументы
- Пример — использование ORDER BY
- Необходимые условия для операторов union и union all
- Примеры использования union и union all
Использование UNION при выборке из двух таблиц
В результате отобразятся две строки с Иваном, так как эти строки различаются значениями в столбцах. Но при этом в результате присутствует лишь одна строка с Алексеем, поскольку значения в столбцах полностью совпадают.
Использование UNION ALL при выборке из двух таблиц
Применение UNION ALL дает другой результат, так как дубликаты не скрываются. Выполнение запроса:
даст следующий результат, выводимый без упорядочивания ввиду отсутствия выражения ORDER BY:
Использование UNION при выборке из одной таблицы
Аналогичным образом можно объединять два разных запроса из одной и той же таблицы (хотя вместо этого, как правило, необходимые параметры комбинируют в одном запросе при помощи ключевых слов AND и OR в условии WHERE):
В результате получится:
Использование UNION как внешнее объединение
При помощи UNION можно создавать также полные внешние объединения (иногда используется в случае отсутствия встроенной прямой поддержки внешних объединений):
Но при этом необходимо помнить, что это все же не одно и то же, что и оператор JOIN.
Реализация в MS SQL Server
Реализация в MySQL
Реализация в PostgreSQL
Реализация в Oracle
Реализация в Informix
В этом учебном материале вы узнаете, как использовать SQL оператор UNION с синтаксисом и примерами.
Описание
SQL оператор UNION используется для объединения результирующих наборов из 2 или более операторов SELECT. Он удаляет повторяющиеся строки между различными запросами SELECT.
Каждый оператор SELECT в UNION должен иметь одинаковое количество полей в наборах результатов с одинаковыми типами данных.
Параметры или аргумент
Столбцы или расчеты, которые вы хотите получитьТаблицы, из которых вы хотите получить записи. В предложении FROM должна быть указана хотя бы одна таблицаНеобязательный. Условия, которые должны быть выполнены для записей, которые будут выбраны
Примечание
Давайте посмотрим, как использовать SQL оператор UNION, который возвращает одно поле. В этом простом примере поле в обоих операторах SELECT будет иметь одинаковое имя и тип данных.
Например.
В этом SQL примере оператора UNION, если появилось в таблицах и , оно будет один раз в вашем наборе результатов. Оператор UNION удаляет дубликаты. Если вы не хотите удалить дубликаты, попробуйте использовать оператор UNION ALL.
Теперь давайте рассмотрим этот пример, далее приведем некоторые данные.
Если у вас была таблица , заполненная следующими записями.
Как видно из этого примера, UNION взял все значения из таблицы , а также из таблицы и возвратил комбинированный набор результатов. Поскольку оператор UNION удалил дубликаты между результирующими наборами, поле 2000 отображается только один раз, даже если оно находится в таблицах и . Если вы не хотите удалять дубликаты, попробуйте вместо этого использовать оператор UNION ALL.
Пример — разные имена полей
Нет необходимости, чтобы соответствующие столбцы в каждом операторе SELECT имели одинаковые имена, но они должны быть с одинаковыми, соответствующими типами данных.
Если у вас нет одинаковых имен столбцов между операторами SELECT, это становится немного сложнее, особенно если вы хотите упорядочить результаты запроса, используя оператор ORDER BY.
Давайте посмотрим, как использовать оператор UNION с разными именами столбцов и упорядочиванием результатов запроса.
Например.
В этом SQL примере UNION, поскольку имена столбцов в двух операторах SELECT различаются, более выгодно ссылаться на столбцы в ORDER BY по их положению в наборе результатов. В этом примере мы отсортировали результаты по / в порядке возрастания, как обозначено ORDER BY 1. Поля / находятся в позиции № 1 в наборе результатов.
Во-первых, обратите внимание, что запись с , равной 3000, появляется только один раз в наборе результатов, поскольку запрос UNION удалил повторяющиеся записи.
Во-вторых, обратите внимание, что заголовки столбцов в наборе результатов называются и . Это потому, что это были имена столбцов, использованных в первом операторе SELECT в UNION.
Если бы вы хотели, вы могли бы присвоить псевдонимы столбцам следующим образом.
Теперь заголовки столбцов в результате будут иметь псевдоним как для первого столбца и для второго столбца.
В этом учебном материале вы узнаете, как использовать SQL оператор UNION ALL с синтаксисом и примерами.
SQL оператор UNION ALL используется для объединения результирующих наборов из 2 или более операторов SELECT. Он не удаляет повторяющиеся строки между различными операторами SELECT (возвращаются все строки).
Каждый оператор SELECT в UNION ALL должен иметь одинаковое количество полей в наборах результатов с одинаковыми типами данных.
Давайте посмотрим, как использовать SQL оператор UNION ALL, который возвращает одно поле. В этом простом примере поле в обоих операторах SELECT будет иметь одинаковое имя и тип данных.
Например.
Этот SQL пример UNION ALL будет возвращать несколько раз в наборе результатов, если это же значение появилось в таблицах и . S QL оператор UNION ALL не удаляет дубликаты. Если вы хотите удалить дубликаты, попробуйте использовать оператор UNION.
Теперь давайте рассмотрим этот пример, далее приведем некоторые данные.
Если у вас была таблица , заполненная следующими записями.
Как видно из этого примера, UNION ALL взял все значения из таблицы , а также из таблицы и возвратил комбинированный набор результатов. Дубликаты не были удалены, как вы можете видеть по значению 2000, которое дважды появляется в наборе результатов.
Нет необходимости, чтобы соответствующие столбцы в каждом операторе SELECT имели одинаковые имена, но они должны быть с одинаковыми соответствующими типами данных.
Если у вас нет одинаковых имен столбцов в операторах SELECT, это становится немного сложнее, особенно если вы хотите упорядочить результаты запроса, используя оператор ORDER BY.
Давайте посмотрим, как использовать оператор UNION ALL с разными именами столбцов, и упорядочить результаты запроса.
Например.
В этом SQL примере UNION ALL, поскольку имена столбцов в двух операторах SELECT различаются, более выгодно ссылаться на столбцы в предложении ORDER BY по их положению в наборе результатов. В этом примере мы отсортировали результаты по / в порядке возрастания, как обозначено ORDER BY 1. Поля / находятся в позиции № 1 в наборе результатов.
Теперь давайте рассмотрим этот пример подробнее с данными.
Во-первых, обратите внимание, что запись с , равной 3000, появляется дважды в наборе результатов, поскольку запрос UNION ALL возвращает все строки и не удаляет дубликаты.
Во-вторых, обратите внимание, что заголовки столбцов в наборе результатов называются и . Это потому, что это были имена столбцов, использованных в первом операторе SELECT в UNION ALL.
Если бы вы хотели, вы могли бы присвоить псевдонимы следующим образом.
В этом учебном пособии вы узнаете, как использовать MySQL оператор UNION с синтаксисом и примерами.
MySQL оператор UNION используется для объединения наборов результатов из 2 или более SELECT предложений. Он удаляет повторяющиеся строки между различными предложениями SELECT.
Каждое предложение SELECT в операторе UNION должно иметь одинаковое количество полей в наборах результатов с одинаковыми типами данных.
Параметры или аргументы
Ниже приведен пример MySQL оператора UNION, который возвращает одно поле из нескольких SELECT предложений (и оба поля имеют одинаковый тип данных):
В этом примере с MySQL оператором UNION, если используется как в , так и в таблице , он появится один раз в вашем результирующем наборе. MySQL оператор UNION удалит дубликаты. Если вы не хотите удалять дубликаты, попробуйте использовать MySQL оператор UNION ALL.
Пример — использование ORDER BY
MySQL оператор UNION может использовать предложение ORDER BY, для определения результатов запроса.
Например:
Поскольку имена столбцов различаются между двумя предложениями SELECT, то в этом MySQL операторе UNION, более выгодно ссылаться на столбцы в предложении ORDER BY по их позиции в результирующем наборе. В этом примере мы отсортировали результаты по / в порядке возрастания, как обозначено ORDER BY 2.
Поля / находятся в позиции № 2 результирующего набора.
Пришло время поговорить об объединении данных по средствам конструкции union и union all, так как это иногда бывает очень полезно, и без использования такой конструкции бывает порой не обойтись. Примеры будем писать в СУБД MSSQL 2008, используя язык SQL.
И начать хотелось бы с того, что мы с Вами уже рассматривали много примеров написания запросов на SQL, например, оператор select языка SQL, или использование строковых функций SQL, также рассматривали программирование как на plpgsql так и на transact-sql, например, Как написать функцию на PL/pgSQL и Transact-sql – Табличные функции и временные таблицы соответственно.
Я не просто так указал вышеперечисленные статьи, а указал я их, потому, что для более лучшего понимания и усвоения сегодняшнего урока, необходимо начальные знания (это сайт для начинающих программистов), которые как раз Вы можете получить из вышеупомянутого материала.
И так приступим. И для начала давайте рассмотрим, что же это за операторы union и union all.
Заметка! Профессиональный видеокурс по T-SQL для начинающих.
Необходимые условия для операторов union и union all
Теперь давайте поговорим о том, в каких случаях нам может понадобиться использование этих операторов. Ну, например, у Вас есть несколько баз со схожей структурой, каждая из которых создана, например, для какого-нибудь филиала, а Вам необходимо объединить эти данные для предоставления отчетности по всем филиалам руководству и самое простое как это можно сделать, это написать запросы на SQL, каждый из которых будет обращаться к разным базам, и через конструкцию union или union all объединить их. Также иногда бывает необходимо объединить данные в одной базе таким образом, что обычными объединениями это не реализовать и приходится использовать union. Почему я говорю «приходится» да потому что данная конструкция значительно увеличивает время выполнения запроса, если например данных очень много, и злоупотреблять ею не нужно.
Хватит теории, переходим к практике.
Примечание! Как уже говорилось, запросы будем писать в Management Studio для SQL Server 2008
Примеры использования union и union all
Для начала создадим две простых таблицы test_table и test_table_2
Они одинаковые для примера, только разные названия. Я заполнил их вот такими данными:
А теперь давайте рассмотрим, какие могут быть ошибки даже в этом простом запросе. Например, мы перепутали последовательность полей:
Или мы в первом запросе указали дополнительное поле, а во втором этого не сделали.
Также, например, при использовании order by:
Здесь мы указали сортировку в каждом запросе, а нужно было только в последнем, например:
select number, text from test_table
union all
select number, text from test_table_2
order by number
И напоследок, хотел рассказать об одной хитрости, которую можно использовать тогда когда, например, все-таки необходимо вывести в одном запросе какое-то поле, а в других его нет или просто оно не нужно, для этого можете написать вот такой запрос:
select id ,number, text from test_table
union all
select », number, text from test_table_2
т.е. как Вы видите просто там, где должно быть поле ставить пусто и запрос отлично отработает, например:
И еще один небольшой совет, так как запросы при объединении через union довольно обширные, то лучше на их основе создать представление (Views), в случае если данный запрос Вам требуется постоянно, и уже к этому представлению обращаться каждый раз, когда требуется, а зачем нужны представления мы с Вами уже рассматривали вот здесь – Что такое представления и зачем они нужны.
Наверное, все, что я хотел рассказать о конструкции union и union all языка SQL я рассказал, если есть вопросы по использованию этих операторов, задавайте их в комментариях. Удачи!
Заметка! Для комплексного изучения языка T-SQL рекомендую посмотреть мои видеокурсы по T-SQL, в которых используется последовательная методика обучения и рассматриваются все конструкции языка SQL и T-SQL.