Из Википедии, бесплатной энциклопедии
  (Перенаправлено из Union (SQL) )
Перейти к навигации Перейти к поиску

Операции над наборами позволяют объединить результаты нескольких запросов в один набор результатов. [1] Set операторы включают в себя UNION, INTERSECTи EXCEPT.

Оператор UNION [ править ]

В SQLUNION раздел объединяет результаты двух запросов SQL в одну таблицу всех согласующих строк . Два запроса должны привести к одинаковому количеству столбцов и совместимых типов данных для объединения. Любые повторяющиеся записи автоматически удаляются, если они UNION ALLне используются.

UNIONможет быть полезен в приложениях хранилища данных, где таблицы не полностью нормализованы . [2] Простым примером может служить база данных, в которой есть таблицы sales2005и sales2006идентичные структуры, но разделенные по соображениям производительности. UNIONЗапрос может объединить результаты из обеих таблиц.

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

Обратите внимание, что это UNION ALLможет быть намного быстрее, чем обычное UNION.

Примеры [ править ]

Учитывая эти две таблицы:

Выполнение этого оператора:

ВЫБРАТЬ  *  ИЗ  sales2005 СОЮЗ ВЫБРАТЬ  *  ИЗ  sales2006 ;

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

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

UNION ALLдает разные результаты, потому что не удаляет дубликаты. Выполнение этого оператора:

ВЫБРАТЬ  *  ИЗ  sales2005 UNION  ВСЕ ВЫБРАТЬ  *  ИЗ  sales2006 ;

даст эти результаты, снова допуская вариацию из-за отсутствия ORDER BYутверждения:

Обсуждение полных внешних объединений также содержит пример использования UNION.

Оператор INTERSECT [ править ]

Оператор SQL INTERSECTпринимает результаты двух запросов и возвращает только строки, которые появляются в обоих наборах результатов. В целях удаления дубликатов INTERSECTоператор не делает различий между ними NULLs. INTERSECTОператор удаляет повторяющиеся строки из конечного набора результатов. INTERSECT ALLОператор не удаляет повторяющиеся строки из конечного набора результатов, но если строка появляется X раз в первом запросе и Y раз в секунду, оно появится мин (X, Y) раз в наборе результатов.

Пример [ править ]

Следующий пример INTERSECTзапроса возвращает все строки из таблицы «Заказы», ​​где количество находится в диапазоне от 50 до 100.

ВЫБРАТЬ  * FROM  Orders WHERE  Количество  МЕЖДУ  1  И  100ПЕРЕСЕЧЕНИЕВЫБРАТЬ  * FROM  Orders WHERE  Количество  МЕЖДУ  50  И  200 ;

EXCEPT operator [ править ]

Оператор SQL EXCEPTберет отдельные строки одного запроса и возвращает строки, которых нет во втором наборе результатов. Для целей исключения строк и удаления дубликатов EXCEPTоператор не делает различий между ними NULLs. EXCEPT ALLОператор не удаляет дубликаты, но если строка появляется X раз в первом запросе и Y раз в секунду, оно появится макс (X - Y, 0) раз в наборе результатов.

Примечательно, что платформа Oracle предоставляет MINUSоператор, который функционально эквивалентен стандартному EXCEPT DISTINCT оператору SQL [1] .

Пример [ править ]

В следующем примере EXCEPTзапроса возвращаются все строки из таблицы Orders, в которых количество составляет от 1 до 49, а количество - от 76 до 100.

Другими словами; запрос возвращает все строки, в которых количество составляет от 1 до 100, за исключением строк, в которых количество составляет от 50 до 75.

ВЫБРАТЬ  * FROM  Orders WHERE  Количество  МЕЖДУ  1  И  100КРОМЕВЫБРАТЬ  * FROM  Orders WHERE  Количество  МЕЖДУ  50  И  75 ;

Пример [ править ]

Следующий пример эквивалентен приведенному выше, но без использования EXCEPTоператора.

ВЫБЕРИТЕ  o1 . * FROM  (  ВЫБРАТЬ  *  ИЗ  ЗАКАЗОВ,  ГДЕ  КОЛИЧЕСТВО  МЕЖДУ  1  И  100 )  o1 LEFT  JOIN  (  ВЫБРАТЬ  *  ИЗ  ЗАКАЗОВ,  ГДЕ  КОЛИЧЕСТВО  МЕЖДУ  50  И  75 )  o2 ON  o1 . id  =  o2 . id ГДЕ  o2 . id  IS  NULL

См. Также [ править ]

Ссылки [ править ]

  1. ^ «Операторы UNION [ALL], INTERSECT, MINUS» . Oracle . Дата обращения 14 июля 2016 .
  2. ^ " Техник вида для управления техническим обслуживанием и производительностью в вашей большом хранилище данных среды ... Этот метод спас многие из моих клиентов вопросов , связанных с времязависимых дизайном база данных. Эти базы данных , как правило , имеет чрезвычайно неустойчивые текущий таймфрейм, месяц, или день часть , а старые данные редко обновляются. Использование различных распределений контейнера DASD, табличные, таблицы и определения индексов, параметры могут быть настроены для соображений производительности , специфичным для этих различных уровней волатильности и частоты обновления ситуаций. " терабайт хранилища данных Таблица Design Выбор - Часть 2 (URL-адрес доступен 25 июля 2006 г.)UNION ALLUNION ALL

Внешние ссылки [ править ]