Операции над множествами в SQL — это тип операций, которые позволяют объединять результаты нескольких запросов в один набор результатов . [1]
Операторы множеств в SQL включают UNION
, INTERSECT
и EXCEPT
, которые математически соответствуют понятиям объединения , пересечения и разницы множеств .
В SQL это UNION
предложение объединяет результаты двух SQL-запросов в одну таблицу всех совпадающих строк . Для объединения два запроса должны давать одинаковое количество столбцов и совместимые типы данных . Любые повторяющиеся записи автоматически удаляются, если UNION ALL
они не используются.
UNION
может быть полезен в приложениях хранилищ данных , где таблицы не полностью нормализованы . [2] Простым примером может служить база данных, имеющая таблицы sales2005
, sales2006
имеющие идентичную структуру, но разделенные из соображений производительности. Запрос UNION
может объединить результаты из обеих таблиц.
Обратите внимание, что это UNION ALL
не гарантирует порядок строк. Строки второго операнда могут появляться до, после или смешиваться со строками первого операнда. В ситуациях, когда желателен конкретный порядок, ORDER BY
необходимо использовать.
Обратите внимание, что это UNION ALL
может быть намного быстрее, чем обычный UNION
.
Учитывая эти две таблицы:
Выполнение этого утверждения:
SELECT * FROM sales2005 UNION SELECT * FROM sales2006 ;
дает этот набор результатов, хотя порядок строк может меняться, поскольку ORDER BY
предложение не было указано:
Обратите внимание, что для Джо есть две строки, поскольку эти строки различаются в своих столбцах. Для Алекса имеется только одна строка, поскольку эти строки не различаются для обоих столбцов.
UNION ALL
дает разные результаты, поскольку не удаляет дубликаты. Выполнение этого утверждения:
SELECT * FROM sales2005 UNION ALL SELECT * FROM sales2006 ;
дало бы следующие результаты, снова допуская отклонения из-за отсутствия утверждения ORDER BY
:
В обсуждении полных внешних соединений также есть пример, в котором используется UNION
.
Оператор SQL INTERSECT
принимает результаты двух запросов и возвращает только те строки, которые присутствуют в обоих наборах результатов. В целях удаления дубликатов INTERSECT
оператор не делает различий между NULLs
. Оператор INTERSECT
удаляет повторяющиеся строки из окончательного набора результатов. Оператор INTERSECT ALL
не удаляет повторяющиеся строки из окончательного набора результатов, но если строка появляется X раз в первом запросе и Y раз во втором, она появится в наборе результатов несколько раз.
Следующий пример INTERSECT
запроса возвращает все строки из таблицы «Заказы», где количество находится в диапазоне от 50 до 100.
ВЫБЕРИТЕ * ИЗ ЗАКАЗОВ , ГДЕ Количество ОТ 1 ДО 100 ПЕРЕСЕЧЕНИЕВЫБЕРИТЕ * ИЗ ЗАКАЗОВ , ГДЕ Количество ОТ 50 ДО 200 ;
Оператор SQL EXCEPT
берет отдельные строки одного запроса и возвращает строки, которые не появляются во втором наборе результатов. В целях исключения строк и удаления дубликатов оператор EXCEPT
не различает NULLs
. Оператор EXCEPT ALL
не удаляет дубликаты, но если строка появляется X раз в первом запросе и Y раз во втором, она появится в наборе результатов несколько раз.
Примечательно, что платформа Oracle предоставляет MINUS
оператор, который функционально эквивалентен стандартному оператору SQL EXCEPT DISTINCT
. [3]
Следующий пример EXCEPT
запроса возвращает все строки из таблицы «Заказы», где количество находится в диапазоне от 1 до 49, а также строки с количеством от 76 до 100.
Сформулировано по-другому; запрос возвращает все строки, где количество находится в диапазоне от 1 до 100, кроме строк, где количество находится в диапазоне от 50 до 75.
ВЫБЕРИТЕ * ИЗ ЗАКАЗОВ , ГДЕ Количество ОТ 1 ДО 100 КРОМЕВЫБЕРИТЕ * ИЗ ЗАКАЗОВ , ГДЕ Количество ОТ 50 ДО 75 ;
Следующий пример эквивалентен приведенному выше, но без использования оператора EXCEPT
.
ВЫБЕРИТЕ o1 . * FROM ( ВЫБРАТЬ * ИЗ Заказов , ГДЕ Количество МЕЖДУ 1 ДО 100 ) o1 LEFT JOIN ( ВЫБРАТЬ * ИЗ Заказов , ГДЕ Количество МЕЖДУ 50 И 75 ) o2 ON o1 . идентификатор = о2 . идентификатор ГДЕ o2 . идентификатор НУЛЬ
UNION ALL
представлений для управления обслуживанием и производительностью в вашей среде большого хранилища данных... Этот UNION ALL
метод избавил многих моих клиентов от проблем, связанных с проектированием чувствительных ко времени баз данных. Эти базы данных обычно имеют чрезвычайно нестабильный текущий период времени, месяц или дневная часть, а более старые данные редко обновляются. Используя различные распределения контейнеров DASD, табличные пространства, таблицы и определения индексов, параметры можно настроить с учетом конкретных факторов производительности для этих различных уровней волатильности и ситуаций с частотой обновления. «Проектирование таблиц хранилища данных Terabyte. Выбор. Часть 2 (по состоянию на 25 июля 2006 г.)EXCEPT DISTINCT
табличный оператор: используйте MINUS
вместо EXCEPT DISTINCT
« Соответствие Oracle Core SQL: 2003» . Docs.oracle.com . Проверено 7 июля 2022 г.