Sql server union: Объединение UNION и UNION ALL в SQL – описание и примеры | Info-Comp.ru

Содержание

Объединение UNION и UNION ALL в SQL – описание и примеры | Info-Comp.ru

Пришло время поговорить об объединении данных по средствам конструкции 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 – это оператор SQL для объединения результирующего набора данных нескольких запросов, и данный оператор выводит только уникальные строки в запросах, т.е. например, Вы объединяете два запроса и в каждом из которых есть одинаковые данные, другими словами полностью идентичные, и оператор union объединит их в одну строку для того чтобы не было дублей;
  • UNION ALL – это оператор SQL для объединения результирующего набора данных нескольких запросов, а вот данный оператор, выведет уже абсолютно все строки, даже дубли.

Необходимые условия для операторов union и union all

  1. Набор полей должен быть одинаковый во всех запросах, т.е. количество полей в каждом  запросе, который будет объединяться по средствам конструкции union или union all, должно быть одинаковое;
  2. Типы данных полей также должны совпадать в каждом запросе, т.е. например, если Вы захотите написать один запрос, в котором будет тип данных int а во втором запросе тип данных varchar то у Вас запрос не выполнится а окно запроса выведет ошибку;
  3. В случае сортировки оператор order by можно указать только после последнего запроса.

Теперь давайте поговорим о том, в каких случаях нам может понадобиться использование этих операторов. Ну, например,  у Вас есть несколько баз со схожей структурой, каждая из которых создана, например, для какого-нибудь филиала, а Вам необходимо объединить эти данные для предоставления отчетности по всем филиалам руководству и самое простое как это можно сделать, это написать запросы на SQL, каждый из которых будет обращаться к разным базам, и через конструкцию union или union all объединить их. Также иногда бывает необходимо объединить данные в одной базе таким образом, что обычными объединениями это не реализовать и приходится использовать union. Почему я говорю «приходится» да потому что данная конструкция значительно увеличивает время выполнения запроса, если например данных очень много, и злоупотреблять ею не нужно.

Хватит теории, переходим к практике.

Примечание! Как уже говорилось, запросы будем писать в Management Studio для SQL Server 2008

Примеры использования union и union all

Для начала создадим две простых таблицы test_table и test_table_2

