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

редактировать

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

Содержание

  • 1 оператор UNION
    • 1.1 Примеры
  • 2 оператор INTERSECT
    • 2.1 Пример
  • 3 Оператор EXCEPT
    • 3.1 Пример
    • 3.2 Пример
  • 4 См. Также
  • 5 Ссылки
  • 6 Внешние ссылки

Оператор UNION

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

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

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

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

Примеры

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

sales2005
personсумма
Джо1000
Алекс2000
Боб5000
продажи 2006
человекamount
Joe2000
Alex2000
Zach35000

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

SELECT * FROM sales2005 UNION ВЫБРАТЬ * ИЗ sales2006;

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

personamount
Joe1000
Алекс2000
Боб5000
Джо2000
Зак35000

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

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

SELECT * FROM sales2005 UNION ALL SELECT * FROM sales2006;

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

personamount
Joe1000
Джо2000
Алекс2000
Алекс2000
Боб5000
Зак35000

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

INTERSECT

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

Пример

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

SELECT * FROM Orders WHERE Quantity BETWEEN 1 И 100 ПЕРЕСЕЧЕНИЕ ВЫБРАТЬ * ИЗ заказов, ГДЕ КОЛИЧЕСТВО МЕЖДУ 50 И 200;

Оператор EXCEPT

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

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

Пример

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

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

ВЫБРАТЬ * ИЗ заказов, ГДЕ КОЛИЧЕСТВО МЕЖДУ 1 И 100, ИСКЛЮЧАЯ ВЫБРАТЬ * ИЗ заказов, ГДЕ КОЛИЧЕСТВО МЕЖДУ 50 И 75 ;

Пример

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

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

См. Также

Ссылки

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

Последняя правка сделана 2021-06-08 01:34:42
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте