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