Update ch04:集合运算.md
MySQL 8.0.31新特性--INTERSECT and EXCEPT
This commit is contained in:
parent
c309eb0244
commit
f29aac26b5
27
ch04:集合运算.md
27
ch04:集合运算.md
|
@ -177,11 +177,11 @@ SELECT 'chars',123,null;
|
|||
|
||||

|
||||
|
||||
## 4.1.3 MySQL 8.0 不支持交运算INTERSECT
|
||||
## 4.1.3 MySQL 8.0 交集运算符 INTERSECT
|
||||
|
||||
集合的交,就是两个集合的公共部分,由于集合元素的互异性,集合的交只需通过文氏图就可以很直观地看到它的意义。
|
||||
|
||||
虽然集合的交运算在SQL标准中已经出现多年了,然而很遗憾的是,截止到 MySQL 8.0 版本,MySQL 仍然不支持 INTERSECT 操作。
|
||||
截止到 MySQL 8.0.30 版本,MySQL 仍然不支持 INTERSECT 操作。
|
||||
|
||||
```sql
|
||||
SELECT product_id, product_name
|
||||
|
@ -202,15 +202,30 @@ INNER JOIN product2 p2
|
|||
ON p1.product_id=p2.product_id;
|
||||
```
|
||||
|
||||
可喜的是,MySQL 8.0.31 已经支持 `INTERSECT ` 运算符了,而且非常简单,使用 `INTERSECT ` 求交集代码如下:
|
||||
```sql
|
||||
TABLE product INTERSECT TABLE product2;
|
||||
```
|
||||
|
||||
需要注意的是:使用 `INTERSECT` 运算符进行交集运算的两张表的列数必须相同,**字段类型也需要相同。**
|
||||
|
||||
`INTERSECT` 运算符优先级高于 `UNION` 和 `EXCEPT` ,同时出现时会优先进行交集运算,如下两条SQL语句是等价的。
|
||||
|
||||
```sql
|
||||
TABLE r EXCEPT TABLE s INTERSECT TABLE t;
|
||||
|
||||
TABLE r EXCEPT (TABLE s INTERSECT TABLE t);
|
||||
```
|
||||
|
||||
## 4.1.4 差集,补集与表的减法
|
||||
|
||||
求集合差集的减法运算和实数的减法运算有些不同,当使用一个集合A减去另一个集合B的时候,对于只存在于集合B而不存在于集合A的元素,采取直接忽略的策略,因此集合A和B做减法只是将集合A中也同时属于集合B的元素减掉。
|
||||
|
||||

|
||||
|
||||
### 4.1.4.1 MySQL 8.0 还不支持 EXCEPT 运算
|
||||
### 4.1.4.1 MySQL 8.0 差集运算符 EXCEPT
|
||||
|
||||
MySQL 8.0 还不支持 表的减法运算符 EXCEPT。不过,借助第六章学过的NOT IN 谓词,我们同样可以实现表的减法。
|
||||
MySQL 8.0.31 之前的版本不支持 表的减法运算符 EXCEPT。可以借助之前学过的NOT IN 谓词实现表的减法(差集运算)。
|
||||
|
||||
**练习题:**
|
||||
|
||||
|
@ -223,6 +238,10 @@ SELECT *
|
|||
WHERE product_id NOT IN (SELECT product_id
|
||||
FROM product2);
|
||||
```
|
||||
使用 MySQL 8.0.31 版本进行差集运算的语句如下:
|
||||
```sql
|
||||
TABLE product EXCEPT TABLE product2;
|
||||
```
|
||||
|
||||
### 4.1.4.2 EXCEPT 与 NOT 谓词
|
||||
|
||||
|
|
Loading…
Reference in New Issue