MySQL 9.0 發行說明
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
的方式相同決定。