Update punctuation

This commit is contained in:
mba1398 2023-07-30 13:39:31 +08:00 committed by GitHub
parent 4e47d1131b
commit be6a869751
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 20 additions and 20 deletions

View File

@ -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)
![图片](./img/ch04/ch04.03union.png)
通过观察可以发现,商品编号为“ 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 语句将分别满足上述两个条件的结果取并集。查询结果类似下表:
![图片](./img/ch04/ch04.06result3.png)
@ -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 操作。