stringtranslate.com

Операции над наборами (SQL)

Операции над множествами в 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 . идентификатор НУЛЬ                                

Смотрите также

Рекомендации

  1. ^ «Операторы СОЮЗ [ВСЕ], ПЕРЕСЕЧЕНИЕ, МИНУС» . Оракул . Проверено 14 июля 2016 г.
  2. ^ " метод UNION ALLпредставлений для управления обслуживанием и производительностью в вашей среде большого хранилища данных... Этот UNION ALLметод избавил многих моих клиентов от проблем, связанных с проектированием чувствительных ко времени баз данных. Эти базы данных обычно имеют чрезвычайно нестабильный текущий период времени, месяц или дневная часть, а более старые данные редко обновляются. Используя различные распределения контейнеров DASD, табличные пространства, таблицы и определения индексов, параметры можно настроить с учетом конкретных факторов производительности для этих различных уровней волатильности и ситуаций с частотой обновления. «Проектирование таблиц хранилища данных Terabyte. Выбор. Часть 2 (по состоянию на 25 июля 2006 г.)
  3. ^ «E071-03, EXCEPT DISTINCTтабличный оператор: используйте MINUSвместо EXCEPT DISTINCT« Соответствие Oracle Core SQL: 2003» . Docs.oracle.com . Проверено 7 июля 2022 г.

Внешние ссылки