Операции над наборами (SQL)
Эта статья включает список общих ссылок , но в ней отсутствуют достаточные соответствующие встроенные цитаты . ( Июль 2022 г. ) |
Операции над множествами в SQL — это тип операций, которые позволяют объединять результаты нескольких запросов в один набор результатов . [1]
Операторы установки в SQL включают UNION
, INTERSECT
, и EXCEPT
, которые математически соответствуют понятиям объединения , пересечения и разности множеств .
оператор СОЮЗ
[ редактировать ]В SQL UNION
Предложение объединяет результаты двух SQL-запросов в одну таблицу всех совпадающих строк . два запроса должны давать одинаковое количество столбцов и совместимые типы данных Для объединения . Любые повторяющиеся записи автоматически удаляются, если только UNION ALL
используется.
UNION
может быть полезен в приложениях хранилищ данных , где таблицы не полностью нормализованы . [2] Простым примером может служить база данных, имеющая таблицы. sales2005
и sales2006
которые имеют идентичную структуру, но разделены по соображениям производительности. А UNION
запрос может объединить результаты из обеих таблиц.
Обратите внимание, что UNION ALL
не гарантирует порядок строк. Строки второго операнда могут появляться до, после или смешиваться со строками первого операнда. В ситуациях, когда требуется конкретный заказ, ORDER BY
необходимо использовать.
Обратите внимание, что UNION ALL
может быть намного быстрее, чем обычный UNION
.
Примеры
[ редактировать ]Учитывая эти две таблицы:
человек | количество |
---|---|
Джо | 1000 |
Алекс | 2000 |
Боб | 5000 |
человек | количество |
---|---|
Джо | 2000 |
Алекс | 2000 |
Зак | 35000 |
Выполнение этого утверждения:
SELECT * FROM sales2005
UNION
SELECT * FROM sales2006;
дает этот набор результатов, хотя порядок строк может варьироваться, поскольку нет ORDER BY
был поставлен пункт:
человек | количество |
---|---|
Джо | 1000 |
Алекс | 2000 |
Боб | 5000 |
Джо | 2000 |
Зак | 35000 |
Обратите внимание, что для Джо есть две строки, поскольку эти строки различаются в своих столбцах. Для Алекса имеется только одна строка, поскольку эти строки не различаются для обоих столбцов.
UNION ALL
дает разные результаты, поскольку не удаляет дубликаты. Выполнение этого утверждения:
SELECT * FROM sales2005
UNION ALL
SELECT * FROM sales2006;
дало бы эти результаты, снова допуская дисперсию из-за отсутствия ORDER BY
заявление:
человек | количество |
---|---|
Джо | 1000 |
Джо | 2000 |
Алекс | 2000 |
Алекс | 2000 |
Боб | 5000 |
Зак | 35000 |
В обсуждении полных внешних соединений также есть пример, в котором используется UNION
.
Оператор ПЕРЕСЕЧЕНИЕ
[ редактировать ]SQL INTERSECT
Оператор принимает результаты двух запросов и возвращает только строки, которые появляются в обоих наборах результатов. В целях удаления дубликатов INTERSECT
оператор не различает NULLs
. INTERSECT
оператор удаляет повторяющиеся строки из окончательного набора результатов. INTERSECT ALL
оператор не удаляет повторяющиеся строки из окончательного набора результатов, но если строка появляется X раз в первом запросе и Y раз во втором, она появится раз в наборе результатов.
Пример
[ редактировать ]Следующий пример INTERSECT
запрос возвращает все строки из таблицы «Заказы», где количество находится в диапазоне от 50 до 100.
SELECT *
FROM Orders
WHERE Quantity BETWEEN 1 AND 100
INTERSECT
SELECT *
FROM Orders
WHERE Quantity BETWEEN 50 AND 200;
ЗА ИСКЛЮЧЕНИЕМ оператор
[ редактировать ]SQL EXCEPT
Оператор берет отдельные строки одного запроса и возвращает строки, которые не появляются во втором наборе результатов. В целях исключения строк и удаления дубликатов EXCEPT
оператор не различает NULLs
. EXCEPT ALL
оператор не удаляет дубликаты, но если строка появляется X раз в первом запросе и Y раз во втором, она появится раз в наборе результатов.
Примечательно, что платформа Oracle предоставляет MINUS
оператор, который функционально эквивалентен стандарту SQL EXCEPT DISTINCT
оператор. [3]
Пример
[ редактировать ]Следующий пример EXCEPT
запрос возвращает все строки из таблицы «Заказы», где количество находится в диапазоне от 1 до 49, а также строки с количеством от 76 до 100.
Сформулировано по-другому; запрос возвращает все строки, где количество находится в диапазоне от 1 до 100, кроме строк, где количество находится в диапазоне от 50 до 75.
SELECT *
FROM Orders
WHERE Quantity BETWEEN 1 AND 100
EXCEPT
SELECT *
FROM Orders
WHERE Quantity BETWEEN 50 AND 75;
Пример
[ редактировать ]Следующий пример эквивалентен приведенному выше примеру, но без использования EXCEPT
оператор.
SELECT o1.*
FROM (
SELECT *
FROM Orders
WHERE Quantity BETWEEN 1 AND 100) o1
LEFT JOIN (
SELECT *
FROM Orders
WHERE Quantity BETWEEN 50 AND 75) o2
ON o1.id = o2.id
WHERE o2.id IS NULL
См. также
[ редактировать ]Ссылки
[ редактировать ]- ^ «Операторы СОЮЗ [ВСЕ], ПЕРЕСЕЧЕНИЕ, МИНУС» . Оракул . Проверено 14 июля 2016 г.
- ^ " а
UNION ALL
рассматривает технику управления обслуживанием и производительностью в среде большого хранилища данных... ЭтоUNION ALL
Этот метод избавил многих моих клиентов от проблем, связанных с проектированием баз данных, чувствительных ко времени. Эти базы данных обычно имеют чрезвычайно изменчивую часть текущего периода, месяца или дня, а более старые данные редко обновляются. Используя различные распределения контейнеров DASD, табличные пространства, таблицы и определения индексов, параметры можно настроить с учетом конкретных требований производительности для этих различных уровней волатильности и ситуаций с частотой обновления. Варианты дизайна таблиц хранилища данных Terabyte - Часть 2 (по состоянию на 25 июля 2006 г.) - ^ "E071-03,
EXCEPT DISTINCT
оператор таблицы: ИспользуйтеMINUS
вместоEXCEPT DISTINCT
" «Соответствие Oracle базовому SQL:2003» . Docs.oracle.com . Проверено 7 июля 2022 г.
Внешние ссылки
[ редактировать ]- Документация MSDN по UNION в Transact-SQL для SQL Server
- Именование выбранных элементов списка в операциях над множествами
- UNION в MySQL с примерами
- СОЮЗ в MySQL
- Предложение UNION в PostgreSQL
- SQL UNION и UNION ALL
- Порядок сортировки в операторе UNION
- Проектирование потока данных, загружающего таблицу хранилища
- Документация Oracle 11g для UNION (ALL), INTERSECT и MINUS
- Операторы набора SQL