Update punctuation
This commit is contained in:
parent
4e47d1131b
commit
be6a869751
40
ch04:集合运算.md
40
ch04:集合运算.md
|
@ -4,9 +4,9 @@
|
|||
|
||||
## 4.1.1 什么是集合运算
|
||||
|
||||
`集合`在数学领域表示“各种各样的事物的总和”, 在数据库领域表示记录的集合. 具体来说,表、视图和查询的执行结果都是记录的集合, 其中的元素为表或者查询结果中的每一行。
|
||||
`集合`在数学领域表示“各种各样的事物的总和”,在数据库领域表示记录的集合。具体来说,表、视图和查询的执行结果都是记录的集合,其中的元素为表或者查询结果中的每一行。
|
||||
|
||||
在标准 SQL 中, 分别对检索结果使用 `UNION`, `INTERSECT,` `EXCEPT` 来将检索结果进行并,交和差运算, 像`UNION`,`INTERSECT`, `EXCEPT`这种用来进行集合运算的运算符称为集合运算符。
|
||||
在标准 SQL 中,分别对检索结果使用 `UNION`,`INTERSECT`, `EXCEPT` 来将检索结果进行并集、交集和差集运算,像`UNION`,`INTERSECT`,`EXCEPT`这种用来进行集合运算的运算符称为集合运算符。
|
||||
|
||||
以下的文氏图展示了几种集合的基本运算。
|
||||
|
||||
|
@ -16,7 +16,7 @@
|
|||
|
||||
[图片来源于网络]
|
||||
|
||||
在数据库中, 所有的表--以及查询结果--都可以视为集合, 因此也可以把表视为集合进行上述集合运算, 在很多时候, 这种抽象非常有助于对复杂查询问题给出一个可行的思路。
|
||||
在数据库中,所有的表--以及查询结果--都可以视为集合,因此也可以把表视为集合进行上述集合运算,在很多时候,这种抽象非常有助于对复杂查询问题给出一个可行的思路。
|
||||
|
||||
## 4.1.2 表的加法--UNION
|
||||
|
||||
|
@ -24,7 +24,7 @@
|
|||
|
||||
建表代码及数据导入请使用第一章提供的代码。
|
||||
|
||||
接下来我们演示UNION的具体用法及查询结果:
|
||||
接下来我们演示UNION的具体用法及查询结果:
|
||||
|
||||
```sql
|
||||
SELECT product_id, product_name
|
||||
|
@ -33,17 +33,17 @@ SELECT product_id, product_name
|
|||
SELECT product_id, product_name
|
||||
FROM product2;
|
||||
```
|
||||
上述结果包含了两张表中的全部商品. 你会发现,这就是我们在学校学过的集合中的并集运算,通过文氏图会看得更清晰(图 7-1):
|
||||
上述结果包含了两张表中的全部商品。你会发现,这就是我们在学校学过的集合中的并集运算,通过文氏图会看得更清晰(图 7-1):
|
||||
|
||||

