SQL 中的 EXCEPT 子句用于从第一个查询返回不同的行,这些行不存在于第二个查询的结果中。它本质上执行一个集合差操作,允许你过滤掉存在于一个数据集但不存在于另一个数据集中的记录。例如,如果你有两个包含来自不同地区的客户数据的表,EXCEPT 可以帮助识别第一个地区中未在第二个地区中列出的客户。这对于比较数据集或隔离唯一条目特别有用。
要使用 EXCEPT,两个 SELECT 语句必须具有相同数量的列,并且相应的列必须具有兼容的数据类型。 该子句比较两个结果集中的整个行并删除重复项。 例如,假设你有一个 employees
表和一个 contractors
表。 使用 SELECT name FROM employees EXCEPT SELECT name FROM contractors
将返回不是承包商的员工的姓名。 如果第一个查询的结果中存在重复项,EXCEPT 将仅返回每个唯一行的一个实例。 某些数据库(如 PostgreSQL)也支持 EXCEPT ALL
,如果重复项未在第二个查询中匹配,则保留重复项。
EXCEPT 的常见用例包括数据验证、更改跟踪和识别差异。 例如,你可以使用它来验证从暂存表中删除的记录是否不再显示在生产数据集中。 虽然 EXCEPT 很简单,但 NOT IN
或 LEFT JOIN ... WHERE ... IS NULL
等替代方法可以实现类似的结果,但它们可能需要更冗长的语法或以不同的方式处理 NULL 值。 同样重要的是要注意,并非所有数据库都支持 EXCEPT——例如,MySQL 使用 NOT IN
或 LEFT JOIN
解决方法。 了解数据库的功能可确保你选择最有效的集合运算方法。