CREATE TABLE [test_table](
        [id] [bigint] IDENTITY(1,1) NOT NULL,
        [number] [numeric](18, 0) NULL,
        [text] [varchar](50) NULL,
 CONSTRAINT [PK_test_table] PRIMARY KEY CLUSTERED 
(
        [id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, 
ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

SET ANSI_PADDING OFF
GO
--и вторая таблица
CREATE TABLE [test_table_2](
        [id] [bigint] IDENTITY(1,1) NOT NULL,
        [number] [numeric](18, 0) NULL,
        [text] [varchar](50) NULL,
 CONSTRAINT [PK_test_table_2] PRIMARY KEY CLUSTERED 
(
        [id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, 
ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

SET ANSI_PADDING OFF
GO

Они одинаковые для примера, только разные названия. Я заполнил их вот такими данными:

Теперь давайте напишем запрос, который объединит результирующие данные в одни, например через union. Синтаксис очень прост:

Запрос 1
 union
Запрос 2
 union
Запрос 3
 и т.д.

Вот запрос:

select number, text from test_table
 union
select number, text from test_table_2

Как Вы видите, вывелось всего 5 строк, так как у нас первая строка в первом запросе и первая строка во втором запросе одинаковые, поэтому они объединились.

Теперь давайте объединим  через union all

Вот запрос:

select number, text from test_table
 union all
select number, text from test_table_2

Здесь уже вывелись все строки, так как мы указали union all.

А теперь давайте рассмотрим, какие могут быть ошибки даже в этом простом запросе. Например, мы перепутали последовательность полей:

Или мы в первом запросе указали дополнительное поле, а во втором этого не сделали.

Также, например, при использовании 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.

Нравится6Не нравится1

SQL оператор UNION ALL — Oracle PL/SQL •MySQL •MariaDB •SQL Server •SQLite

В этом учебном материале вы узнаете, как использовать SQL оператор

UNION ALL с синтаксисом и примерами.

Описание

SQL оператор UNION ALL используется для объединения результирующих наборов из 2 или более операторов SELECT. Он не удаляет повторяющиеся строки между различными операторами SELECT (возвращаются все строки).
Каждый оператор SELECT в UNION ALL должен иметь одинаковое количество полей в наборах результатов с одинаковыми типами данных.

В чем разница между UNION и UNION ALL?

  • Оператор UNION удаляет повторяющиеся строки.
  • UNION ALL не удаляет повторяющиеся строки

Синтаксис

Синтаксис для оператора UNION ALL в SQL.

SELECT expression1, expression2, … expression_n
FROM tables
[WHERE conditions]
UNION ALL
SELECT expression1, expression2, … expression_n
FROM tables
[WHERE conditions];

Параметры или аргумент

expression1, expression2, expression_n
Столбцы или расчеты, которые вы хотите получить
tables
Таблицы, из которых вы хотите получить записи. В предложении FROM должна быть указана хотя бы одна таблица
WHERE conditions
Необязательный. Условия, которые должны быть выполнены для записей, которые будут выбраны

Примечание

  • В обоих запросах SELECT должно быть одинаковое количество выражений
  • Соответствующие выражения должны иметь одинаковый тип данных в запросах SELECT. Например: expression1 должен иметь одинаковый тип данных как в первом, так и во втором операторе SELECT
  • Смотрите также оператор UNION

Пример — одиночное поле с тем же именем

Давайте посмотрим, как использовать SQL оператор UNION ALL, который возвращает одно поле. В этом простом примере поле в обоих операторах SELECT будет иметь одинаковое имя и тип данных.

Например.

SELECT supplier_id FROM suppliers UNION ALL SELECT supplier_id FROM orders ORDER BY supplier_id;

SELECT supplier_id

  FROM suppliers

UNION ALL

SELECT supplier_id

  FROM orders

ORDER BY supplier_id;

Этот SQL пример UNION ALL будет возвращать supplier_id несколько раз в наборе результатов, если это же значение появилось в таблицах suppliers и orders. SQL оператор UNION ALL не удаляет дубликаты. Если вы хотите удалить дубликаты, попробуйте использовать оператор UNION.
Теперь давайте рассмотрим этот пример, далее приведем некоторые данные.
Если у вас была таблица suppliers, заполненная следующими записями.

supplier_idsupplier_name
1000Microsoft
2000Oracle
3000Apple
4000Samsung

И таблица orders заполнена следующими записями.

order_idorder_datesupplier_id
2019-07-012000
2019-07-016000
2019-07-027000
2019-07-038000

И вы выполнили следующий оператор UNION ALL.

SELECT supplier_id FROM suppliers UNION ALL SELECT supplier_id FROM orders ORDER BY supplier_id;

SELECT supplier_id

  FROM suppliers

UNION ALL

SELECT supplier_id

  FROM orders

ORDER BY supplier_id;

Вы получите следующие результаты.

supplier_id
1000
2000
2000
3000
4000
6000
7000
8000

Как видно из этого примера, UNION ALL взял все значения supplier_id из таблицы suppliers, а также из таблицы orders и возвратил комбинированный набор результатов. Дубликаты не были удалены, как вы можете видеть по значению supplier_id 2000, которое дважды появляется в наборе результатов.

Пример — разные имена полей

Нет необходимости, чтобы соответствующие столбцы в каждом операторе SELECT имели одинаковые имена, но они должны быть с одинаковыми соответствующими типами данных.
Если у вас нет одинаковых имен столбцов в операторах SELECT, это становится немного сложнее, особенно если вы хотите упорядочить результаты запроса, используя оператор ORDER BY.
Давайте посмотрим, как использовать оператор UNION ALL с разными именами столбцов, и упорядочить результаты запроса.

Например.

SELECT supplier_id, supplier_name FROM suppliers WHERE supplier_id > 2000 UNION ALL SELECT company_id, company_name FROM companies WHERE company_id > 1000 ORDER BY 1;

SELECT supplier_id,

       supplier_name

  FROM suppliers

WHERE supplier_id > 2000

UNION ALL

SELECT company_id, company_name

  FROM companies

WHERE company_id > 1000

ORDER BY 1;

В этом SQL примере UNION ALL, поскольку имена столбцов в двух операторах SELECT различаются, более выгодно ссылаться на столбцы в предложении ORDER BY по их положению в наборе результатов. В этом примере мы отсортировали результаты по supplier_id / company_id в порядке возрастания, как обозначено ORDER BY 1. Поля supplier_id / company_id находятся в позиции № 1 в наборе результатов.
Теперь давайте рассмотрим этот пример подробнее с данными.
Если у вас была таблица suppliers, заполненная следующими записями.

supplier_idsupplier_name
1000Microsoft
2000Oracle
3000Apple
4000Samsung

И таблица companies заполнилась следующими записями.

company_idcompany_name
1000Microsoft
3000Apple
7000Sony
8000IBM

И вы выполнили следующий запрос содержащий UNION ALL.

SELECT supplier_id, supplier_name FROM suppliers WHERE supplier_id > 2000 UNION ALL SELECT company_id, company_name FROM companies WHERE company_id > 1000 ORDER BY 1;

SELECT supplier_id,

       supplier_name

  FROM suppliers

WHERE supplier_id > 2000

UNION ALL

SELECT company_id, company_name

  FROM companies

WHERE company_id > 1000

ORDER BY 1;

Вы получите следующие результаты.

supplier_idsupplier_name
3000Apple
3000Apple
4000Samsung
7000Sony
8000IBM

Во-первых, обратите внимание, что запись с supplier_id, равной 3000, появляется дважды в наборе результатов, поскольку запрос UNION ALL возвращает все строки и не удаляет дубликаты.
Во-вторых, обратите внимание, что заголовки столбцов в наборе результатов называются supplier_id и supplier_name. Это потому, что это были имена столбцов, использованных в первом операторе SELECT в UNION ALL.
Если бы вы хотели, вы могли бы присвоить псевдонимы следующим образом.

SELECT supplier_id AS ID_Value, supplier_name AS Name_Value FROM suppliers WHERE supplier_id > 2000 UNION ALL SELECT company_id AS ID_Value, company_name AS Name_Value FROM companies WHERE company_id > 1000 ORDER BY 1;

SELECT supplier_id AS ID_Value,

       supplier_name AS Name_Value

  FROM suppliers

WHERE supplier_id > 2000

UNION ALL

SELECT company_id AS ID_Value, company_name AS Name_Value

  FROM companies

WHERE company_id > 1000

ORDER BY 1;

Теперь заголовки столбцов в результате будут иметь псевдоним как ID_Value для первого столбца и Name_Value для второго столбца.

ID_ValueName_Value
3000Apple
3000Apple
4000Samsung
7000Sony
8000IBM

SQL оператор UNION — Oracle PL/SQL •MySQL •MariaDB •SQL Server •SQLite

В этом учебном материале вы узнаете, как использовать SQL оператор UNION с синтаксисом и примерами.

Описание

SQL оператор UNION используется для объединения результирующих наборов из 2 или более операторов SELECT. Он удаляет повторяющиеся строки между различными запросами SELECT.
Каждый оператор SELECT в UNION должен иметь одинаковое количество полей в наборах результатов с одинаковыми типами данных.

В чем разница между UNION и UNION ALL

  • UNION удаляет повторяющиеся строки
  • Оператор UNION ALL не удаляет повторяющиеся строки

Синтаксис

Синтаксис для оператора UNION в SQL.

SELECT expression1, expression2, … expression_n
FROM tables
[WHERE conditions]
UNION
SELECT expression1, expression2, … expression_n
FROM tables
[WHERE conditions];

Параметры или аргумент

expression1, expression2, expression_n
Столбцы или расчеты, которые вы хотите получить
tables
Таблицы, из которых вы хотите получить записи. В предложении FROM должна быть указана хотя бы одна таблица
WHERE conditions
Необязательный. Условия, которые должны быть выполнены для записей, которые будут выбраны

Примечание

  • В обоих операторах SELECT должно быть одинаковое количество выражений
  • Соответствующие выражения должны иметь одинаковый тип данных в запросах SELECT. Например: expression1 должен иметь одинаковый тип данных как в первом, так и во втором операторе SELECT
  • Смотрите также оператор UNION ALL

Пример — одиночное поле с тем же именем

Давайте посмотрим, как использовать SQL оператор UNION, который возвращает одно поле. В этом простом примере поле в обоих операторах SELECT будет иметь одинаковое имя и тип данных.
Например.

SELECT supplier_id FROM suppliers UNION SELECT supplier_id FROM orders ORDER BY supplier_id;

SELECT supplier_id

  FROM suppliers

UNION

SELECT supplier_id

  FROM orders

ORDER BY supplier_id;

В этом SQL примере оператора UNION, если supplier_id появилось в таблицах suppliers и orders, оно будет один раз в вашем наборе результатов. Оператор UNION удаляет дубликаты. Если вы не хотите удалить дубликаты, попробуйте использовать оператор UNION ALL.
Теперь давайте рассмотрим этот пример, далее приведем некоторые данные.
Если у вас была таблица suppliers, заполненная следующими записями.

supplier_idsupplier_name
1000Yandex
2000Google
3000Oracle
4000Bing

И таблица orders заполнена следующими записями.

order_idorder_datesupplier_id
2019-07-012000
2019-07-016000
2019-07-027000
2019-07-038000

И вы выполнили следующий запрос UNION.

SELECT supplier_id FROM suppliers UNION SELECT supplier_id FROM orders ORDER BY supplier_id;

SELECT supplier_id

  FROM suppliers

UNION

SELECT supplier_id

  FROM orders

ORDER BY supplier_id;

Вы получите следующие результаты.

supplier_id
1000
2000
3000
4000
6000
7000
8000

Как видно из этого примера, UNION взял все значения supplier_id из таблицы suppliers, а также из таблицы orders и возвратил комбинированный набор результатов. Поскольку оператор UNION удалил дубликаты между результирующими наборами, поле supplier_id 2000 отображается только один раз, даже если оно находится в таблицах suppliers и orders. Если вы не хотите удалять дубликаты, попробуйте вместо этого использовать оператор UNION ALL.

Пример — разные имена полей

Нет необходимости, чтобы соответствующие столбцы в каждом операторе SELECT имели одинаковые имена, но они должны быть с одинаковыми, соответствующими типами данных.
Если у вас нет одинаковых имен столбцов между операторами SELECT, это становится немного сложнее, особенно если вы хотите упорядочить результаты запроса, используя оператор ORDER BY.
Давайте посмотрим, как использовать оператор UNION с разными именами столбцов и упорядочиванием результатов запроса.
Например.

SELECT supplier_id, supplier_name FROM suppliers WHERE supplier_id > 2000 UNION SELECT company_id, company_name FROM companies WHERE company_id > 1000 ORDER BY 1;

SELECT supplier_id,

       supplier_name

  FROM suppliers

WHERE supplier_id > 2000

UNION

SELECT company_id,

       company_name

  FROM companies

WHERE company_id > 1000

ORDER BY 1;

В этом SQL примере UNION, поскольку имена столбцов в двух операторах SELECT различаются, более выгодно ссылаться на столбцы в ORDER BY по их положению в наборе результатов. В этом примере мы отсортировали результаты по supplier_id / company_id в порядке возрастания, как обозначено ORDER BY 1. Поля supplier_id / company_id находятся в позиции № 1 в наборе результатов.

Теперь давайте рассмотрим этот пример подробнее с данными.
Если у вас была таблица suppliers, заполненная следующими записями.

supplier_idsupplier_name
1000Microsoft
2000Oracle
3000Apple
4000Samsung

И таблица companies заполнилась следующими записями.

company_idcompany_name
1000Microsoft
3000Apple
7000Sony
8000IBM

И вы выполнили следующий оператор UNION.

SELECT supplier_id, supplier_name FROM suppliers WHERE supplier_id > 2000 UNION SELECT company_id, company_name FROM companies WHERE company_id > 1000 ORDER BY 1;

SELECT supplier_id,

       supplier_name

  FROM suppliers

WHERE supplier_id > 2000

UNION

SELECT company_id, company_name

  FROM companies

WHERE company_id > 1000

ORDER BY 1;

Вы получите следующие результаты.

supplier_idsupplier_name
3000Apple
4000Samsung
7000Sony
8000IBM

Во-первых, обратите внимание, что запись с supplier_id, равной 3000, появляется только один раз в наборе результатов, поскольку запрос UNION удалил повторяющиеся записи.
Во-вторых, обратите внимание, что заголовки столбцов в наборе результатов называются supplier_id и supplier_name. Это потому, что это были имена столбцов, использованных в первом операторе SELECT в UNION.
Если бы вы хотели, вы могли бы присвоить псевдонимы столбцам следующим образом.

SELECT supplier_id AS ID_Value, supplier_name AS Name_Value FROM suppliers WHERE supplier_id > 2000 UNION SELECT company_id AS ID_Value, company_name AS Name_Value FROM companies WHERE company_id > 1000 ORDER BY 1;

SELECT supplier_id AS ID_Value,

   supplier_name AS Name_Value

  FROM suppliers

WHERE supplier_id > 2000

UNION

SELECT company_id AS ID_Value,

       company_name AS Name_Value

  FROM companies

WHERE company_id > 1000

ORDER BY 1;

Теперь заголовки столбцов в результате будут иметь псевдоним как ID_Value для первого столбца и Name_Value для второго столбца.

ID_ValueName_Value
3000Apple
4000Samsung
7000Sony
8000IBM

SQL UNION — оператор для объединения результатов запросов

Оператор языка SQL UNION предназначен для объединения результирующих таблиц базы данных, полученных с применением слова SELECT. Условие объединения результирующих таблиц: совпадение числа, порядка следования и типа данных столбцов. ORDER BY следует применять к результату объединения и размещать только в конце составного запроса. Оператор UNION имеет следующий синтаксис:

SELECT ИМЕНА_СТОЛБЦОВ (1..N) FROM ИМЯ_ТАБЛИЦЫ UNION SELECT ИМЕНА_СТОЛБЦОВ (1..N) FROM ИМЯ_ТАБЛИЦЫ

В этой конструкции объединяемые запросы могут иметь условия в секции WHERE, а могут не иметь их. При помощи оператора UNION можно объединить запросы на извлечение данных как из одной таблицы, так и из разных.

При использовании оператора UNION без слова ALL результат не содержит дубликатов, а со словом ALL — содержит дубликаты.

Одним запросом можно вывести из таблицы индивидуальные значения столбцов, например, число лет, проработанных сотрудниками фирмы, размеры их заработной платы и другие. Другим запросом — с использованием агрегатных функций — можно получить, например, сумму заработных плат, получаемых сотрудниками отделов или занимающих те или иные должности, или среднее число лет трудового стажа (в таких запросах применяется группировка с помощью оператора GROUP BY).

А если нам требуется получить в одной таблице и сводку всех индивидуальных значений, и итоговые значения? Здесь на помощь приходит оператор SQL UNION, с помощью которого два запроса объединяются. К результату объединения требуется применить упорядочение, используя оператор ORDER BY. Для чего это необходимо, будет лучше понятно из примеров.

Если вы хотите выполнить запросы к базе данных из этого урока на MS SQL Server, но эта СУБД не установлена на вашем компьютере, то ее можно установить, пользуясь инструкцией по этой ссылке.

Пример 1. В базе данных фирмы есть таблица Staff, содержащая данные о сотрудниках фирмы. В ней есть столбцы Salary (размер заработной платы), Job (должность) и Years (длительность трудового стажа). Первый запрос возвращает индивидуальные размеры заработной платы, упорядоченные по должностям:

SELECT Name, Job, Salary FROM STAFF ORDER BY Job

Результатом выполнения запроса будет следующая таблица:

NameJobSalary
SandersMgr18357.5
MarenghiMgr17506.8
PernalSales18171.2
DoctorSales12322.4
FactorSales16228.7

Второй запрос вернёт суммарную заработную плату по должностям. Мы уже готовим этот запрос для соединения с первым, поэтому будем помнить, что условием соединения является равное число столбцов, совпадение их названий, порядка следования и типов данных. Поэтому включаем в таблицу с итогами также столбец Name с произвольным значением ‘Z-TOTAL’:

SELECT ‘Z-TOTAL’ AS Name, Job, SUM(Salary) AS Salary FROM STAFF GROUP BY Job

Результатом выполнения запроса будет следующая таблица:

NameJobSalary
Z-TOTALMgr35864.3
Z-TOTALSales46722.3

Теперь объединим запросы при помощи оператора UNION и применим оператору ORDER BY к результату объединения. Группировать следует по двум столбцам: должность (Job) и имя (Name), чтобы строки с итоговыми (суммарными) значениями, в которых значение имени — ‘Z-TOTAL’, находились ниже строк с индивидуальными значениями. Объединение результатов запросов будет следующим:

(SELECT Name, Job, Salary FROM STAFF) UNION (SELECT ‘Z-TOTAL’ AS Name, Job, SUM(Salary) AS Salary FROM STAFF GROUP BY Job) ORDER BY Job, Name

Результатом выполнения запроса с оператором UNION будет следующая таблица, в которой каждая первая строка в каждой группе должностей будет содержать суммарную заработную плату сотрудников, работающих на этой должности:

NameJobSalary
MarenghiMgr17506.8
SandersMgr18357.5
Z-TOTALMgr35864.3
DoctorSales12322.4
FactorSales16228.7
PernalSales18171.2
Z-TOTALSales46722.3

Написать запросы с использованием UNION самостоятельно, а затем посмотреть решение

Пример 2. Данные — те же, что в примере 1, но задача немного посложнее. Требуется вывести в одной таблице не только индивидуальные размеры заработной платы, упорядоченные по должностям и суммарную заработную плату по должностям, но суммарную заработную плату по всем сотрудникам.

Правильное решение.

Пример 3. В базе данных фирмы есть таблица Staff, содержащая данные о сотрудниках фирмы. В ней есть столбцы Name (фамилия), Dept (номер отдела), и Years (длительность трудового стажа).

NameDeptYears
Sanders207
Pernal208
Marenghi385
Doctor205
Factor388

Вывести в одной таблице средний трудовой стаж по отделам и индивидуальные значения длительности трудового стажа сотрудников, сгруппированных по номерам отделов.

Правильное решение.

Пример 4. В базе данных фирмы есть таблица Staff, содержащая данные о сотрудниках фирмы. В ней есть столбцы Salary (размер заработной платы), Job (должность) и Years (длительность трудового стажа). Первый запрос нужен для получения данных о сотрудниках, заработная плата которых более 21000:

SELECT ID, Name FROM STAFF WHERE SALARY > 21000

Результатом выполнения запроса будет следующая таблица:

IDName
140Fraye
160Molinare
260Jones

Второй запрос возвращает имена сотрудников, должность которых «менеждер», а число лет трудового стажа — менее 8:

SELECT ID, Name FROM STAFF WHERE Job = ‘Mgr’ AND Years ORDER BY ID

Результатом выполнения запроса будет следующая таблица:

IDName
10Sanders
30Marenghi
100Plotz
140Fraye
160Molinare
240Daniels

Теперь требуются данные, в которых объединены критерии отбора, применённые в двух запросах. Объединяем запросы при помощи оператора UNION:

SELECT ID, Name FROM STAFF WHERE SALARY > 21000 UNION SELECT ID, Name FROM STAFF WHERE Job = ‘Mgr’ AND Years ORDER BY ID

Результатом выполнения запроса с оператором UNION будет следующая таблица:

IDName
10Sanders
30Marenghi
100Plotz
140Fraye
160Molinare
240Daniels
260Jones

Запрос с оператором UNION может возвращать и большее количество столбцов, важно, повторимся, чтобы в объединяемых запросах число столбцов, порядок их следования и типы данных совпадали.

Теперь работаем с базой данных «Портал объявлений — 1». Скрипт для создания этой базы данных, её таблицы и заполения таблицы данных — в файле по этой ссылке

Пример 5. Есть база данных портала объявлений.

Пусть сначала требуется получить данные о категориях и частях категорий объявлений, в которых подано более 100 объявлений в неделю. Пишем следующий запрос:

SELECT Category, Part, Units, Money FROM ADS WHERE Units > 100

Результатом выполнения запроса будет следующая таблица:

CategoryPartUnitsMoney
ТранспортАвтомашины11017600
ТранспортМотоциклы13120960
ЭлектротехникаТелевизоры1278255
ЭлектротехникаХолодильники1378905
СтройматериалыРегипс11211760
ДосугМузыка1177605

Теперь требуется извлечь данные о категориях и частях категорий объявлений, за которые выручено более 10000 денежных единиц в неделю. Пишем следующий запрос:

SELECT Category, Part, Units, Money FROM ADS WHERE Money > 10000

Результатом выполнения запроса будет следующая таблица:

CategoryPartUnitsMoney
ТранспортАвтомашины11017600
НедвижимостьКвартиры8918690
НедвижимостьДачи5711970
ТранспортМотоциклы13120960
СтройматериалыРегипс11211760

Теперь требуется извлечь данные, которые соответствуют критериям и первого, и второго запросов. Объединяем запросы при помощи оператора UNION:

SELECT Category, Part, Units, Money FROM ADS WHERE Units > 100 UNION SELECT Category, Part, Units, Money FROM ADS WHERE Money > 10000

Результатом выполнения запроса будет следующая таблица:

ТранспортАвтомашины11017600
ТранспортМотоциклы13120960
НедвижимостьКвартиры8918690
НедвижимостьДачи5711970
ЭлектротехникаТелевизоры1278255
ЭлектротехникаХолодильники1378905
СтройматериалыРегипс11211760
ДосугМузыка1177605

Примеры запросов к базе данных «Портал объявлений-1» есть также в уроках об операторах INSERT, UPDATE, DELETE, HAVING.

До сих пор мы рассматривали запросы с оператором UNION, в которых объединялись результаты из одной таблицы. Теперь будем объединять результаты из двух таблиц.

Пример 6. Есть база данных склада строительных материалов. В ней есть таблицы, содержащая данные об обоях. Таблица Vinil содержит данные о виниловых обоях, таблица Paper — о бумажных обоях. Требуется узнать данные о ценах обоев из одной и другой таблицы.

Чтобы извлечь не повторяющиеся данные о ценах на виниловые обои, составим запрос со словом DISTINCT:

SELECT DISTINCT Price FROM VINIL

Результатом выполнения запроса будет следующая таблица:

Price
400
500
530
610
720
800
850

Чтобы извлечь не повторяющиеся данные о ценах на бумажные обои, составим следующий запрос, также со словом DISTINCT:

SELECT DISTINCT Price FROM PAPER

Результатом выполнения запроса будет следующая таблица:

Price
300
320
360
400
430
500
530

Теперь составим объединённый запрос с оператором UNION:

SELECT DISTINCT Price FROM VINIL UNION SELECT DISTINCT Price FROM PAPER

Так как мы не используем слово ALL, дубликаты значений 400, 500 и 530 выводиться не будут. Результатом выполнения запроса будет следующая таблица:

Price
300
320
360
400
430
500
530
610
720
800
850

Пример 7. База данных и таблицы — те же, что и в предыдущем примере.

Требуется получить все данные о ценах, в том числе повторяющиеся. Запрос на объединение результатов с использованием оператора UNION будет аналогичен запросу в предыдущем примере, но вместо просто UNION пишем UNION ALL:

SELECT DISTINCT Price FROM VINIL UNION ALL SELECT DISTINCT Price FROM PAPER

Результатом выполнения запроса будет следующая таблица:

Price
300
320
360
400
400
430
500
500
530
530
610
720
800
850

При помощи оператора SQL UNION можно объединить как простые запросы, так и запросы, содержащие подзапросы (вложенные запросы). Рассмотрим соответствующий пример.

Пример 8. Есть база данных «Театр». В её таблице Play содержатся данные о постановках (названия — в столбце Name), в таблице Director — даные о режиссёрах (в столбце Fname — имя, в столбце Lname — фамилия). Первичный ключ таблицы Director — dir_id — идентификационный номер режиссёра. Dir_id также — внешний ключ таблицы Play, он ссылается на первичный ключ таблицы Director. Требуется вывести спектакли режиссеров John Barton и Trevor Nunn.

Решение. Объединим результаты двух запросов — один возвращает спектакли режиссёра John Barton, другой — режиссёра Trevor Nunn. А каждый из этих объединяемых запросов к таблице Play делаем с подзапросом к таблице Director, который возвращает dir_id по имени и фамилии режиссёра. Каждый внешний запрос принимает из вложенного запроса значение ключа dir_id и возвращает названия постановок (Name):

SELECT NAME FROM PLAY WHERE dir_id = (SELECT dir_id FROM DIRECTOR WHERE fname = ‘John’ AND lname = ‘Barton’) UNION SELECT NAME FROM PLAY WHERE dir_id = (SELECT dir_id FROM DIRECTOR WHERE fname = ‘Trevor’ AND lname = ‘Nunn’)

Поделиться с друзьями

Реляционные базы данных и язык SQL

UNION ОПЕРАТОР — Oracle PL/SQL •MySQL •MariaDB •SQL Server •SQLite

В этом учебном материале вы узнаете, как использовать Oracle оператор UNION с синтаксисом и примерами.

Описание

Oracle оператор UNION используется для объединения наборов результатов из 2-х или более Oracle запросов SELECT. Он удаляет повторяющиеся строки между различными запросами SELECT.

Каждый запрос SELECT внутри оператора UNION должен иметь одинаковое количество полей в результирующих наборах с одинаковыми типами данных.

Синтаксис

Синтаксис оператора UNION в Oracle/PLSQL:

SELECT expression1, expression2, … expression_n
FROM tables
[WHERE conditions]
UNION
SELECT expression1, expression2, … expression_n
FROM tables
[WHERE conditions];

Параметры или аргументы

expression1, expression2, expression_n — Столбцы или расчеты, которые вы хотите получить.
tables — Таблицы из которых вы хотите получить записи.
WHERE conditions — Необязательный. Условия, которые должны быть выполнены для выбранных записей.

Примечание

  • В обоих запросах SELECT должно быть одинаковое количество выражений.

Пример с одним полем

Следующий пример Oracle оператора UNION, возвращает одно поле из двух запросов SELECT (и оба поля имеют один и тот же тип данных):

SELECT supplier_id FROM suppliers UNION SELECT supplier_id FROM order_details;

SELECT supplier_id

FROM suppliers

UNION

SELECT supplier_id

FROM order_details;

В этом примере оператора UNION, если supplier_id присутствует в обоих таблицах suppliers и order_details, то supplier_id появляется один в наборе результатов. Оператор Oracle UNION удаляет дубликаты. Если вы не хотите, чтобы дубликаты были удалены, попробуйте использовать Oracle оператора UNION ALL.

Пример использования ORDER BY

Oracle оператор UNION может использовать оператор ORDER BY, чтобы упорядочить результаты запроса.

Например:

SELECT supplier_id, supplier_name FROM suppliers WHERE supplier_id <= 500 UNION SELECT company_id, company_name FROM companies WHERE company_name = ‘Apple’ ORDER BY 2;

SELECT supplier_id, supplier_name

FROM suppliers

WHERE supplier_id <= 500

UNION

SELECT company_id, company_name

FROM companies

WHERE company_name = ‘Apple’

ORDER BY 2;

В этом примере UNION, так как имена столбцов в двух запросах SELECT отличаются, то в ORDER BY выгоднее ссылаться на положение столбцов в результирующем наборе. В этом примере, мы отсортировали результаты по supplier_name / company_name в порядке возрастания, как это обозначено в ORDER BY 2.

Поля supplier_name / company_name находятся в позиции # 2 в результирующем наборе.

Часто задаваемые вопросы

Вопрос: Мне нужно сравнить две даты и вернуть количество строк поля, основанного на значении дат. Например, у меня есть в таблице поле даты, которое называется дата последнего обновления. Я должен проверить, если TRUNC (last_updated_date)> = TRUNC (Sysdate-13).

Ответ: Поскольку вы используете функцию COUNT, которая является агрегатной функцией, то мы рекомендуем использовать Oracle оператор UNION. Например, вы можете попробовать следующее:

SELECT a.code AS Code, a.name AS Name, COUNT(b.Ncode) FROM cdmaster a, nmmaster b WHERE a.code = b.code AND a.status = 1 AND b.status = 1 AND b.Ncode <> ‘a10’ AND TRUNC(last_updated_date) <= TRUNC(sysdate-13) GROUP BY a.code, a.name UNION SELECT a.code AS Code, a.name AS Name, COUNT(b.Ncode) FROM cdmaster a, nmmaster b WHERE a.code = b.code AND a.status = 1 AND b.status = 1 AND b.Ncode <> ‘a10’ AND TRUNC(last_updated_date) > TRUNC(sysdate-13) GROUP BY a.code, a.name;

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

SELECT a.code AS Code, a.name AS Name, COUNT(b.Ncode)

FROM cdmaster a, nmmaster b

WHERE a.code = b.code

AND a.status = 1

AND b.status = 1

AND b.Ncode <> ‘a10’

AND TRUNC(last_updated_date) <= TRUNC(sysdate-13)

GROUP BY a.code, a.name

UNION

SELECT a.code AS Code, a.name AS Name, COUNT(b.Ncode)

FROM cdmaster a, nmmaster b

WHERE a.code = b.code

AND a.status = 1

AND b.status = 1

AND b.Ncode <> ‘a10’

AND TRUNC(last_updated_date) > TRUNC(sysdate-13)

GROUP BY a.code, a.name;

Oracle оператор UNION позволит выполнить подсчет на основе одного набора критериев.

TRUNC(last_updated_date)

А также выполнить подсчет на основе другого набора критериев.

TRUNC(last_updated_date) > TRUNC(sysdate-13)

Рубрика: Программирование Oracle / PLSQL | Permalink

UNION ALL ОПЕРАТОР — Oracle PL/SQL •MySQL •MariaDB •SQL Server •SQLite

В этом учебном материале вы узнаете, как использовать Oracle оператор UNION ALL с синтаксисом и примерами.

Описание

Oracle оператор UNION ALL используется для объединения наборов результатов 2-х или более SELECT запросов. Он возвращает все строки из запроса и не удаляет повторяющиеся строки между различными запросами SELECT.

Каждый SELECT запрос в Oracle операторе UNION ALL должен иметь одинаковое количество полей в результирующем наборе с аналогичными типами данных.

Синтаксис

Синтаксис оператора UNION ALL в Oracle/PLSQL:

SELECT expression1, expression2, … expression_n
FROM tables
[WHERE conditions]
UNION ALL
SELECT expression1, expression2, … expression_n
FROM tables
[WHERE conditions];

Параметры или аргументы

expression1, expression2, … expression_n

Столбцы или расчеты, которые вы хотите получить.

tables

Таблицы, из которых вы хотите получить записи.

WHERE conditions

Необязательный. Условия, которые должны быть выполнены для выбранных записей.

Примечание

В обоих запросах SELECT должно быть одинаковое количество столбцов.

Пример выборки одного поля

Ниже приведен пример Oracle оператора UNION ALL, который возвращает одно поле из множества SELECT (и оба поля имеют один и тот же тип данных):

SELECT supplier_id FROM suppliers UNION ALL SELECT supplier_id FROM orders;

SELECT supplier_id

FROM suppliers

UNION ALL

SELECT supplier_id

FROM orders;

Этот пример Oracle оператора UNION ALL вернет множество записей supplier_id в результирующем наборе, т.к. supplier_id находится в обоих таблицах suppliers и orders. Oracle оператор UNION ALL не удалит дубликаты. Если вы хотите, чтобы дубликаты были удалены, попробуйте использовать оператор Oracle UNION.

Пример использования ORDER BY

Oracle оператор UNION ALL может использовать ORDER BY, чтобы упорядочить результаты запроса.

Например:

SELECT supplier_id, supplier_name FROM suppliers WHERE state = ‘California’ UNION ALL SELECT company_id, company_name FROM companies WHERE company_id > 1000 ORDER BY 2;

SELECT supplier_id, supplier_name

FROM suppliers

WHERE state = ‘California’

UNION ALL

SELECT company_id, company_name

FROM companies

WHERE company_id > 1000

ORDER BY 2;

В этом Oracle операторе UNION ALL, так как имена столбцов в двух запросах SELECT отличаются, то в операторе ORDER BY выгоднее ссылаться на положение столбцов в результирующем наборе. В этом примере, мы отсортировали результаты по supplier_name / company_name в порядке возрастания, как это обозначено в ORDER BY 2.

Поля supplier_name / company_name находятся в позиции # 2 в результирующем наборе.

SQL Server UNION: The Ultimate Guide

Резюме : в этом руководстве вы узнаете, как использовать SQL Server UNION для объединения результатов двух или более запросов в единый набор результатов.

Введение в SQL Server UNION

SQL Server UNION — одна из операций над наборами, которая позволяет объединить результаты двух операторов SELECT в единый набор результатов, который включает все строки, принадлежащие к SELECT заявлений в союзе.

Ниже показан синтаксис SQL Server UNION :

 

query_1 СОЮЗ query_2

Для запросов в синтаксисе выше приведены следующие требования:

  • Число и порядок столбцов должны быть одинаковыми в обоих запросах.
  • Типы данных соответствующих столбцов должны быть одинаковыми или совместимыми.

На следующей диаграмме Венна показано, как набор результатов таблицы T1 объединяется с набором результатов таблицы T2:

UNION vs. UNION ALL

По умолчанию оператор UNION удаляет все повторяющиеся строки из наборов результатов. Однако, если вы хотите сохранить повторяющиеся строки, вам необходимо явно указать ключевое слово ALL , как показано ниже:

 

query_1 СОЮЗ ВСЕ query_2

Другими словами, оператор UNION удаляет повторяющиеся строки, а оператор UNION ALL включает повторяющиеся строки в окончательный набор результатов.

UNION против JOIN

Объединение, такое как INNER JOIN или LEFT JOIN , объединяет столбцов из двух таблиц, а UNION объединяет строк из двух запросов.

Другими словами, объединение добавляет наборы результатов по горизонтали, а объединение — по вертикали.

На следующем рисунке показано основное различие между UNION и JOIN :

SQL Server UNION примеры

См. Следующие staff и клиентов таблиц из образца базы данных:

UNION и UNION ALL примеров

В следующем примере имена сотрудников и клиентов объединены в единый список:

 

SELECT Имя, фамилия ОТ продажи.штабы СОЮЗ ВЫБРАТЬ Имя, фамилия ОТ sales.customers;

Возвращает 1454 строки.

Таблица staffs имеет 10 строк, а таблица клиентов — 1445 строк, как показано в следующих запросах:

 

SELECT COUNT (*) ОТ sales.staffs; - 10 ВЫБРАТЬ COUNT (*) ОТ sales.customers; - 1454

Поскольку набор результатов объединения возвращает только 1 454 строки, это означает, что одна повторяющаяся строка была удалена.

Чтобы включить повторяющуюся строку, используйте UNION ALL , как показано в следующем запросе:

 

SELECT Имя, фамилия ОТ sales.staffs СОЮЗ ВСЕ ВЫБРАТЬ Имя, фамилия ОТ sales.customers;

Запрос возвращает 1455 строк, как и ожидалось.

UNION и Пример ORDER BY

Чтобы отсортировать набор результатов, возвращаемый оператором UNION , поместите предложение ORDER BY в последний запрос следующим образом:

 

SELECT select_list ОТ Таблица 1 СОЮЗ ВЫБРАТЬ select_list ОТ Таблица 2 СОРТИРОВАТЬ ПО список заказа;

Например, чтобы отсортировать имена и фамилии клиентов и сотрудников, вы используете следующий запрос:

 

SELECT Имя, фамилия ОТ продажи.штабы СОЮЗ ВСЕ ВЫБРАТЬ Имя, фамилия ОТ sales.customers СОРТИРОВАТЬ ПО Имя, фамилия;

В этом руководстве вы узнали, как использовать SQL Server UNION для объединения строк из нескольких запросов в единый набор результатов.

.

SQL UNION: обзор, использование и примеры

В этой статье мы подробно расскажем об операторе SQL Union, описываем его многочисленные варианты использования с примерами и исследуем некоторые общие вопросы, такие как различия между Union и Union All.

Для удовлетворения реальных требований к данным нам может потребоваться объединить наборы результатов из нескольких источников данных, чтобы мы могли проводить анализ данных или создавать новые наборы данных. Наборы данных могут быть идентичными, но есть вероятность, что они ссылаются на разные таблицы.Есть ли способ объединить данные в один запрос? Являются ли операторы набора жизнеспособным вариантом? Давайте начнем и посмотрим, как можно использовать некоторых из существующих операторов, чтобы помочь нам решить эти общие проблемы.

В этой статье мы рассмотрим:

  1. Что такое оператор Set
  2. Union vs Union All и как они работают
  3. Обсудите правила использования Union vs Union All
  4. Синтаксис оператора SQL
  5. Как использовать простое предложение SQL Union в инструкции select
  6. Как использовать SQL Union с запросами, содержащими предложение WHERE
  7. Как использовать предложение SELECT INTO с Union
  8. Как использовать SQL Union с запросами, имеющими предложение WHERE и предложение order by
  9. Как использовать SQL Union и SQL Pivot
  10. Как использовать SQL Union с предложениями GROUP и HAVING

Операторы

Оператор — это символ, или ключевое слово определяет действие, которое выполняется над одним или несколькими выражениями в инструкции Select.

Оператор набора

Давайте подробно рассмотрим Set Operators в SQL Server и их использование.

В SQL Server есть четыре основных оператора множества:

  1. Союз
  2. Союз Все
  3. КРОМЕ
  4. ПЕРЕСЕЧЕНИЕ

Союз

Оператор Union объединяет результаты двух или более запросов в отдельный набор результатов, который включает все строки, принадлежащие всем запросам в Union.В этой операции он объединяет еще два запроса и удаляет дубликаты.

Например, в таблице «A» есть 1,2 и 3, а в таблице «B» — 3,4,5.

SQL-эквивалент приведенных выше данных приведен ниже.

(

ВЫБОР 1 ID

СОЕДИНЕНИЕ

ВЫБОР 2

СОЕДИНЕНИЕ

ВЫБОР 3

)

СОЕДИНЕНИЕ

(

ВЫБОР 3

000 ВЫБОР

СОЕДИНЕНИЕ

СОЕДИНЕНИЕ

);

На выходе вы можете увидеть отдельный список записей из двух наборов результатов.

Союз Все

Глядя на Union vs Union All, мы обнаруживаем, что они очень похожи, но у них есть некоторые важные отличия с точки зрения результатов.

Оператор Union объединяет результаты двух или более запросов в единый набор результатов, который включает все строки, принадлежащие всем запросам в Union. Проще говоря, он объединяет два или более набора строк и сохраняет дубликаты.

Например, в таблице «A» есть 1,2 и 3, а в таблице «B» — 3,4,5.

SQL-эквивалент приведенных выше данных приведен ниже.

(

ВЫБОР 1 ID

СОЕДИНЕНИЕ

ВЫБОР 2

СОЕДИНЕНИЕ

ВЫБОР 3

)

СОЕДИНЕНИЕ ВСЕ

(

ВЫБОР 3

ВЫБОР

СОЕДИНЕНИЕ

);

На выходе вы можете увидеть все строки, которые также содержат повторяющиеся записи.

ПЕРЕСЕЧЕНИЕ

Оператор интереса сохраняет строки, общие для всех запросов.

Для того же набора данных из вышеупомянутого примера выходные данные оператора пересечения приведены ниже.

Представление приведенных выше таблиц в SQL

(

ВЫБОР 1 ID

СОЕДИНЕНИЕ

ВЫБОР 2

СОЕДИНЕНИЕ

ВЫБОР 3

)

ПРОМЕЖУТОК

(

ВЫБОР 3

ВЫБОР

СОЕДИНЕНИЕ

СОЕДИНЕНИЕ

);

Строка «3» является общей для двух наборов результатов.

ИСКЛЮЧАЯ

Оператор EXCEPT перечисляет строки в первом, которых нет во втором.

Для того же набора данных из вышеупомянутого примера выходные данные оператора Except приведены ниже.

SQL-представление приведенных выше таблиц с оператором EXCEPT приведено ниже.

(

SELECT 1 [Необычный только из A]

UNION

SELECT 2

UNION

SELECT 3

)

EXCEPT

(

000 SELECT 3 B

000 SELECT 3 B

СОЮЗ

ВЫБРАТЬ 5

);

Перечислите необычные строки из первого набора.

Примечание: очень легко визуализировать оператор множества, используя диаграмму Венна, где каждая из таблиц представлена ​​пересекающимися формами. Пересечения фигур, где таблицы перекрываются, — это строки, в которых выполняется условие.

Синтаксис:

Синтаксис операторов Union vs Union All в SQL выглядит следующим образом:

ВЫБЕРИТЕ Column1, Column2,… ColumnN
ИЗ <таблица>
[ГДЕ условия]
[ГРУППИРОВКА ПО столбцам]
[ИМЕТЬ условие (я)]
СОЮЗ
ВЫБЕРИТЕ Column1, Column2,… ColumnN
Со стола
[ГДЕ условие (я)];
ORDER BY Column1, Column2…

Правил:

Есть несколько правил, которые применяются ко всем операторам множества:

  1. Выражения в каждой строке или количество столбцов, определенных в каждом запросе, должны иметь одинаковый порядок.
  2. Последующие наборы строк операторов SQL должны соответствовать типу данных первого запроса.
  3. Круглые скобки позволяют создавать другие операторы множества в том же операторе
  4. Предложение ORDER BY возможно, но это должно быть последнее предложение SQL.
  5. Предложения GROUP BY и HAVING могут применяться к индивидуальному запросу.

Примечание:

  1. Все эти операторы Set удаляют дубликаты, кроме оператора Union All.
  2. Имена выходных столбцов ссылаются на первый запрос i.е. когда мы запускаем операторы SELECT с любым из операторов Set, и набор результатов каждого из запросов может иметь разные имена столбцов, поэтому результат оператора SELECT ссылается на имена столбцов из первого запроса в операции.
  3. SQL JOIN чаще используется для объединения столбцов из нескольких связанных таблиц, тогда как операторы SET объединяют строки из нескольких таблиц.
  4. Если типы выражений одинаковы, но отличаются точностью, масштабом или длиной, результат определяется на основе тех же правил комбинирования выражений.

Примеры:

Следующие запросы T-SQL подготавливаются и выполняются в базе данных Adventureworks2014.Вы можете скачать образец базы данных AdventireWorks2014 здесь

  1. Как использовать простое предложение SQL Union в операторе select

    В этом примере набор результатов включает отдельный набор строк из первого набора и второго набора. Следующий пример основан на правиле 1, 3 и 5.

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    140002

    14

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    SELECT *

    ИЗ

    (

    (

    SELECT 1 A

    UNION

    SELECT 2

    UNION

    SELECT 3

    )

    000 UNION

    UNION

    (UNION

    SELECT 4

    UNION

    SELECT 5

    )

    UNION ALL

    (

    SELECT 8 c

    UNION

    SELECT 9

    UNION

    000 SELECT 1

    )

    )

    Результатом является комбинация операторов Union и Union All, заключенных в круглые скобки.

    .

  2. Как использовать SQL Union с запросами, содержащими предложение WHERE

    В следующем примере показано использование Union в двух операторах SELECT с предложением WHERE и ORDER BY.

    Следующий пример основан на правиле 1,2 и 3.

    ВЫБРАТЬ P1.ProductModelID,

    P1.Name

    FROM Production.ProductModel P1

    ГДЕ ProductModelID IN (3, 4)

    UNION

    SELECT P2.ProductModelID,

    P2000 P2000P2000

    P2. .ProductModelID В (3, 4)

    ЗАКАЗАТЬ ПО P1.Name;

  3. Как использовать предложение SELECT INTO с SQL Union

    В следующем примере создается новый файл dbo.фиктивная таблица с использованием предложения INTO в первом операторе SELECT, который содержит окончательный набор результатов объединения столбцов ProductModel и name из двух разных наборов результатов. В этом случае он получен из одной и той же таблицы, но в реальной ситуации это также могут быть две разные таблицы. Следующий пример основан на правилах 1, 2 и 4.

    УДАЛИТЬ ТАБЛИЦУ, ЕСЛИ СУЩЕСТВУЕТ dbo.манекен;

    SELECT P1.ProductModelID,

    P1.Name

    INTO dummy

    FROM Production.ProductModel P1

    ГДЕ ProductModelID IN (3, 4)

    UNION

    0002

    9ModelID

    SELECT Podelame. ОТ Production.ProductModel P2

    ГДЕ P2.ProductModelID IN (3, 4)

    ORDER BY P1.Name;

    GO

    SELECT *

    FROM dbo.Dummy;

  4. Как использовать SQL Union с запросами, содержащими предложения WHERE и ORDER BY

    Это возможно только тогда, когда мы используем TOP или агрегатные функции в каждом операторе select оператора Union.В этом случае из каждого набора результатов перечисляются 10 верхних строк, которые объединяются с помощью предложения Union для получения окончательного результата. Вы также видите, что предложение order by помещено во все инструкции select.

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    140002

    14

    18

    19

    20

    21

    ВЫБРАТЬ a.ModelID,

    a.Name

    FROM

    (

    SELECT TOP 10 ProductModelID ModelID,

    Name

    FROM Production.ProductModel

    Имя, ГДЕ ProductModelID НЕ В (3, 4)

    DES BY)

    DES BY a

    UNION

    SELECT b.ProductModelID,

    b.Name

    FROM

    (

    SELECT TOP 10 ProductModelID,

    Name

    FROM Production.ProductModel

    ГДЕ ProductModelID IN (5, 6)

    ORDER BY Name DESC

    ) b;

  5. Как использовать SQL Union и SQL Pivot

    В следующем примере мы пытаемся объединить более одного набора результатов. В реальной ситуации у вас могут быть финансовые показатели из разных регионов или отделов, а таблицы могут иметь одни и те же столбцы и типы данных, но вы хотите поместить их в один набор строк и в один отчет.В таком сценарии вы должны использовать предложение Union, и очень легко объединить результаты и преобразовать данные в более содержательный отчет.

    В этом примере ProductModel подразделяется на Top10, Top100, Top 100 и преобразует строки как агрегированный набор значений в соответствующие столбцы. Следующий пример основан на правиле 2.

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    140002

    14

    18

    19

    20

    21

    22

    23

    24

    SELECT MAX (Top10) Top10,

    MAX (Top100) Top100,

    MAX (Top1000) Top100

    FROM

    (

    SELECT COUNT (*) Top10,

    0 Top100,

    0 Top1000

    ОТ ПРОИЗВОДСТВА.ProductModel

    ГДЕ ProductModelID <10

    UNION

    SELECT 0,

    COUNT (*),

    0

    FROM Production.ProductModel

    WHERE ProductModelID> 11

    И

    ,

    0,

    COUNT (*)

    FROM Production.ProductModel

    ГДЕ ProductModelID> 101

    ) T;

    Значения NULL очень важны для операторов Set и рассматриваются как второсортные граждане базы данных.Поскольку значения NULL считаются уникальными и если две строки имеют значение NULL в одном столбце, то они будут считаться идентичными, поэтому в этом случае вы фактически сравниваете NULL с NULL и получаете равенство. В следующем примере вы видите использование значений NULL. В этом случае он работает с агрегатной функцией, max .

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    140002

    14

    18

    19

    20

    21

    22

    23

    24

    SELECT MAX (Top10) Top10,

    MAX (Top100) Top100,

    MAX (Top1000) Top100

    FROM

    (

    SELECT COUNT (*) Top10,

    NULL Top100,

    NULL Top1000

    ОТ ПРОИЗВОДСТВА.ProductModel

    ГДЕ ProductModelID <10

    UNION

    SELECT NULL,

    COUNT (*),

    NULL

    FROM Production.ProductModel

    WHERE ProductModelID> 11

    0003000

    0002 ,

    NULL,

    COUNT (*)

    FROM Production.ProductModel

    WHERE ProductModelID> 101

    ) T;

Как использовать SQL Union с предложениями Group и Have

В следующих примерах оператор Union используется для объединения результатов таблицы, у которых есть условное предложение, определенное с помощью предложения Group by и Have .

Фамилия анализируется путем указания условий в предложении have.

Следующий пример основан на правиле 5.

SELECT pp.lastname,

COUNT (*) повторяется дважды,

0 Repeatedthrice

FROM Person.Person AS pp

JOIN HumanResources.Employee AS e ON e.BusinessEntityID = pp.BusinessEntityID pp.

фамилия

HAVING COUNT (*) = 2

UNION

SELECT pp.LastName,

0,

COUNT (*) NtoZRange

FROM Person.Person AS pp

e JOIN HumanResources.Employ. BusinessEntityID = pp.BusinessEntityID

ГРУППА ПО pp.LastName

HAVING COUNT (*)> 2;

Мы видим, что фамилии выводятся в два разных столбца с помощью оператора Union

На этом пока все …

Сводка

До сих пор мы рассмотрели различные доступные параметры и правила, чтобы использовать операторы Set и понять, когда их использовать.При определении того, следует ли использовать Union или Union All, следует учитывать несколько моментов. Используйте Union All, если вы знаете, что наборы результатов из нескольких запросов не пересекаются и не генерируют дубликаты, и помните, что если вам нужно использовать круглые скобки, вы можете это сделать. Вы также можете поворачивать и преобразовывать вывод.

Просто убедитесь, что ваши типы данных совпадают, и если вам нужно выполнить ORDER BY, сделайте это в конце, после того, как вы выполните все эти заданные запросы. По своей природе, когда дело доходит до Union vs Union All, Union All быстрее, чем Union; поскольку операторы Union несут дополнительные накладные расходы на устранение дубликатов.

Надеюсь, вам понравилась эта статья об операторе SQL Union. Не стесняйтесь задавать любые вопросы в комментариях ниже.


Я технолог по базам данных, имеющий более 11 лет богатого практического опыта работы с технологиями баз данных. Я являюсь сертифицированным специалистом Microsoft и имею степень магистра компьютерных приложений.

Моя специальность заключается в разработке и внедрении решений высокой доступности и кроссплатформенной миграции БД.В настоящее время разрабатываются технологии SQL Server, PowerShell, Oracle и MongoDB.

Посмотреть все сообщения от Prashanth Jayaram

Последние сообщения от Prashanth Jayaram (посмотреть все) .

Sql Server union с условием If

Переполнение стека
  1. Около
  2. Продукты
  3. Для команд
  1. Переполнение стека Общественные вопросы и ответы
  2. Переполнение стека для команд Где разработчики и технологи делятся частными знаниями с коллегами
  3. Вакансии Программирование и связанные с ним технические возможности карьерного роста
  4. Талант Нанимайте технических специалистов и создавайте свой бренд работодателя
  5. Реклама Обратитесь к разработчикам и технологам со всего мира
  6. О компании

Загрузка…

.

SQL Server: каков предел количества UNION?

Переполнение стека
  1. Около
  2. Продукты
  3. Для команд
  1. Переполнение стека Общественные вопросы и ответы
  2. Переполнение стека для команд Где разработчики и технологи делятся частными знаниями с коллегами
  3. Вакансии Программирование и связанные с ним технические возможности карьерного роста
  4. Талант Нанимайте технических специалистов и создавайте свой бренд работодателя
  5. Реклама Обратитесь к разработчикам и технологам со всего мира
  6. О компании

Загрузка…

.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *