From 560842d49c676f86da5891a1e31d9451317f6959 Mon Sep 17 00:00:00 2001 From: mba1398 <26516464+mba1398@users.noreply.github.com> Date: Mon, 12 Jul 2021 18:53:59 +0800 Subject: [PATCH] =?UTF-8?q?Update=20ch04:=20=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 --- ch04: 集合运算.md | 20 ++++---------------- 1 file changed, 4 insertions(+), 16 deletions(-) diff --git a/ch04: 集合运算.md b/ch04: 集合运算.md index 4697e16..99ac078 100644 --- a/ch04: 集合运算.md +++ b/ch04: 集合运算.md @@ -248,20 +248,8 @@ SELECT * FROM Product WHERE sale_price<1.3*purchase_price) ``` -### -### 4.1.4.3 EXCEPT ALL 与bag 的差 -类似于UNION ALL, EXCEPT ALL 也是按出现次数进行减法, 也是使用bag模型进行运算。 - -对于两个 bag, 他们的差运算会按照: - -**1.该元素是否属于作为被减数的 bag,** - -**2.该元素在两个 bag 中的出现次数** - -这两个方面来进行计算. 只有属于被减数的bag的元素才参与EXCEP ALL运算, 并且差bag中的次数,等于该元素在两个bag的出现次数之差(差为零或负数则不出现). 因此对于 A = {1,1,1,2,3,5,7}, B = {1,1,2,2,4,6,8} 两个 bag, 它们的差就等于 {1,3,5,7}。 - -### 4.1.4.4 INTERSECT 与 AND 谓词 +### 4.1.4.3 INTERSECT 与 AND 谓词 对于同一个表的两个查询结果而言, 他们的交INTERSECT实际上可以等价地将两个查询的检索条件用AND谓词连接来实现。 @@ -404,7 +392,7 @@ FROM ShopProduct AS SP INNER JOIN Product AS P ON 子句是专门用来指定连结条件的, 我们在上述查询的 ON 之后指定两张表连结所使用的列以及比较条件, 基本上, 它能起到与 WHERE 相同的筛选作用, 我们会在本章的结尾部分进一步探讨这个话题。 -**要点三: SELECT 子句中的列最好按照 表****名****.列名 的格式来使用。** +**要点三: SELECT 子句中的列最好按照 表名.列名 的格式来使用。** 当两张表的列除了用于关联的列之外, 没有名称相同的列的时候, 也可以不写表名, 但表名使得我们能够在今后的任何时间阅读查询代码的时候, 都能马上看出每一列来自于哪张表, 能够节省我们很多时间。 @@ -760,11 +748,11 @@ SELECT SP.shop_id 我们观察上述结果可以发现, 有两种商品: 高压锅和圆珠笔, 在所有商店都没有销售. 由于我们在 SELECT 子句选择列的显示顺序以及未对结果进行排序的原因, 这个事实需要你仔细地进行观察。 -**●外连结要点 1: 选取出单张表中全部的信息** +**● 外连结要点 1: 选取出单张表中全部的信息** 与内连结的结果相比,不同点显而易见,那就是结果的行数不一样.内连结的结果中有 13 条记录,而外连结的结果中有 15 条记录,增加的 2 条记录到底是什么呢?这正是外连结的关键点. 多出的 2 条记录是高压锅和圆珠笔,这 2 条记录在 ShopProduct 表中并不存在,也就是说,这 2 种商品在任何商店中都没有销售.由于内连结只能选取出同时存在于两张表中的数据,因此只在 Product 表中存在的 2 种商品并没有出现在结果之中.相反,对于外连结来说,只要数据存在于某一张表当中,就能够读取出来.在实际的业务中,例如想要生成固定行数的单据时,就需要使用外连结.如果使用内连结的话,根据 SELECT 语句执行时商店库存状况的不同,结果的行数也会发生改变,生成的单据的版式也会受到影响,而使用外连结能够得到固定行数的结果.虽说如此,那些表中不存在的信息我们还是无法得到,结果中高压锅和圆珠笔的商店编号和商店名称都是 NULL (具体信息大家都不知道,真是无可奈何).外连结名称的由来也跟 NULL 有关,即“结果中包含原表中不存在(在原表之外)的信息”.相反,只包含表内信息的连结也就被称为内连结了。 -**●********外连结要点 2:使用 LEFT、RIGHT 来指定主表.** +**● 外连结要点 2:使用 LEFT、RIGHT 来指定主表.** 外连结还有一点非常重要,那就是要把哪张表作为主表.最终的结果中会包含主表内所有的数据.指定主表的关键字是 LEFT 和 RIGHT.顾名思义,使用 LEFT 时 FROM 子句中写在左侧的表是主表,使用 RIGHT 时右侧的表是主表.代码清单 7-11 中使用了 RIGHT ,因此,右侧的表,也就是 Product 表是主表.我们还可以像代码清单 7-12 这样进行改写,意思完全相同.这样你可能会困惑,到底应该使用 LEFT 还是 RIGHT?其实它们的功能没有任何区别,使用哪一个都可以.通常使用 LEFT 的情况会多一些,但也并没有非使用这个不可的理由,使用 RIGHT 也没有问题。