Sql ms sql union: UNION (Transact-SQL) — SQL Server
Содержание
Оператор SQL: UNION. — it-black.ru
Оператор SQL: UNION. — it-black.ru
Оператор UNION используется для объединения двух и более запросов оператора SELECT. Синтаксис оператора:
SELECT column_name(s) FROM table1 UNION SELECT column_name(s) FROM table2;
Каждый из операторов SQL SELECT должен иметь в своем запросе одинаковое количество столбцов и типы возвращаемых данных, иначе произойдет ошибка при формировании результирующей таблицы. Примеры оператора. Имеется следующая таблица Artists:
Singer | Album | Year | Sale |
The Prodigy | Invaders Must Die | 2008 | 1200000 |
Drowning Pool | Sinner | 2001 | 400000 |
Massive Attack | Mezzanine | 1998 | 2300000 |
The Prodigy | Fat of the Land | 1997 | 600000 |
The Prodigy | Music For The Jilted Generation | 1994 | 1500000 |
Massive Attack | 100th Window | 2003 | 1200000 |
Drowning Pool | Full Circle | 2007 | 800000 |
Massive Attack | Danny The Dog | 2004 | 1900000 |
Drowning Pool | Resilience | 2013 | 500000 |
С помощью оператора UNION выведим название исполнителя и альбома:
SELECT Singer FROM Artists UNION SELECT Album FROM Artists;
Результат будет такой:
Singer | Album |
The Prodigy | Invaders Must Die |
Drowning Pool | Sinner |
Massive Attack | Mezzanine |
The Prodigy | Fat of the Land |
The Prodigy | Music For The Jilted Generation |
Massive Attack | 100th Window |
Drowning Pool | Full Circle |
Massive Attack | Danny The Dog |
Drowning Pool | Resilience |
Поделиться в facebook
Поделиться в twitter
Поделиться в vk
VK
Поделиться в google
Google+
Группа в VK
Помощь проекту
Обнаружили опечатку?
Сообщите нам об этом, выделите текст с ошибкой и нажмите Ctrl+Enter, будем очень признательны!
Свежие статьи
Облако меток
Vk
Youtube
Telegram
Odnoklassniki
Полезно знать
Рубрики
Авторы
© it-black.
ru | 2016 — 2022
SQL Server UNION: Полное руководство
Резюме : в этом руководстве вы узнаете, как использовать SQL Server UNION
для объединения результатов двух или более запросов в один набор результатов.
Введение в SQL Server
Оператор UNION
SQL Server UNION
— это одна из операций над множествами, позволяющая объединить результаты двух операторов SELECT
в один результирующий набор, включающий все строки, принадлежащие SELECT
операторов в объединении.
Ниже показан синтаксис SQL Server UNION
:
Язык кода: SQL (язык структурированных запросов) (sql)
query_1 СОЮЗ запрос_2
Ниже приведены требования для запросов с приведенным выше синтаксисом:
- Количество и порядок столбцов должны быть одинаковыми в обоих запросах.
- Типы данных соответствующих столбцов должны быть одинаковыми или совместимыми.
На следующей диаграмме Венна показано, как результирующий набор таблицы T1 объединяется с результирующим набором таблицы T2:
UNION
и UNION ALL
По умолчанию оператор UNION
удаляет все дубликаты. строки из наборов результатов. Однако, если вы хотите сохранить повторяющиеся строки, вам необходимо явно указать ключевое слово ALL
, как показано ниже:
Язык кода: SQL (язык структурированных запросов) (sql)
query_1 СОЮЗ ВСЕХ запрос_2
Другими словами, оператор UNION
удаляет повторяющиеся строки, а оператор UNION ALL
включает повторяющиеся строки в окончательный результирующий набор.
Union
против Присоединение
Соединение, такое как Внутреннее соединение
или левое соединение
Комбинирует столбцы из двух таблиц, в то время как Union
объединяет строки из двух запросов.
Другими словами, объединение добавляет наборы результатов по горизонтали, а объединение добавляет наборы результатов по вертикали.
Следующая картина иллюстрирует основное различие между Union
и Join
:
SQL Server
Union
Примеры
См. Следующие сотрудников
и Клиенты
из базы образца:
Следующий пример объединяет имена сотрудников и клиентов в один список: Возвращает 1454 строки. В таблице Поскольку результирующий набор объединения возвращает только 1454 строки, это означает, что одна повторяющаяся строка была удалена. Чтобы включить повторяющуюся строку, используйте Запрос возвращает 1455 строк, как и ожидалось. Чтобы отсортировать набор результатов, возвращаемый оператором 90 SELECT и
.
UNION ALL
examples
ВЫБЕРИТЕ
Имя,
фамилия
ИЗ
отдел продаж
СОЮЗ
ВЫБРАТЬ
Имя,
фамилия
ИЗ
продажи. клиенты;
staffs
10 строк, а в таблице клиентов 1445 строк, как показано в следующих запросах:
SELECT
СЧИТАТЬ (*)
ИЗ
отдел продаж;
-- 10
ВЫБРАТЬ
СЧИТАТЬ (*)
ИЗ
продажи.клиенты;
-- 1454
UNION ALL
, как показано в следующем запросе:
SELECT
Имя,
фамилия
ИЗ
отдел продаж
СОЮЗ ВСЕХ
ВЫБРАТЬ
Имя,
фамилия
ИЗ
продажи. клиенты;
UNION
и ORDER BY
пример UNION
, вы помещаете предложение ORDER BY
в последний запрос следующим образом:
select_list
ИЗ
Таблица 1
СОЮЗ
ВЫБРАТЬ
select_list
ИЗ
Таблица 2
СОРТИРОВАТЬ ПО
список заказа;
Язык кода: SQL (язык структурированных запросов) (sql)
Например, чтобы отсортировать имена и фамилии клиентов и сотрудников, используйте следующий запрос:
Язык кода: SQL (язык структурированных запросов) (sql)
SELECT Имя, фамилия ИЗ отдел продаж СОЮЗ ВСЕХ ВЫБРАТЬ Имя, фамилия ИЗ продажи. клиенты СОРТИРОВАТЬ ПО Имя, фамилия;
В этом руководстве вы узнали, как использовать SQL Server UNION
для объединения строк из нескольких запросов в один набор результатов.
Оператор T-SQL UNION: практическое руководство
Что такое оператор UNION? Операция UNION определяется как объединение результатов двух или более запросов в один набор результатов.
Я помню, как клиент изо всех сил пытался привести данные из нескольких таблиц в один набор результатов, используя сложный запрос ИЛИ. Я спросил, есть ли какое-либо совпадение данных в различных таблицах, и он сказал самые совершенные пять слов: «О нет, они взаимоисключающие».
Вам может быть интересно, почему я назвал его ответ "идеальным". Что ж, наличие взаимоисключающих данных означало, что у него не было возможности беспокоиться о дубликатах, и простой UNION ALL с простым и эффективным планом запроса работал.
Однако в некоторых случаях UNION ALL может быть не лучшим вариантом, поэтому очень важно понимать ваши данные и то, как операторы запросов работают под прикрытием, чтобы у вашего запроса был наиболее оптимальный план выполнения. В этом посте я подробно расскажу об операторах множества UNION и UNION ALL, включая варианты использования каждого из них и общие соображения по производительности.
Что такое запрос UNION? Общий пример синтаксиса
Вот простой пример T-SQL UNION:
Существует несколько ограничений на использование UNION:
- Все запросы в UNION должны возвращать одинаковое количество столбцов.
- Столбцы для каждого набора результатов должны иметь совместимые типы данных. Например, объединение столбца int и столбца bigint допустимо, но попытка объединить столбец uniqueidentifier со столбцом decimal приведет к ошибке. Кроме того, порядок, в котором вы определяете столбец в операторе SELECT, имеет значение, поскольку результаты объединяются в обычном порядке.
Запросы в указанном выше операторе UNION представляют собой простые операторы SELECT, демонстрирующие общий синтаксис. Однако запросы, объединяемые вместе, могут быть довольно сложными, включая такие вещи, как подзапросы, агрегаты, предложения GROUP BY и HAVING. ORDER BY — это особый случай предложения UNION.
UNION против Union ALL
При объединении результатов с помощью UNION важно понимать, как следует обрабатывать повторяющиеся значения. UNION удалит любые повторяющиеся значения, возвращаемые при объединении различных наборов результатов. Следующий запрос возвращает уникальный список чисел от 1 до 10. Хотя значения 1 и 7 включены в оба набора результатов, дубликаты отфильтровываются перед возвратом данных, как показано ниже:
Если повторяющиеся строки не беспокоят, или вы знаете, что дубликатов нет, рассмотрите возможность использования T-SQL UNION ALL вместо UNION, так как UNION ALL не пытается отфильтровать повторяющиеся строки. Следующий запрос аналогичен предыдущему запросу UNION, но использует UNION ALL вместо UNION:
Вы можете видеть, что результаты возвращаются в том порядке, в котором они определены в конструкторе строк, и дубликаты не удаляются. Причина, по которой я упомянул здесь порядок, в котором возвращаются строки по сравнению с примером UNION, заключается в том, что UNION должен выполнять сортировку для удаления повторяющихся строк. Наборы результатов из оператора UNION часто упорядочены при возврате, но вы не можете зависеть от этого. Единственный способ гарантировать, что результирующий набор будет упорядочен определенным образом, — это включить предложение ORDER BY как часть инструкции.
Затраты на производительность при сортировке данных с помощью UNION и UNION ALL
Одна из самых больших проблем с производительностью, с которыми я столкнулся при использовании предложения UNION, связана с необходимостью выполнения дорогостоящей операции сортировки. Поэтому, как правило, используйте UNION только в том случае, если вам нужно удалить повторяющиеся значения или используйте UNION ALL.
Когда происходит операция сортировки, делается запрос на некоторую память для выполнения операции, известная как предоставление памяти . Предоставление памяти имеет начальное требование к тому, сколько памяти требуется для начала операции сортировки, и для выполнения операции полностью в памяти требуется дополнительная память. Выполнение сортировки в памяти намного быстрее, чем сброс данных в базу данных tempdb и выполнение операции сортировки там. Однако иногда оценки кардинальности неверны, и SQL Server предполагает, что он может уместить все строки в памяти, но это не так, что приводит к дорогостоящему сбросу сортировки в базу данных tempdb.
Ниже приведено предупреждение, которое вы можете увидеть в плане выполнения операции сортировки, если она должна быть передана в базу данных tempdb:
Использование ORDER BY с операцией UNION часто необходимо заказывать результаты из UNION. Чтобы упорядочить результаты UNION, используйте предложение ORDER BY, расположенное после последнего оператора UNION. Рассмотрим следующий запрос:
Предложение ORDER BY всегда вычисляется последним в операторе SQL. В приведенном выше примере два запроса объединяются, а затем происходит упорядочение. Однако важно понимать имя/псевдоним столбца, на который вы должны ссылаться в предложении ORDER BY.
Псевдонимы столбцов
Имена столбцов, возвращаемые операцией UNION, всегда основаны на наборе результатов первого оператора SELECT, поэтому вы должны определить псевдонимы столбцов в первом операторе SELECT. Вы также должны ссылаться на эти имена столбцов, если используете предложение ORDER BY. Вот пример этого:
В чем разница между UNION и JOIN?
Предложение UNION объединяет результаты двух или более запросов. Данные из запросов не должны быть связаны, если каждый запрос имеет одинаковое количество столбцов, типы данных совместимы
Операция JOIN объединяет строки из разных таблиц, где между этими таблицами существует связь. В зависимости от типа JOIN возвращаемые строки могут быть одинаковыми для соединяемых таблиц (например, INNER JOIN), или одна таблица может быть сохранена. Если в других таблицах есть совпадающие строки, они будут включены (например, OUTER JOIN).
UNION против OR
Одним из практических применений оператора UNION является объединение похожих запросов из одного и того же набора таблиц для формирования нового набора результатов. По своему опыту я видел, как разработчики приложений используют шаблон похожих запросов со сравнением на равенство в предикатах, поскольку его легче писать или генерировать с помощью инструмента, и он кажется более эффективным, чем один единственный запрос, включающий сравнение ИЛИ в предикате. Простым примером этого может быть следующий, с соответствующим планом запроса:
Вы заметите, что в плане таблица SalesOrderDetail упоминается дважды; одно сканирование для поиска значения ProductID 712 и другое сканирование для значения ProductID 870. Чтобы ОБЪЕДИНИТЬ их, SQL Server должен выполнить одну и ту же операцию сканирования дважды. Используя выходные данные SET STATISTICS IO ON, вы можете увидеть 2492 страницы из буферного пула, которые были использованы для возврата результатов: написание предложения OR), поэтому работа по фильтрации значений ProductID происходит за одно сканирование таблицы, как показано ниже:
Как видно из плана выполнения, таблица теперь сканируется только один раз, а количество страниц, считываемых из пула буферов, сокращается вдвое:
Стоит отметить, что существует распространенное заблуждение об использовании оператора OR. в предложении WHERE. Использование ИЛИ не всегда требует сканирования всех данных в таблице, чтобы вернуть искомые строки. Учитываются такие факторы, как мощность столбца, количество искомых значений и столбцы, возвращаемые в списке SELECT. Если бы для столбца ProductID существовал покрывающий некластеризованный индекс (который включал SalesOrderID и UnitPrice), вы могли бы использовать одну операцию поиска вместо сканирования таблицы.
Рекурсивные общие табличные выражения T-SQL
Общее табличное выражение (CTE) — это тип временного именованного набора результатов, который позволяет определить запрос один раз, а затем ссылаться на запрос по имени в последующих операторах того же пакета. CTE включают в себя возможность выполнять рекурсивные запросы, что позволяет запросу ссылаться на себя до тех пор, пока не будет выполнен базовый случай. Структура рекурсивного CTE определяется якорным запросом и рекурсивным запросом. Рекурсивная часть запроса ссылается на имя CTE и будет рекурсивно выполняться до тех пор, пока не будет выполнено его базовое условие.
Важным моментом, который следует здесь усвоить, является то, что рекурсивное CTE требует оператора UNION ALL для объединения результатов запроса привязки и всех последующих рекурсивных запросов в окончательный набор результатов.
CTE отлично подходят для иерархических запросов, таких как организационная структура компании. Вот пример:
UNION ALL в многораздельных представлениях
Хотя функция секционирования SQL Server может быть отличной с точки зрения управляемости данных, иногда полезно разработать собственную стратегию секционирования для таблиц. Создание раздела дает вам больше гибкости для перемещения данных и позволяет индексировать каждую таблицу по мере необходимости. Вы также можете воспользоваться преимуществами статистики для отдельных таблиц (по сравнению с одним объектом статистики для секционированной таблицы в SQL Server).
Рассмотрим следующее определение таблицы:
CREATE TABLE SalesQ12021
Важной концепцией здесь является ограничение столбца SaleDate — эта функция гарантирует, что в таблицу можно вставить только записи за данный квартал 2021 года. Настоящая сила этого дизайна заключается в том, что существует несколько таблиц для определенных диапазонов дат, каждая из которых имеет свои собственные ограничения по дате.
Рассмотрим следующее представление с использованием оператора UNION ALL для создания набора данных, объединяющего данные из этих четырех таблиц вместе:
Обратите внимание, что имеется ссылка только на таблицу SalesQ42021. Поскольку каждая таблица имеет свои ограничения, оптимизатор запросов знает, что для выполнения запроса требуется доступ только к одной таблице.
Рекомендации по использованию UNION и UNION ALL
Операторы запросов UNION и UNION ALL T-SQL полезны для объединения наборов результатов из двух или более запросов SELECT. Эти операторы обеспечивают большую гибкость, но вы должны убедиться, что каждый оператор SELECT возвращает одинаковое количество и совместимость столбцов.
Как и в моем "идеальном" примере, с которого я открыл сообщение, постарайтесь использовать оператор UNION ALL, когда это возможно, так как сортировка данных для возврата отдельного списка для UNION может потребовать больших затрат. Знание ваших данных и параметров оператора может помочь вам разработать наиболее эффективный план выполнения запроса.
Поддержание и повышение производительности запросов также может иметь решающее значение для общего состояния вашей среды SQL Server. С SolarWinds ® SQL Sentry вы можете использовать интегрированную панель мониторинга состояния окружающей среды (EHO) для быстрого просмотра, позволяющего определить приоритет событий устранения неполадок, вызывающих наиболее насущные проблемы с производительностью.
Пол С. Рэндал — генеральный директор SQLskills.com, которым он управляет вместе со своей женой Кимберли Л. Трипп. И Пол, и Кимберли являются широко известными и уважаемыми экспертами в мире SQL Server, и оба являются давними MVP SQL Server. Пол был редактором журнала TechNet Magazine, где он два раза в месяц писал колонку вопросов и ответов по SQL и тематические статьи. Он также провел лучшие семинары и сессии на PASS Summit и TechEd. Пол активно участвует в сообществе SQL Server, от групп пользователей до онлайн-форумов и помощи в Твиттере (@PaulRandal — проверьте тег #sqlhelp).