From f29aac26b547149d01c7f604b7ab52504ada97bd Mon Sep 17 00:00:00 2001 From: mba1398 <26516464+mba1398@users.noreply.github.com> Date: Fri, 22 Mar 2024 22:07:06 +0800 Subject: [PATCH] =?UTF-8?q?Update=20ch04:=E9=9B=86=E5=90=88=E8=BF=90?= =?UTF-8?q?=E7=AE=97.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit MySQL 8.0.31新特性--INTERSECT and EXCEPT --- ch04:集合运算.md | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/ch04:集合运算.md b/ch04:集合运算.md index cf169b7..5436d07 100644 --- a/ch04:集合运算.md +++ b/ch04:集合运算.md @@ -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 谓词