3.5 集合运算

① SQL 作用在关系上的 union 、 intersect 和 except 运算对应于数学集合论中的 ∪ 、∩ 和﹣运算。我们现在来构造包含在两个集合上使用 union 、 intersect 和 except 运算的查询。

● 在2009年秋季学期开设的所有课程的集合:

select course id
from section
where semester = ’Fall’ and year= 2009;

●在2010年春季学期开设的所有课程的集合:

select course id
from section
where semester = ’Spring’ and year= 2010;

② 在我们后面的讨论中,将用 cl 和c2分别指代包含以上査询结果的两个关系,并在图3-9和图3-10中给出作用在如图2-6所示的 section 关系上的查询结果。注意c2包含两个对应于 course _ id 为 CS -319的元组,因为该课程有两个课程段在2010年春季开课。



3.5.1 并运算

① 为了找出在2009 年球季开课,或者在2010年春季开课或两个学期都开课的所有课程,可以写查询语句:

(select course id
from section
where semester = ’Fall’ and year= 2009)
union
(select course id
from section
where semester = ’Spring’ and year= 2010);

② 与 select 子句不同, union 运算自动去除重复。

③ 这样,在如图2-6所示的 section 关系中,2010年春季开设 CS -319的两个课程段, CS -101在2009年秋季和2010年秋季学期各开设一个课程段, CS -101和 CS -319在结果中只出现一次,如图3-11所示。

④ 如果想保留重复,可以使用union all 代替union :

(select course id
from section
where semester = ’Fall’ and year= 2009)
union all
(select course id
from section
where semester = ’Spring’ and year= 2010);

⑤ 在结果中的重复元组数等于在 cl 和c2中出现的重复元组数的和。因此在上述查询中,每个 CS -319和 CS -101都将被列出两次。作为一个更深入的例子,如果存在这样一种情况: ECE -101在2009年秋季学期开设4个课程段,在2010年春季学期开设2个课程段,那么在结果中将有6个 ECE -101元组。

3.5.2 交运算

① 为了找出2009年球季和2010年春季同时开课的所有课程的集合,可以写作:

(select course id
from section
where semester = ’Fall’ and year= 2009)
intersect
(select course id
from section
where semester = ’Spring’ and year= 2010);

② 结果关系如图3-12所示,它只包括一个 CS -101元组。 intersect 运算自动去除重复。例如,如果存在这样的情况: ECE -101在2009年秋季学期开设4个课程段,在2010年春季学期开设2个课程段,那么在结果中只有1个 ECE -101元组。

③ 如果想保留所有的重复,就必须用intersect all 代替intersect:

(select course id
from section
where semester = ’Fall’ and year= 2009)
intersect all
(select course id
from section
where semester = ’Spring’ and year= 2010);

④ 在结果中出现的重复元组数等于在c1和c2中出现的重复次数里最少的那个;如:如果ECE-101在2009年球季学期开设4个课程段,在2010年春季学期开设2个课程段,那么在结果中有2个ECE-101元组;

3.5.3 差运算

① 为了找出在2009年秋季学期开课但不在2010年春季学期开课的所有课程,可以写作:

(select course id
from section
where semester = ’Fall’ and year= 2009)
except
(select course id
from section
where semester = ’Spring’ and year= 2010);

② 该查询结果如图3-13所示。注意这正好是图3-9的 cl 关系减去不出现的 CS -101元组。 except 运算从其第一个输入中输出所有不出现在第二个输入中的元组,也即它执行集差操作。此运算在执行集差操作之前自动去除输人中的重复。例如,如果 ECE -101在2009年秋季学期开设4个课程段,在2010年春季学期开设2个课程段,那么在except 运算的结果中将没有ECE-101 的任何拷贝;

③ 如果想保留重复,就必须用except all 代替except:

(select course id
from section
where semester = ’Fall’ and year= 2009)
except all
(select course id
from section
where semester = ’Spring’ and year= 2010);

