SQL中的集合操作(set operations)是一类允许将多个查询的结果合并为单个结果集的操作。[1]SQL集合运算符包括 UNION(并集)、INTERSECT(交集)和 EXCEPT(差集),它们在数学集合论上对应于并集交集差集概念。

UNION运算符

编辑

在SQL中,UNION子句将两个SQL查询的结果合并为一个包含所有匹配行的单表。为了进行合并,两个查询必须产生相同数量的列,且对应列的数据类型必须兼容。除非使用UNION ALL,否则所有重复记录都会被自动移除。

在数据表未完全规范化(Normalized)的数据仓库应用中,UNION非常有用。[2]一个简单的例子是:数据库中有sales2005sales2006两张表,它们结构完全相同,但出于性能考虑被拆分。使用UNION查询可以将这两张表的结果合并。

UNION ALL不保证行的顺序。第二个查询的行可能出现在第一个查询的行之前、之后或与之混杂。如果需要特定顺序,必须使用ORDER BY

UNION ALL通常比普通的 UNION 快得多。

例子

编辑

给定2张表:

sales2005
person amount
Joe 1000
Alex 2000
Bob 5000
sales2006
person amount
Joe 2000
Alex 2000
Zach 35000

执行下属语句:

SELECT * FROM sales2005
UNION
SELECT * FROM sales2006;

产生下述结果集,行的顺序不定因为没有ORDER BY子句:

person amount
Joe 1000
Alex 2000
Bob 5000
Joe 2000
Zach 35000

注意Joe有两行因为这两行的列值并不完全相同。Alex只有一行因为冗余的行会被删除。

UNION ALL给出不同的结果,它并不删除冗余:

SELECT * FROM sales2005
UNION ALL
SELECT * FROM sales2006;

结果集为:

person amount
Joe 1000
Joe 2000
Alex 2000
Alex 2000
Bob 5000
Zach 35000

full outer joins就是使用UNION的例子。

INTERSECT 运算符

编辑

SQL的INTERSECT(交集)运算符接收两个查询的结果,并且只返回同时出现在这两个结果集中的行。出于去重的目的,INTERSECT 运算符将所有的NULL值视为相同(即不会区分它们)。INTERSECT运算符会从最终的结果集中移除重复的行。

INTERSECT ALL运算符不会从最终结果集中移除重复行。但是,如果某一行在第一个查询中出现了X次,在第二个查询中出现了Y次,那么它在最终结果集中将会出现 (即X和Y中的较小值)次。

例子

编辑
SELECT *
FROM   Orders
WHERE  Quantity BETWEEN 1 AND 100

INTERSECT

SELECT *
FROM   Orders
WHERE  Quantity BETWEEN 50 AND 200;

EXCEPT operator

编辑

EXCEPT 运算符 SQL 的 EXCEPT(差集)运算符提取第一个查询结果中的去重行,并返回那些没有出现在第二个结果集中的行。出于消除行和去除重复项的目的,EXCEPT 运算符不会区分 NULL 值(即把多个 NULL 视为相同并去重)。

EXCEPT ALL 运算符 EXCEPT ALL 运算符不会去除重复项。但是,如果某一行在第一个查询中出现了 X 次,在第二个查询中出现了 Y 次,那么它在最终结果集中将出现 max(X-Y, 0) 次。

值得注意的是,Oracle平台提供了一个MINUS运算符,它在功能上完全等同于SQL:2003英语SQL:2003标准中的EXCEPT DISTINCT(即普通的 EXCEPT)运算符。[3]

示例1

编辑

The following example EXCEPT query returns all rows from the Orders table where Quantity is between 1 and 49, and those with a Quantity between 76 and 100. (假设有)以下EXCEPT查询示例,它返回 Orders 表中数量(Quantity)在 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;

示例2

编辑

下例不使用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

参考文献

编辑
  1. ^ The UNION [ALL], INTERSECT, MINUS Operators. Oracle. [14 July 2016]. (原始内容存档于2025-05-30). 
  2. ^ "a UNION ALL views technique for managing maintenance and performance in your large data warehouse environment ... This UNION ALL technique has saved many of my clients with issues related to time-sensitive database designs. These databases usually have an extremely volatile current timeframe, month, or day portion and the older data is rarely updated. Using different container DASD allocations, tablespaces, tables, and index definitions, the settings can be tuned for the specific performance considerations for these different volatility levels and update frequency situations." Terabyte Data Warehouse Table Design Choices - Part 2页面存档备份,存于互联网档案馆) (accessed on July 25, 2006)
  3. ^ "E071-03, EXCEPT DISTINCT table operator: Use MINUS instead of EXCEPT DISTINCT" Oracle Compliance To Core SQL:2003. Docs.oracle.com. [7 July 2022]. (原始内容存档于2025-01-24). 

外部链接

编辑

📚 Artikel Terkait di Wikipedia

空值 (SQL)

ROW_NUMBER子句 UNION,INTERSECT和 EXCEPT操作符,它們將NULL視為用於行比較/消除目的相同 DISTINCT SELECT查詢中使用的關鍵字 SQL規範中的 UNION操作符效果會違反空值不相等的原則(它們確實相互確定了空值)。因此某些 SQL操作(如聯合或區別)可能產生不能表示確定信息的結果,這與涉及與

Order by

SQL中的ORDER BY子句用于指定SELECT语句返回的结果集(英语:Result set)按一个或多个列的值进行排序。用于排序的标准(即排序列)并不一定要包含在最终的结果集中(但在SELECT DISTINCT, GROUP BY, UNION [DISTINCT], EXCEPT [DISTINCT]、INTERSECT

Python

with语句,只能用在协程函数的主体中。 try(英语:Exception handling syntax)語句,它经常包含except、else、finally子句,處理在程式執行中出现的例外情況。Python 3.11介入了except*子句。Python支持并广泛使用EAFP(请求原谅比获得许可更容易)风格的例外处理,作为检

SQLAlchemy

SQLAlchemy是为Python编程语言提供的开源SQL工具包及对象关系映射器(ORM),是在MIT许可证下发行的软件。 SQLAlchemy提供企业级持久化(英语:Persistence (computer science))模式,首次发行于2006年2月。SQLAlchemy的理念是:关系

窗函数 (SQL)

在SQL中,窗函数(window function)或分析函数(analytic function)是一个函数,它使用来自一行或多行的值来为每一行返回一个值。 与之形成对比,聚合函数(英语:Aggregate function)为多行返回单个值。窗口函数有一个OVER子句;任何没有OVER子句的函

Modula-3

Modula-3的例外处理,基于了TRY-EXCEPT语句。采用类似的块系统的有Delphi、Python、Scala和Visual Basic.NET。 TRY-EXCEPT语句有如下形式: TRY Body EXCEPT id_1 (v_1) => Handler_1 | ..

Nim

2、OpenGL、WinAPI、zlib、libzip(英语:libzip)、OpenSSL 以及 cURL。 Nim 可与 PostgreSQL、MySQL 以及 SQLite 数据库共同工作,可与 Lua 和 Python 语言的解释器交互。 Hello, World!用Nim写为: echo("Hello

C♯

语言集成查询(英語:Language Integrated Query,缩写:LINQ):上下文相关关键字"from, where, select"可用于查询SQL、XML、集合等。这些标识符在LINQ上下文中被作为关键字,但是它们的增加不会破坏原有的名为from、where或select的变量。 Customer