SQL EXCEPT

17 Mar 2025 | 4 分钟阅读

通常,我们使用 JOIN 子句来获取来自多个表的组合结果。有时,我们需要一个结果集,其中包含一个表中的记录,但另一个表中不存在。在这种情况下,SQL 提供了 EXCEPT 子句/运算符。

SQL 中的 EXCEPT 子句广泛用于过滤来自多个表的记录。该语句首先组合两个 SELECT 语句,并返回第一个 SELECT 查询中不存在于第二个 SELECT 查询结果中的记录。换句话说,它从第一个 SELECT 查询中检索所有行,同时删除第二个查询中的冗余行。

此语句的行为与数学中的 minus 运算符相同。本文将通过基本示例说明如何使用 SQL EXCEPT 子句。

SQL EXCEPT 规则

在使用 SQL 中的 EXCEPT 语句之前,应考虑以下规则

  • 在所有 SELECT 语句中,表中列的数量和顺序必须相同。
  • 相应列的数据类型应相同或兼容。
  • 两个 SELECT 语句的相应列中的字段不能相同。

SQL EXCEPT 语法

以下语法说明了 EXCEPT 子句的使用

注意:需要注意的是,MySQL 不支持 EXCEPT 子句。因此,我们将使用 PostgreSQL 数据库来解释 SQL EXCEPT 示例。

下图说明了 EXCEPT 操作在表 T1 和 T2 中的工作原理

SQL EXCEPT

图解

  • 表 T1 包含数据 1、2 和 3。
  • 表 T2 包含数据 2、3 和 4。

当我们在这些表上执行 EXCEPT 查询时,我们将得到 1,它是 T1 中的唯一数据,并且在 T2 中找不到。

SQL EXCEPT 示例

让我们首先使用以下脚本创建两个表

表:Customer

表:Orders

接下来,我们将向两个表中插入一些记录,如下所示

表:customer

表:orders

接下来,我们将使用 SELECT 语句来验证记录。请看下图

SQL EXCEPT

让我们通过这些表来看一个 SQL EXCEPT 的例子。假设我们想在 SELECT 语句中连接这些表,如下所示

它将产生以下输出

SQL EXCEPT

EXCEPT 与 ORDER BY 子句

如果我们要对 EXCEPT 运算符获得的结果集进行排序,我们需要在查询中添加 ORDER BY 子句。例如,以下示例连接了两个表,并按名称升序对结果集进行排序

它将产生以下输出

SQL EXCEPT

单个表中的 EXCEPT 语句

通常,我们在两个表中使用 EXCEPT 语句,但我们也可以使用它们来过滤单个表中的记录。例如,以下 EXCEPT 语句将返回 customer 表中年龄大于 21 的所有记录

在此脚本中,第一个 SELECT 查询返回 customer 表中的所有记录,第二个查询返回年龄大于 21 的所有记录。接下来,EXCEPT 语句使用两个 SELECT 语句过滤记录,并仅返回年龄大于 21 的行。

EXCEPT 与 NOT IN 子句有什么区别?

EXCEPT 与 NOT IN 子句的区别如下

  • EXCEPT 子句会自动删除结果集中的所有重复项,而 NOT IN 不会删除重复记录。
  • EXCEPT 子句可以对单个或多个列进行比较。而 NOT IN 子句只能对单个列进行比较。