④ 结果中的重复元组数等于在 cl 中出现的重复元组数减去在c2中出现的重复元组数(前提是此差为正)。因此,如果 ECE -101在2009年秋季学期开设4个课程段,在2010年春季学期开设2个课程段,那么在结果中有2个 ECE -101元组。然而,如果 ECE -101在2009年秋季学期开设2个或更少的课程段,在2010年春季学期开设2个课程段,那么在结果中将不存在 ECE -101元组。

3.6 空值

① 空值给关系运算带来了特殊的问题,包括算术运算、比较运算和集合运算。

② 如果算术表达式的任一输人为空,则该算术表达式(涉及诸如+、-、*或/)结果为空。

例如,如果查询中有一个表达式是 r . A +5,并且对于某个特定的元组, r . A 为空,那么对此元组来说,该表达式的结果也为空。

③ 涉及空值的比较问题更多。例如,考虑比较运算“1< null ”。因为我们不知道空值代表的是什么,所以说上述比较为真可能是错误的。但是说上述比较为假也可能是错误的,如果我们认为比较为假,那么“ not (1< nul )”就应该为真,但这是没有意义的。

因而 SQL 将涉及空值的任何比较运算的结果视为 unknown (既不是谓词 is null ,也不是 is not null )。这创建了除 true 和 false 之外的第三个逻辑值。

●  and : true and unknown 的结果是 unknown ,  false and unknoun 结果是 false ,
unknoun and unknoun 的结果是unknown 。
●  or : true or unknown 的结果是 true ,  false or unknown 结果是 unknown ,
unknown or unknown 结果是 unknown 。
●  not : not unhnown 的结果是 unknoun 。

可以验证,如果 r . A 为空,那么“1< r . A ”和“ not (1< r . A )"结果都是 unknown 。
如果 where 子句谓词对一个元组计算出 false 或 unknown ,那么该元组不能被加人到结果集中。

④ SQL 在谓词中使用特殊的关键词 nul 测试空值。因而为找出 instructor 关系中 salary 为空值的所有教师,我们可以写成:

select name
from instructor
where salary is null;

如果为此is null 所作用的值非空,那么它为真;

⑤ 某些 SQL 实现还允许我们使用子句 is unknown 和 is not unknown 来测试一个表达式的结果是否为 unknown ,而不是 true 或 false 。

⑥ 当一个查询使用 select distinct 子句时,重复元组将被去除。为了达到这个目的,当比较两个元组对应的属性值时,如果这两个值都是非空并且值相等,或者都是空,那么它们是相同的。所以诸如{(’A’,null),(’A’,null)} 这样的两个元组拷贝被认为是相同的,即使在某些属性上存在空值。使用 distinct 子句会保留这样的相同元组的一份拷贝。注意上述对待空值的方式与谓词中对待空值的方式是不同的,在谓词中“ null = null ”会返回 unknown ,而不是 true 。

如果元组在所有属性上的取值相等,那么它们就被当作相同元组,即使某些值为空。上述方式还应用于集合的交、并和差运算;

