Update ch04:集合运算.md

MySQL 8.0.31新特性--INTERSECT and EXCEPT
This commit is contained in:
mba1398 2024-03-22 22:07:06 +08:00 committed by GitHub
parent c309eb0244
commit f29aac26b5
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
1 changed files with 23 additions and 4 deletions

View File

@ -177,11 +177,11 @@ SELECT 'chars',123,null;
![图片](./img/ch04/ch04.08result5.png)
## 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的元素减掉。
![图片](./img/ch04/ch04.09except.png)
### 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 谓词