MySQL 8.3 Release Notes
query_expression_body EXCEPT [ALL | DISTINCT] query_expression_body
[EXCEPT [ALL | DISTINCT] query_expression_body]
[...]
query_expression_body:
See Section 15.2.14, “Set Operations with UNION, INTERSECT, and EXCEPT”
EXCEPT
将第一个查询块的结果限制为在第二个查询块中找不到的行。与 UNION
和 INTERSECT
一样,任一查询块都可以使用 SELECT
、TABLE
或 VALUES
。使用在 第 15.2.8 节,“INTERSECT子句” 中定义的表 a
、b
和 c
的示例如下:
mysql> TABLE a EXCEPT TABLE b;
+------+------+
| m | n |
+------+------+
| 2 | 3 |
+------+------+
1 row in set (0.00 sec)
mysql> TABLE a EXCEPT TABLE c;
+------+------+
| m | n |
+------+------+
| 1 | 2 |
| 2 | 3 |
+------+------+
2 rows in set (0.00 sec)
mysql> TABLE b EXCEPT TABLE c;
+------+------+
| m | n |
+------+------+
| 1 | 2 |
+------+------+
1 row in set (0.00 sec)
与 UNION
和 INTERSECT
一样,如果既没有指定 DISTINCT
也没有指定 ALL
,则默认为 DISTINCT
。
DISTINCT
删除关系两侧的重复项,如下所示:
mysql> TABLE c EXCEPT DISTINCT TABLE a;
+------+------+
| m | n |
+------+------+
| 1 | 3 |
+------+------+
1 row in set (0.00 sec)
mysql> TABLE c EXCEPT ALL TABLE a;
+------+------+
| m | n |
+------+------+
| 1 | 3 |
| 1 | 3 |
+------+------+
2 rows in set (0.00 sec)
(第一个语句与 TABLE c EXCEPT TABLE a
具有相同的效果。)
与 UNION
或 INTERSECT
不同,EXCEPT
不是交换的——即结果取决于操作数的顺序,如下所示:
mysql> TABLE a EXCEPT TABLE c;
+------+------+
| m | n |
+------+------+
| 1 | 2 |
| 2 | 3 |
+------+------+
2 rows in set (0.00 sec)
mysql> TABLE c EXCEPT TABLE a;
+------+------+
| m | n |
+------+------+
| 1 | 3 |
+------+------+
1 row in set (0.00 sec)
与 UNION
一样,比较的结果集必须具有相同的列数。结果集列类型也将根据 UNION
确定。