数据库系统概念-第六版 - charter 3 - 笔记 4相关推荐

  1. 数据库系统概念-第六版 - charter 1 - 笔记

    <1>数据库系统(Database System,DBS) 由一个相互关联的数据的集合和一组用以访问这些数据的程序组成:这个数据集合通常被称作数据库(Database): DBS的主要目标 ...

  2. 数据库系统概念第六版 第五章练习题 2 4

    数据库系统概念第六版 第五章练习题 2 4 5.2 写一个使用JDBC元数据特性的JAVA函数,该函数用ResultSet作为输入参数,并把结果输出为用合适的名字作为列名的表格形式. (对JAVA不太 ...

  3. 数据库系统概念第六版 第四章练习题 12 14 18

    数据库系统概念第六版 第四章练习题 12 14 18 4.12 对于图中的数据库,写出一个查询来找到那些没有经理的雇员.注意一个雇员可能只是没有列出其经理或者可能有null经理.使用外连接书写查询,然 ...

  4. 数据库系统概念第六版笔记

    Abraham Siberschatz Henry E Korth S.Sudarshan 杨冬青 李红艳 唐世渭等译. 华章一套书的标志性语言是: 文艺复兴以降,源远流长的科学精神和逐步形成的学术规 ...

  5. mysql图书管理数据库的三个关系模式_数据库 考虑如下关于图书馆的关系模式,用关系代数写出查询(数据库系统概念第六版6.14)...

    贝尔梅尔娜美 2019.03.15 采纳率:60%    等级:39 已帮助:91565人 数据库系统的基本概念 数据:实际上就是描述事物的符号记录. 数据的特点:有一定的结构,有型与值之分,如整型. ...

  6. 数据库系统概念 第六版 大学数据库代码

    官网 create table classroom(building varchar(15),room_number varchar(7),capacity numeric(4,0),primary ...

  7. 数据库系统概念第六版 第七章练习题 15 22

    数据库第七章理论习题 7.15 为医院构造一个包含一组病人和一组医生的E-R图.为每个病人关联一组不同的检查和化验记录. 说明:医生和病人间存在联系,同时病人有特有的检查和化验记录,病人有病床,医生属 ...

  8. C++Primer Plus (第六版)阅读笔记 + 源码分析【目录汇总】

    C++Primer Plus (第六版)阅读笔记 + 源码分析[第一章:预备知识] C++Primer Plus (第六版)阅读笔记 + 源码分析[第二章:开始学习C++] C++Primer Plu ...

  9. 【数据库系统概念第七版(Database System Concepts 7th)配套SQL文件如何获取】

    数据库系统概念第七版(Database System Concepts 7th)配套SQL文件如何获取 数据库大黑书获取配套SQL文件 最后在数据库运行SQL文件即可 数据库大黑书获取配套SQL文件 ...

  10. 软件工程第六版全书总结笔记

    软件工程 (!!!重在理解基本原理和概念,不要陷于工具的细节!!!) 第一章软件工程学概述 软件工程诞生的背景:为了更有效的开发与维护软件. 软件危机:计算机软件的开发和维护过程中所遇到的一系列严重问 ...

最新文章

  1. 学会理解并编辑/etc/fstab
  2. php从内存中获取源码_【PHP7源码分析】PHP内存管理
  3. css实现排序升降图标
  4. python excel库 linux_用python写一个简单的excel表格获取当时的linux系统信息
  5. Oracle查询今天、昨天、本周、上周、本月、上月数据
  6. 组合体计算机绘图的实验原理,机械制图及计算机绘图
  7. java的人patch方法_java – Spring MVC PATCH方法:部分更新
  8. hive中使用case、if:一个region统计业务(hive条件函数case、if、COALESCE语法介绍:CONDITIONAL FUNCTIONS IN HIVE)...
  9. vc 可用的正则表达式库
  10. mysql 按字段排序
  11. 广发证券数据治理的探索与实践
  12. 城通网盘,千军万马,千脑网盘,119g网盘哪个适合做网赚?
  13. 适合产品经理不同阶段的书籍和课程
  14. Linux扩容raid,linux raid1扩容的方法
  15. AlexNet 实现猫狗分类(keras and pytorch)
  16. linux 按键检测 防抖,GPIO输入——按键检测
  17. SpringMVC(3)
  18. UA OPTI501 电磁波 求解麦克斯韦方程组的Fourier方法2 麦克斯韦方程组的解
  19. 华米手表2 是android,使用华米2手表近3个月,简单交流一下真实使用感受,侧重游泳...
  20. 7:第三章:电商工程分析:2:电商工程业务解读与微服务拆分;

热门文章

  1. 几种常用的操作系统调度策略
  2. XTU,C语言,Digit String
  3. 【python】自动化测试浏览器不关闭
  4. Android外部存储设备管理——vold挂载大容量存储设备
  5. 计算机网络(自顶向下方法)-应用层
  6. 三月校赛1006 wuli通通和Fibonacci (a[n]=f[n]*(n^m)的前k项和)
  7. 10个超强英语学习资源网站,学霸们都在用!
  8. 方框加对勾怎么输入_Word怎么输入对号和方框对勾
  9. C++ - priority_queue
  10. 支付宝小程序、百度小程序、微信小程序、今日头条小程序技术分析