数据库系统概念-第六版 - charter 3 - 笔记 4
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相关推荐
- 数据库系统概念-第六版 - charter 1 - 笔记
<1>数据库系统(Database System,DBS) 由一个相互关联的数据的集合和一组用以访问这些数据的程序组成:这个数据集合通常被称作数据库(Database): DBS的主要目标 ...
- 数据库系统概念第六版 第五章练习题 2 4
数据库系统概念第六版 第五章练习题 2 4 5.2 写一个使用JDBC元数据特性的JAVA函数,该函数用ResultSet作为输入参数,并把结果输出为用合适的名字作为列名的表格形式. (对JAVA不太 ...
- 数据库系统概念第六版 第四章练习题 12 14 18
数据库系统概念第六版 第四章练习题 12 14 18 4.12 对于图中的数据库,写出一个查询来找到那些没有经理的雇员.注意一个雇员可能只是没有列出其经理或者可能有null经理.使用外连接书写查询,然 ...
- 数据库系统概念第六版笔记
Abraham Siberschatz Henry E Korth S.Sudarshan 杨冬青 李红艳 唐世渭等译. 华章一套书的标志性语言是: 文艺复兴以降,源远流长的科学精神和逐步形成的学术规 ...
- mysql图书管理数据库的三个关系模式_数据库 考虑如下关于图书馆的关系模式,用关系代数写出查询(数据库系统概念第六版6.14)...
贝尔梅尔娜美 2019.03.15 采纳率:60% 等级:39 已帮助:91565人 数据库系统的基本概念 数据:实际上就是描述事物的符号记录. 数据的特点:有一定的结构,有型与值之分,如整型. ...
- 数据库系统概念 第六版 大学数据库代码
官网 create table classroom(building varchar(15),room_number varchar(7),capacity numeric(4,0),primary ...
- 数据库系统概念第六版 第七章练习题 15 22
数据库第七章理论习题 7.15 为医院构造一个包含一组病人和一组医生的E-R图.为每个病人关联一组不同的检查和化验记录. 说明:医生和病人间存在联系,同时病人有特有的检查和化验记录,病人有病床,医生属 ...
- C++Primer Plus (第六版)阅读笔记 + 源码分析【目录汇总】
C++Primer Plus (第六版)阅读笔记 + 源码分析[第一章:预备知识] C++Primer Plus (第六版)阅读笔记 + 源码分析[第二章:开始学习C++] C++Primer Plu ...
- 【数据库系统概念第七版(Database System Concepts 7th)配套SQL文件如何获取】
数据库系统概念第七版(Database System Concepts 7th)配套SQL文件如何获取 数据库大黑书获取配套SQL文件 最后在数据库运行SQL文件即可 数据库大黑书获取配套SQL文件 ...
- 软件工程第六版全书总结笔记
软件工程 (!!!重在理解基本原理和概念,不要陷于工具的细节!!!) 第一章软件工程学概述 软件工程诞生的背景:为了更有效的开发与维护软件. 软件危机:计算机软件的开发和维护过程中所遇到的一系列严重问 ...
最新文章
- 学会理解并编辑/etc/fstab
- php从内存中获取源码_【PHP7源码分析】PHP内存管理
- css实现排序升降图标
- python excel库 linux_用python写一个简单的excel表格获取当时的linux系统信息
- Oracle查询今天、昨天、本周、上周、本月、上月数据
- 组合体计算机绘图的实验原理,机械制图及计算机绘图
- java的人patch方法_java – Spring MVC PATCH方法:部分更新
- hive中使用case、if:一个region统计业务(hive条件函数case、if、COALESCE语法介绍:CONDITIONAL FUNCTIONS IN HIVE)...
- vc 可用的正则表达式库
- mysql 按字段排序
- 广发证券数据治理的探索与实践
- 城通网盘,千军万马,千脑网盘,119g网盘哪个适合做网赚?
- 适合产品经理不同阶段的书籍和课程
- Linux扩容raid,linux raid1扩容的方法
- AlexNet 实现猫狗分类(keras and pytorch)
- linux 按键检测 防抖,GPIO输入——按键检测
- SpringMVC(3)
- UA OPTI501 电磁波 求解麦克斯韦方程组的Fourier方法2 麦克斯韦方程组的解
- 华米手表2 是android,使用华米2手表近3个月,简单交流一下真实使用感受,侧重游泳...
- 7:第三章:电商工程分析:2:电商工程业务解读与微服务拆分;
热门文章
- 几种常用的操作系统调度策略
- XTU,C语言,Digit String
- 【python】自动化测试浏览器不关闭
- Android外部存储设备管理——vold挂载大容量存储设备
- 计算机网络(自顶向下方法)-应用层
- 三月校赛1006 wuli通通和Fibonacci (a[n]=f[n]*(n^m)的前k项和)
- 10个超强英语学习资源网站,学霸们都在用!
- 方框加对勾怎么输入_Word怎么输入对号和方框对勾
- C++ - priority_queue
- 支付宝小程序、百度小程序、微信小程序、今日头条小程序技术分析