Операции над наборами позволяют объединить результаты нескольких запросов в один набор результатов. [1] Set операторы включают в себя UNION
, INTERSECT
и EXCEPT
.
Оператор UNION [ править ]
В SQLUNION
раздел объединяет результаты двух запросов SQL в одну таблицу всех согласующих строк . Два запроса должны привести к одинаковому количеству столбцов и совместимых типов данных для объединения. Любые повторяющиеся записи автоматически удаляются, если они UNION ALL
не используются.
UNION
может быть полезен в приложениях хранилища данных, где таблицы не полностью нормализованы . [2] Простым примером может служить база данных, в которой есть таблицы sales2005
и sales2006
идентичные структуры, но разделенные по соображениям производительности. UNION
Запрос может объединить результаты из обеих таблиц.
Обратите внимание, что UNION ALL
это не гарантирует порядок строк. Строки второго операнда могут появляться до, после или вместе со строками первого операнда. В ситуациях, когда желателен определенный порядок, ORDER BY
необходимо использовать.
Обратите внимание, что это UNION ALL
может быть намного быстрее, чем обычное UNION
.
Примеры [ править ]
Учитывая эти две таблицы:
человек | количество |
---|---|
Джо | 1000 |
Алекс | 2000 г. |
Боб | 5000 |
человек | количество |
---|---|
Джо | 2000 г. |
Алекс | 2000 г. |
Зак | 35000 |
Выполнение этого оператора:
ВЫБРАТЬ * ИЗ sales2005 СОЮЗ ВЫБРАТЬ * ИЗ sales2006 ;
дает этот результирующий набор, хотя порядок строк может варьироваться, потому что не ORDER BY
было предоставлено предложение:
человек | количество |
---|---|
Джо | 1000 |
Алекс | 2000 г. |
Боб | 5000 |
Джо | 2000 г. |
Зак | 35000 |
Обратите внимание, что для Джо есть две строки, потому что эти строки различны по своим столбцам. Для Alex есть только одна строка, потому что эти строки не различны для обоих столбцов.
UNION ALL
дает разные результаты, потому что не удаляет дубликаты. Выполнение этого оператора:
ВЫБРАТЬ * ИЗ sales2005 UNION ВСЕ ВЫБРАТЬ * ИЗ sales2006 ;
даст эти результаты, снова допуская вариацию из-за отсутствия ORDER BY
утверждения:
человек | количество |
---|---|
Джо | 1000 |
Джо | 2000 г. |
Алекс | 2000 г. |
Алекс | 2000 г. |
Боб | 5000 |
Зак | 35000 |
Обсуждение полных внешних объединений также содержит пример использования 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
См. Также [ править ]
Ссылки [ править ]
- ^ «Операторы UNION [ALL], INTERSECT, MINUS» . Oracle . Дата обращения 14 июля 2016 .
- ^ " Техник вида для управления техническим обслуживанием и производительностью в вашей большом хранилище данных среды ... Этот метод спас многие из моих клиентов вопросов , связанных с времязависимых дизайном база данных. Эти базы данных , как правило , имеет чрезвычайно неустойчивые текущий таймфрейм, месяц, или день часть , а старые данные редко обновляются. Использование различных распределений контейнера DASD, табличные, таблицы и определения индексов, параметры могут быть настроены для соображений производительности , специфичным для этих различных уровней волатильности и частоты обновления ситуаций. " терабайт хранилища данных Таблица Design Выбор - Часть 2 (URL-адрес доступен 25 июля 2006 г.)
UNION ALL
UNION ALL
Внешние ссылки [ править ]
- Документация MSDN по UNION в Transact-SQL для SQL Server
- Именование элементов списка выбора в заданных операциях
- UNION в MySQL с примерами
- UNION в MySQL
- Предложение UNION в PostgreSQL
- SQL UNION и UNION ALL
- Порядок сортировки в операторе UNION
- Разработка потока данных, загружающего таблицу хранилища
- Документация Oracle 11g для UNION (ALL), INTERSECT и MINUS
- Операторы набора SQL