|
||||
|
||||
通过观察可以发现,商品编号为“ 0001 ”~“ 0003 ”的 3 条记录在两个表中都存在,因此大家可能会认为结果中会出现重复的记录,但是 **UNION 等集合运算符通常都会除去重复的记录**。
|
||||
通过观察可以发现,商品编号为“ 0001 ”~“ 0003 ”的 3 条记录在两个表中都存在,因此大家可能会认为结果中会出现重复的记录,但是 **UNION 等集合运算符通常都会除去重复的记录**。
|
||||
|
||||
上述查询是对不同的两张表进行求并集运算,对于同一张表, 实际上也是可以进行求并集运算的。
|
||||
上述查询是对不同的两张表进行求并集运算,对于同一张表,实际上也是可以进行求并集运算的。
|
||||
|
||||
**练习题:**
|
||||
**练习题:**
|
||||
|
||||
假设连锁店想要增加成本利润率超过 50% 或者售价低于 800 的货物的存货量, 请使用 UNION 对分别满足上述两个条件的商品的查询结果求并集。
|
||||
假设连锁店想要增加成本利润率超过 50% 或者售价低于 800 的货物的存货量,请使用 UNION 对分别满足上述两个条件的商品的查询结果求并集。
|
||||
|
||||
结果应该类似于:
|
||||
|
||||
|
@ -76,15 +76,15 @@ SELECT product_id,product_name,product_type
|
|||
|
||||
### 4.1.2.2 UNION 与 OR 谓词
|
||||
|
||||
对于上边的练习题, 如果你已经正确地写出来查询, 你会发现, 使用 UNION 对两个查询结果取并集, 和在一个查询中使用 WHERE 子句, 然后使用 OR 谓词连接两个查询条件, 能够得到相同的结果。
|
||||
对于上边的练习题,如果你已经正确地写出来查询,你会发现,使用 UNION 对两个查询结果取并集,和在一个查询中使用 WHERE 子句,然后使用 OR 谓词连接两个查询条件,能够得到相同的结果。
|
||||
|
||||
那么是不是就没必要引入 UNION 了呢? 当然不是这样的。确实, 对于同一个表的两个不同的筛选结果集, 使用 UNION 对两个结果集取并集, 和把两个子查询的筛选条件用 OR 谓词连接, 会得到相同的结果, 但倘若要将两个不同的表中的结果合并在一起, 就不得不使用 UNION 了。
|
||||
那么是不是就没必要引入 UNION 了呢?当然不是这样的。确实,对于同一个表的两个不同的筛选结果集,使用 UNION 对两个结果集取并集,和把两个子查询的筛选条件用 OR 谓词连接,会得到相同的结果,但倘若要将两个不同的表中的结果合并在一起,就不得不使用 UNION 了。
|
||||
|
||||
而且, 即便是对于同一张表, 有时也会出于查询效率方面的因素来使用 UNION。
|
||||
而且, 即便是对于同一张表,有时也会出于查询效率方面的因素来使用 UNION。
|
||||
|
||||
**练习题 :**
|
||||
|
||||
分别使用 UNION 或者 OR 谓词,找出成本利润率不足 30%或成本利润率未知的商品。
|
||||
分别使用 UNION 或者 OR 谓词,找出成本利润率不足 30% 或成本利润率未知的商品。
|
||||
|
||||
参考答案:
|
||||
|
||||
|
@ -109,9 +109,9 @@ SELECT *
|
|||
|
||||
### 4.1.2.3 包含重复行的集合运算 UNION ALL
|
||||
|
||||
在4.1.1 中我们发现, SQL 语句的 UNION 会对两个查询的结果集进行合并和去重, 这种去重不仅会去掉两个结果集相互重复的, 还会去掉一个结果集中的重复行. 但在实践中有时候需要需要不去重的并集, 在 UNION 的结果中保留重复行的语法其实非常简单,只需要在 UNION 后面添加 ALL 关键字就可以了。
|
||||
在前面的章节中我们发现,SQL 语句的 UNION 会对两个查询的结果集进行合并和去重,这种去重不仅会去掉两个结果集相互重复的,还会去掉一个结果集中的重复行。但在实践中有时候需要需要不去重的并集,在 UNION 的结果中保留重复行的语法其实非常简单,只需要在 UNION 后面添加 ALL 关键字就可以了。
|
||||
|
||||
例如, 想要知道 product 和 product2 中所包含的商品种类, 首先需要将两个表的商品种类字段选出来, 然后使用 UNION ALL 进行不去重合并,详见如下查询代码。
|
||||
例如,想要知道 product 和 product2 中所包含的商品种类,首先需要将两个表的商品种类字段选出来,然后使用 UNION ALL 进行不去重合并,详见如下查询代码。
|
||||
|
||||
```sql
|
||||
-- 保留重复行
|
||||
|
@ -127,7 +127,7 @@ SELECT product_type
|
|||
|
||||
**练习题:**
|
||||
|
||||
商店决定对product表中成本利润低于50% **或者** 售价低于1000的商品提价, 请使用UNION ALL 语句将分别满足上述两个条件的结果取并集. 查询结果类似下表:
|
||||
商店决定对product表中成本利润低于 50% **或者** 售价低于1000的商品提价,请使用UNION ALL 语句将分别满足上述两个条件的结果取并集。查询结果类似下表:
|
||||
|
||||

|
||||
|
||||
|
@ -145,7 +145,7 @@ SELECT *
|
|||
|
||||
### 4.1.2.4 隐式数据类型转换
|
||||
|
||||
通常来说, 我们会把类型完全一致, 并且代表相同属性的列使用 UNION 合并到一起显示, 但有时候, 即使数据类型不完全相同, 也会通过隐式类型转换来将两个类型不同的列放在一列里显示, 例如字符串和数值类型:
|
||||
通常来说, 我们会把类型完全一致,并且代表相同属性的列使用 UNION 合并到一起显示,但有时候,即使数据类型不完全相同,也会通过隐式类型转换来将两个类型不同的列放在一列里显示,例如字符串和数值类型:
|
||||
|
||||
```sql
|
||||
SELECT product_id, product_name, '1'
|
||||
|
@ -162,9 +162,9 @@ SELECT product_id, product_name,sale_price
|
|||
|
||||
**练习题:**
|
||||
|
||||
使用 SYSDATE()函数可以返回当前日期时间, 是一个日期时间类型的数据, 试测试该数据类型和数值,字符串等类型的兼容性。
|
||||
使用 SYSDATE()函数可以返回当前日期时间,是一个日期时间类型的数据,试测试该数据类型和数值,字符串等类型的兼容性。
|
||||
|
||||
例如, 以下代码可以正确执行, 说明时间日期类型和字符串,数值以及缺失值均能兼容。
|
||||
例如,以下代码可以正确执行,说明时间日期类型和字符串,数值以及缺失值均能兼容。
|
||||
|
||||
```sql
|
||||
SELECT SYSDATE(),SYSDATE(),SYSDATE()
|
||||
|
@ -177,7 +177,7 @@ SELECT 'chars',123,null;
|
|||
|
||||
## 4.1.3 MySQL 8.0 不支持交运算INTERSECT
|
||||
|
||||
集合的交, 就是两个集合的公共部分, 由于集合元素的互异性, 集合的交只需通过文氏图就可以很直观地看到它的意义。
|
||||
集合的交,就是两个集合的公共部分,由于集合元素的互异性,集合的交只需通过文氏图就可以很直观地看到它的意义。
|
||||
|
||||
虽然集合的交运算在SQL标准中已经出现多年了, 然而很遗憾的是, 截止到 MySQL 8.0 版本, MySQL 仍然不支持 INTERSECT 操作。
|
||||
|
||||
|
|
Loading…
Reference in New Issue