前言
本仓库记录了数据库相关内容的学习过程,主要包括 HIT 战德臣教授在中国大学 MOOC 平台开设的《数据库系统》课程,以后也会增加一些 MySQL、Redis等数据库的内容。
课程概述
《数据库系统》不仅是计算机、软件工程等专业的核心课程,而且也是非计算机专业学生必修的信息技术课程。当前互联网+大数据,一切都建立在数据库之上,以数据说话,首先需要聚集数据、需要分析和管理数据。数据库技术已成为各种计算系统的核心技术,数据库相关知识也已成为每个人必须掌握的知识。—— 课程团队
课程链接
课程目标
本系列课程旨在使学生充分掌握数据库系统的基本概念和基本原理,熟练掌握数据库系统语言、数据库抽象与建模方法和数据库应用程序设计方法,培养学生在信息管理和信息系统方面的抽象、设计、开发、应用和管理能力。同时,数据存储、数据库查询实现、查询优化、事务处理等技术,这些内容也是计算机学科学生在专业方面必须掌握的操纵数据库的能力,本课程也将为你详细讲授。
本课程将分为四个部分进行介绍:
一、基本知识与关系模型;
二、数据库语言及其应用;
三、数据建模与数据库设计;
四、数据库管理系统实现技术。
这四部分内容之间的关系如下图示意。
这四部分内容将分为三门系列课程来开放。本课程《数据库系统(上)-模型与语言》将包括第一部分和第二部分内容。学习完本课程后,你可选择继续学习《数据库系统》系列课程的第二门《数据库系统(中)-建模与设计》或者选择继续学习《数据库系统》系列课程的第三门《数据库系统(下)-管理与技术》,这两门课为高阶课程,可以结合你的需求选择学习。
本系列课程的特色:(1)本课程是一门理论性为基础、应用性为目标,理论应用相结合的计算机类主干课程;(2)抽象内容的实例化讲解是本课程的特色,通过大量具体示例,来阐释数据库相关的抽象概念和原理;(3)知识学习与案例点评相结合是本课程的特色,本课程包含数据建模和数据库设计相关的内容,重要的是知识的运用,案例点评则成为知识运用能力训练的重要手段; (4)问题导引的知识学习是本课程的特色,深入浅出,图文并茂,案例配合,面向问题地阐释数据库系统的核心内容。本课程将为学生从事大型信息系统软件的设计、开发和应用打下基础,也将为学生今后从事大规模数据的存储、操纵和分析奠定很好的基础。
参考教材:
–1. Database System Concepts(数据库系统概念,有中译本), 7th Edition, 机械工业出版社,2021.
2. Database System Implementation(数据库系统实现,有中译本), 2nd Edition, 机械工业出版社,2010.
–3. Database: Principles,Programming,and Performance(数据库:原理、编程与性能,有中译本), 2nd Edition,Patrick O’Neil, Elizabeth O’Neil,高等教育出版社,2001。
注:数据库系统的经典教材有很多,同学可任选一本作为主教材,其他可作为辅助教材。建议必备前面的第1和2两本教材,这两本教材并不重复。第1本教材是较为全面的数据库系统的教材,而第2本教材则是数据库管理系统实现技术的教材。
第1讲-初步认识数据库系统
000-数据库系统课程简要介绍(9分47秒)
100-本讲学习什么(1分40秒)及第1讲教学课件PDF
101-为什么要学习数据库系统(4分41秒)
102-什么是数据库(7分11秒)
数据库是电子化信息的集合。
E.F.Codd,基于对“表(Table)”的理解:
- 提出了“关系”及关系模型
- 提出了关系数据库理论
- 开创了数据库的时代
- 当前普遍应用的数据库管理系统的奠基者
- 获得了计算机领域最高奖“图灵奖“
Database:相互之间有关联关系的Table的集合
103-什么是数据库系统(6分25秒)
104-从用户角度看数据库管理系统(9分39秒)
105-从系统角度看数据库管理系统(9分51秒)
106-数据库系统课程学习什么(9分43秒)
第1讲模拟练习题
数据库管理系统是软件产品,而数据库系统不仅仅是软件产品
数据库系统的构成包括数据库、数据库管理系统、数据库应用程序、数据库管理员以及计算机与网络基本系统
数据库管理系统就是通过数据库语言让用户操作进而提供数据库定义、数据库操纵和数据库控制功能的系统,同时提供了一系列程序能够实现对数据库的各种存储与维护
第2讲-数据库系统的结构抽象与演变
200-本讲学习什么(1分39秒)及第2讲教学课件PDF
201-数据库系统的标准结构(15分15秒)
202-什么是数据模型(11分41秒)
三大经典数据模型:
- 关系模型:表的形式组织数据
- 层次模型:树的形式组织数据
- 网状模型:图的形式组织数据
203-数据库系统的演变(15分05秒)
(1)简要发展史
(2)由文件系统到数据库
(3)由层次模型数据库、网状模型数据库到关系数据库
(4)由关系数据库到对象关系数据库、面问对象数据库
(5)由多种多样的数据库到多数据库开放式互连
(6)由普通数据库到与各种先进技术结合所形成的新型数据库
第2讲模拟练习题
数据库系统的数据独立性是指不会因为系统数据存储结构与数据逻辑结构的变化而影响应用程序。
概念模式到内模式的映像实现了数据的物理独立性
外模式到概念模式的映像实现了数据的逻辑独立性
别名一览表:
External Schema | Conceptual Schema | Internal Schema |
---|---|---|
用户模式、局部模式、外模式 | 概念模式、全局模式、逻辑模式 | 存储模式、内模式、物理模式 |
视图默认指用户视图。 | 模式默认指概念模式。 |
第3讲-关系模型之基本概念
300-本讲学习什么(44秒)及第3讲教学课件PDF
301-什么是关系模型(10分50秒)
关系模型
- 最早由E.F.Codd在1970年提出
- 是从表(Table)及表的处理方式中抽象出来的,是在对传统表及其操作进行数学化严格定义基础上,引入集合理论与逻辑学理论提出的
- 是数据库的三大经典数据模型之一,也是现在大多数商品化数据库系统所仍然使用的数据模型
- 标准的数据库语言(SQL语言)是建立在关系模型基础之上的,数据库领域的众多理论也都是建立在关系模型基础之上的
关系运算:关系代数和关系演算;关系演算:元组演算和域演算。
关系代数示例:基于集合的运算
即:操作的对象及结果都是集合,是一次一集合(Set-at-a-time)的操作。而非关系型的数据操作通常是一次一记录(Record-at-a-time)的操作
元组演算示例:基于逻辑的运算
域演算示例:基于示例的运算
302-什么是关系(13分26秒)
为什么把“表”称为关系?
怎样严格定义一个“表”?
“表”和“关系”有什么异同?
标题/模式:对应于定义 Table 的 SQL 语句
在关系模型中,域名是指关系中的每一列的数据类型,即此列中的数据的取值范围。例如,在一个名为“学生”的关系中,可能会有一个字段(域名)叫做“学生姓名”,其域可能是字符串类型;另一个字段叫做“学生年龄”,其域可能是整数类型。
而属性名则是指关系中各个字段的名称,即每一列的标题。继续以“学生”关系为例,其中可能包含“学生姓名”和“学生年龄”两个属性,分别对应关系中的两列数据。
总结来说,域名指的是数据类型,即数据的取值范围,而属性名则指的是字段的名称,即列的标题。在关系数据库设计中,域名和属性名是设计关系模型时需要考虑的两个重要因素。
关系模式 R(A1:D1, A2:D2, ... ,An:Dn) 中属性向域的映象在很多 DBMS 中一般直接说明为属性的类型、长度等。例如:Student(S# char(8), Sname char(10), Ssex char(2), Sage integer,D# char(2), Sclass char(6));
303-关系有什么特性(7分12秒)
特性:
1、列是同质的:即每一列中的分量来自同一域,是同一类型的数据
2、不同的列可来自同一个域,称其中的每一列为一个属性,不同的属性要给予不同的属性名。
3、列位置互换性、行位置互换性
4、关系的任何两个元组不能完全相同
5、属性不可再分
304-候选码与外码(10分16秒)
有时,关系中有很多组候选码,例如:
学生(S#,Sname,Sage,Sclass,Saddress)
其中属性S#是候选码,属性组(Sname,Saddress)也是候选码(同名同地址的两个同学是不存在的
再如:
Employee(EmplD, EmpName, Mobile)
每一雇员有唯一的 EmpID,没有两个雇员有相同的手机号 Mobile ,则EmplD是候选码,Mobile也是候选码
305-关系模型的完整性(7分50秒)
空值的含义
空值:不知道、不存在或无意义的值;
在进行关系操作时,有时关系中的某属性值在当前是填不上的,比如档案中有“生日不详”、“下落不明”、“日程尚待公布”等,这时就需要空值来代表这种情况。关系模型中用“?表征
数据库中有了空值,会影响许多方面,如影响聚集函数运算的正确性,不能参与算术、比较或逻辑运算等
例如:"3+?"
结果是多少呢?"3*?"
结果是多少呢?"? and (A=A)
结果又是多少呢?
再例如,一个班有30名同学,如所有同学都有成绩,则可求出平均成绩;如果有一个同学没有成绩,怎样参与平均成绩的计算呢,是当作0,还是当作100呢?还是不考虑他呢?
有空值的时候是需要特殊处理的,要特别注意。
DBMS对关系完整性的支持
实体完整性和参照完整性由DBMS系统自动支持
DBMS系统通常提供了如下机制:
(1)它使用户可以自行定义有关的完整性约束条件;
(2)当有更新操作发生时,DBMS将自动按照完整性约束条件检验更新操作的正确性,即是否符合用户自定义的完整性
第3讲模拟练习题
概念理解题目:
1某关系R的外键是指其它关系的候选键,可以是R中的主属性或非主属性
2关系模型中,下列关于候选键说法正确的是可由其值能惟一标识该关系中任何元组的一个或多个属性组成
关系是以内容(名字或值)来区分的
区分哪一列是靠列名
区分哪一行是靠某一或某几列的值
21关于“关系”的说法,正确的是关系是一个由行与列组成的、能够表达数据及数据之间联系的二维表。
25参照完整性规则是指表的外键必须是另一个表主键的有效值,或者是空值。
第4讲关系模型之关系代数(基于集合)
400-本讲学习什么(1分13秒)及第4讲教学课件PDF
401-什么是关系代数(5分40秒)
402-并相容性的概念(2分03秒)
403-并操作(3分38秒)
404-差操作(3分17秒)
405-广义积操作(5分29秒)
广义积操作(语义的)
当一个检索涉及多个表时(如学生表和课程表),便需要将这些表串接或拼接起来,然后才能检索,这时,就要使用广义笛卡尔积运算。
广义积操作是后面学习各种连接运算的基础。
406-选择操作(9分52秒)
407-投影操作及基本操作小结(6分27秒)
408-交操作(3分54秒)
409-theta连接操作及更名操作(12分09秒)
410-自然连接操作(6分59秒)
411-应用关系代数操作训练(14分48秒)
412-除操作(16分24秒)
413-外连接操作(8分53秒)
第4讲模拟练习题
3自然连接是构成新关系的有效方法。一般情况下,当对关系R和S使用自然连接时,要求R和S含有一个或多个共有的属性
7关系R与关系S只有一个公共属性,T1是R与S做θ连接的结果,T2是R与S自然连接的结果,则下列说法正确的是T1的属性个数大于T2的属性个数
第5讲 关系模型之关系演算 (基于逻辑)
500-本讲学习什么(1分47秒)及第5讲教学课件PDF
501-什么是关系元组演算(6分44秒)
其中 是比较运算符
502-简单运用元组演算公式(9分17秒)
(1)元组演算公式之原子公式
(2)元组演算公式之与、或、非运算符
(3)注意运算符之次序及语义正确性
503-存在量词与全称量词(17分17秒)
元组变量t前有存在量词或全称量词,则该变量被称为“约束变量”,否则被称为“自由变量”。
战老师认为这两个公式含义有所不同。
504-等价变换(8分40秒)
注意:判断未学过某门课程需要遍历所有相关的课程
505-四个典型示例(12分39秒)
506-用元组演算实现关系代数操作(4分35秒)
507-什么是域演算(7分58秒)
508-什么是按示例查询-QBE(12分54秒)
QBE:Query By Example
509-QBE应用训练(10分52秒)
510-关系演算的安全性(7分06秒)
511-三种关系运算之比较(6分21秒)
数据库语言可以基于这三种抽象运算来设计
- 用“键盘符号”来替换抽象的数学符号
- 用易于理解的符号组合来表达抽象的数学符号
第5讲模拟练习题
安全的元组演算公式和安全的域演算公式可以等价变换。
第6讲-SQL语言之概述
600-本讲学习什么(2分38秒)及第6讲教学课件PDF
601-SQL语言概述(8分31秒)
602-利用SQL建立数据库(16分44秒)
603-利用SQL进行基本查询(13分55秒)
当要查询既学过001课程又学过002课程的学生的学号时,我们可以使用SQL的交集操作来实现。下面是相应的SQL语句:
SELECT student_id
FROM course_enrollment
WHERE course_id = '001'
INTERSECT
SELECT student_id
FROM course_enrollment
WHERE course_id = '002';
这段SQL语句的含义是,首先从包含课程选课信息的表course_enrollment中选择学过001课程的学生的学号,然后取这部分学生和学过002课程的学生的学号做交集操作,最终得到既学过001课程又学过002课程的学生的学号集合。
SQL 通配符
通配符可用于替代字符串中的任何其他字符。
在 SQL 中,通配符与 SQL LIKE 操作符一起使用。
SQL 通配符用于搜索表中的数据。
在 SQL 中,可使用以下通配符:
通配符 | 描述 |
---|---|
% | 替代 0 个或多个字符 |
_ | 替代一个字符 |
[charlist] | 字符列中的任何单一字符 |
[^charlist] 或 [!charlist] | 不在字符列中的任何单一字符 |
MySQL 中使用 REGEXP 或 NOT REGEXP 运算符 (或 RLIKE 和 NOT RLIKE) 来操作正则表达式。 |
下面的 SQL 语句选取 name 以 "G"、"F" 或 "s" 开始的所有网站:
SELECT * FROM Websites
WHERE name REGEXP '^[GFs]';
604-利用SQL进行多表联合查询(14分11秒)
要查询没学过李明老师课程的所有学生的学号,我们可以使用SQL的差集操作来实现。下面是相应的SQL语句:
SELECT student_id
FROM all_students
EXCEPT
SELECT student_id
FROM course_enrollment
WHERE teacher_name = '李明';
这段SQL语句的含义是,首先从包含所有学生信息的表all_students中选择所有学生的学号,然后从课程选课信息表course_enrollment中选择学过李明老师课程的学生的学号,最后取这两部分学生的学号集合做差集操作,得到所有没学过李明老师课程的学生的学号集合。
605-结合SELECT的INSERT语句(7分35秒)
元组新增Insert:新增一个或一些元组到数据库的Table中
元组更新Update:对某些元组中的某些属性值进行重新设定
元组删除Delete:删除某些元组
SOL-DML既能单一记录操作,也能对记录集合进行批更新操作
SQL-DML之更新操作需要利用前面介绍的子查询(Subquery)的概念,以便处理“一些”、“某些”等。
606-结合SELECT的DELETE与UPDATE语句(7分20秒)
607-数据库定义的修正与撤销(4分55秒)
撤消数据库
drop database 数据库名;
示例:撤消SCT数据库
Drop database SCT;
有些DBMS提供了操作多个数据库的能力,此时在进行数据库操作时需要指定待操作数据库与关闭数据库的功能
指定当前数据库
use 数据库名;
关闭当前数据库
close 数据库名;
第6讲模拟练习题
易错点:
字符串型属性值需要加引号
“%”匹配零个或多个字符,所以不仅能匹配“张某某”也能匹配“张”和“张某”
7有关系表SC ( S# , C#, Score),求既学过“001”号课又学过 “002”号课的所有学生的学号,下列SQL语句正确的是Select S1.S# From SC S1, SC S2 Where S1.S# = S2.S# and S1.C#=‘001’ and S2.C#=‘002 ;
。
17已知关系S(S#,SN,AGE,SEX),SC(C#,S#,GRADE),C(C#,CN,TEACHER)。若要检索学生姓名及其选修课程的课程号和成绩,正确的SELECT语句是SELECT S.SN,SC.C#,SC.GRADE FROM S,SC WHERE S.S#=SC.S#
。 (注意:这里要明确指出连接操作)
学得不好的点:
11学生关系S(S#,Sname,Ssex,Sage,D#,Sclass),S的属性分别表示学生的学号、姓名、性别、年龄。要在表S中删除一个属性“年龄”,可选用的SQL语句是ALTER TABLE S DROP Sage
。
15查询结果输出时要求按“总评成绩”降序排列,相同者按“性别”升序,正确的子句是ORDER BY 总评成绩 DESC,性别
。
第7讲-SQL语言之复杂查询与视图
700-本讲学习什么(1分25秒)及第7讲教学课件PDF
701-IN子查询(11分47秒)
702-ThetaSome子查询(12分53秒)
为什么不用 Theta-any?
在SQL标准中,也有 Theta-any 谓词,但由于其语义的模糊性:any,“任一”是指所有呢?还是指某一个?不清楚,所以被 Theta-some 替代以求更明晰。
703-Exists子查询(11分48秒)
当在 SQL 中使用 IN 和 EXISTS 时,它们的主要区别在于它们的执行方式和用途。IN 子查询会将结果集与主查询进行比较,而 EXISTS 子查询只需检查子查询是否返回任何行即可。
下面是一个简单的示例来展示 IN 和 EXISTS 的区别:
使用 IN:
SELECT * FROM table1 WHERE column1 IN (SELECT column2 FROM table2);
使用 EXISTS:
SELECT * FROM table1 t1 WHERE EXISTS (SELECT 1 FROM table2 t2 WHERE t1.column1 = t2.column2);
关于 IN 和 EXISTS 的更多详细信息,请参考以下链接:
子查询表小的用in,子查询表大的用exists。
从原理浅析MySQL中exists和in的区别(如何选用exists和in)
但执行过程的区别在于:
exists子句会对外表(即t1)用loop逐条记录查询,每次查询都会查看exists中的select语句,如果select子句返回记录行(无论返回记录行是多少,只要能返回),exists就会返回true,则外表中的当前记录就会被检索出来;如果select子句没有返回记录行,exists就会返回false,则外表中的当前记录就会被丢弃。——exist子句循环每次取出外表中的一条记录用来执行exists中的语句查内表,是先查外表,再查内表(相关子查询)。
in查询相当于多个or条件的叠加。in子句需要先将子查询的记录全部查出来。注意in子句中的子查询返回的结果集必须只有一个字段。假设子查询返回的结果集有m条记录,在进行m次查询。——in子句是先执行in中的子句查出来内表的结果,然后外表针对内表查出来的结果一个个遍历匹配。即先查内表,再查外表(不相关子查询)。
基于以上的认识:
exists只有内表可以用上索引,外层循环必须要走一个遍历过程;而in内表和外表都可以用上索引,因为in本质上属于多个条件查询的并集(or)。
如何选用exists和in?
当两个表的大小相当时,用exists和in的效率差别不大。
如果两个表一个大一个小,则子查询表(即内表)大的用exists,子查询表(即内表)小的用in。 其实就是”小表驱动大表“的思想:用exist时外表是驱动表,用in时内表是驱动表。
MySQL的外连接就利用了”小表驱动大表“的思想做自动优化,因此有时候会发现LEFT JOIN左侧的不是驱动表而是被驱动表,其实就是MySQL优化器的功能。同理,内连接也有类似的情况。
704-结果计算与聚集计算(6分57秒)
705-分组聚集计算与分组过滤(10分38秒)
GROUP BY 语句用于结合聚合函数,根据一个或多个列对结果集进行分组。
SQL GROUP BY 语法:
SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name;
在 SQL 中增加 HAVING 子句原因是,WHERE 关键字无法与聚合函数一起使用。
HAVING 子句可以让我们筛选分组后的各组数据。
SQL HAVING 语法:
SELECT column1, aggregate_function(column2) FROM table_name GROUP BY column1 HAVING condition;
参数说明:
column1
:要检索的列。aggregate_function(column2)
:一个聚合函数,例如SUM、COUNT、AVG等,应用于column2
的值。table_name
:要从中检索数据的表。GROUP BY column1
:根据column1
列的值对数据进行分组。HAVING condition
:一个条件,用于筛选分组的结果。只有满足条件的分组会包含在结果集中。
706-用SQL表达并交差操作(7分20秒)
UNION运算符是Entry-SQL92的一部分
INTERSECT、EXCEPT运算符是Full-SQL92的一部分
它们都是Core-SQL99的一部分,但有些DBMS并不支持这些运算,使用时要注意
707-用SQL处理空值(3分53秒)
空值是其值不知道、不确定、不存在的值
数据库中有了空值,会影响许多方面,如影响聚集函数运算的正确性,不能参与算术、比较或逻辑运算等
例如:右下图所示表SC,如果有某一记录为空值,则求001号课程的平均成绩?会是多少呢?
以前,很多DBMS将空值按默认值处理,如字符串类型则以空格来表示,而如数值类型则以0来表示,这也将会引起统计、计算上的不正确性。
708-用SQL表达连接与外连接操作(5分35秒)
709-SQL-SELECT小结(4分28秒)
面向对象/对象关系数据库的查询SQL→OQL
基本的SQL:另一SELECT-FROM-WHERE只能出现在WHERE子句;
新标准:引入对象概念,可以在能使用聚集(collection)的任何位置使用SELECT-FROM-WEHRE
FROM子句中使用
SELECT子句中使用
Where子句中使用
注意:本课程要求基本的 SQL
710-SQL视图(14分17秒)
SQL数据库结构
- 基本表是实际存储于存储文件中的表,基本表中的数据是需要存储的
- 视图在SQL中只存储其由基本表导出视图所需要的公式,即由基本表产生视图的映像信息,不存储其数据,而是在运行过程中动态产生与维护
- 对视图数据的更改最终要反映在对基本表的更改上
可更新的视图是指可以对其进行插入、更新、删除操作的视图,这种视图通常基于单一表或多个表的简单查询结果构建而成,例如只包含一张表或者包含多张表但是通过 join 操作将其连接在一起的视图。在对可更新的视图进行操作时,系统会自动反映到视图所基于的表上。
不可更新的视图是指不能对其进行插入、更新、删除操作的视图,这种视图通常基于复杂的查询结果或包含特定计算、聚合、分组等操作的结果。例如,包含 group by 子句、distinct 子句、计算列、集合运算等的视图通常是不可更新的。在对不可更新的视图进行操作时,系统会提示更新失败或抛出错误信息。
总的来说,可更新的视图一般是简单的、基于单表或多表的连接查询,而不可更新的视图一般是复杂的、包含特定操作或计算结果的查询。
已经定义的视图也可以撤消
撤消视图
Drop View Viewname
当某一视图删除后,由该视图导出的其它视图也将自动删除
不仅视图可以撤消,基本表、数据库等都可以撤消
撤消基本表
Drop Table 表名
第7讲模拟练习题
这个问题需要理解SQL中的集合运算符(如EXCEPT,UNION,INTERSECT)的工作方式。下面是对四个选项的解释:
“子查询1 Except 子查询2”返回在子查询1中出现但不在子查询2中出现的元组。
“子查询1 Union 子查询2”返回在子查询1和子查询2中出现的所有元组,但重复的元组只会出现一次。
“子查询1 Except ALL 子查询2”返回在子查询1中出现但不在子查询2中出现的元组,但是这个运算会考虑重复的元组。
“子查询1 Intersect 子查询2”返回同时在子查询1和子查询2中出现的元组。
31假设一个元组在子查询1中出现m次,在子查询2中出现n次,其中m>0,n>0, 则下列说法正确的是____ ____。
-
A.该元组在“子查询1 Except 子查询2”中出现0次;
-
B.该元组在“子查询1 Union 子查询2”中出现m + n次;
-
C.该元组在 “子查询1 Except ALL 子查询2”中出现m – n次;
-
D.该元组在“子查询1 Intersect 子查询2”中出现min(m,n)次;
正确答案:A你错选为D
A.(正确答案)解析:Except是集合操作,出现0次
B.(错误答案)解析:此选项不正确。Union是集合操作,需去掉重复的元组
C.(错误答案)解析:此选项不正确。ExceptALL是包的操作,但应出现max(0,m-n)
D.(错误答案)解析:此选项不正确。Intersect是集合运算,只能出现一次。
32假设一个元组在子查询1中出现m次,在子查询2中出现n次,其中m>0,n>0,则下列说法正确的是_________。
-
A.该元组在“子查询1 Union ALL 子查询2”中出现m + n次;
-
B.该元组在 “子查询1 Union 子查询2”中出现m+n次;
-
C.该元组在“子查询1 Union ALL 子查询2”中出现1次;
-
D.该元组在 “子查询1 Union 子查询2”中出现min(m,n)次;
正确答案:A你选对了
A.(正确答案)解析:此选项正确。UnionALL是包的操作,应出现m+n次
B.(错误答案)解析:此选项不正确。Union是集合的操作,应去掉重复的元组
C.(错误答案)解析:此选项不正确。UnionALL是包的操作,不应去掉重复的元组
D.(错误答案)解析:此选项不正确。Union是集合的操作,只能出现一次
33假设一个元组在子查询1中出现m次,在子查询2中出现n次,其中m>0,n>0,则下列说法正确的是_________。
-
A.该元组在“子查询1 Except 子查询2”中出现0次;
-
B.该元组在“子查询1 Union 子查询2”中出现m + n次;
-
C.该元组在 “子查询1 Except All 子查询2”中出现m – n次;
-
D.该元组在“子查询1 Union All 子查询2”中出现max(m,n)次;
正确答案:A你错选为B
A.(正确答案)解析:此选项正确
B.(错误答案)解析:此选项不正确。Union是集合操作,只能出现一次
C.(错误答案)解析:此选项不正确。ExceptALL是包的操作,可出现max(0, m-n)
次
D.(错误答案)解析:此选项不正确。UnionALL是包操作,出现m+n次。
40有一个学生表student,包含主键S#(学生编号)等。又有分数表SC,包含S#(学生编号)、score(分数)等。已知student表中共有50个学生,有45人参加了考试(分数存在SC表中),其中10人不及格。执行以下SQL语句:select * from student where exists (select S# from SC where score<60 ), 可返回多少条记录?
A.(正确答案)解析:此选项正确。因为这是非相关子查询,而且子查询始终为真(因为已 知有10人不及格),故检索出的是Student表中的所有记录
该SQL语句的结构使用了子查询和EXISTS关键字,这是一个半连接查询。它的意义是:如果子查询(select S# from SC where score<60)返回的结果集不为空,那么主查询就会执行。这里的子查询是查找SC表中分数小于60的学生编号,根据题目,有10名学生不及格,所以子查询的结果集肯定不为空。
然而,这个SQL语句的问题是,子查询并未与主查询产生直接的关联。即,主查询并不会因为子查询返回的S#而过滤结果。当EXISTS子查询返回真(即,存在至少一个满足条件的记录时),主查询就会返回所有记录。
所以,执行这个SQL语句将返回student表中所有的记录,即返回50条记录。
第8讲-SQL语言与数据库完整性和安全性
800-本讲学习什么(1分04秒)及第8讲教学课件PDF
801-数据库完整性概念及完整性约束规则(8分59秒)
为什么会引发数据库完整性的问题呢?
- 不正当的数据库操作,如输入错误、操作失误、程序处理失误等
数据库完整性管理的作用
- 防止和避免数据库中不合理数据的出现
- DBMS应尽可能地自动防止DB中语义不合理现象
- 如DBMS不能自动防止,则需要应用程序员和用户在进行数据库操作时处处加以小心,每写一条SQL语句都要考虑是否符合语义完整性,这种工作负担是非常沉重的,因此应尽可能多地让DBMS来承担
802-数据库完整性分类(4分16秒)
一、按约束对象分类
域完整性约束条件:施加于某一列上,对给定列上所要更新的某一候选值是否可以接受进行约束条件判断,这是孤立进行的
关系完整性约束条件:施加于关系/table上,对给定table上所要更新的某一候选元组是否可以接受进行约束条件判断,或是对一个关系中的若干元组和另一个关系中的若干元组间的联系是否可以接受进行约束条件判断
二、按约束来源分类
结构约束:来自模型的约束,例如函数依赖约束、主键约束(实体完整性)、外键约束(参照完整性),只关心数值相等与否、是否允许空值等;
内容约束:来自用户的约束,如用户自定义完整性,关心元组或属性的取值范围。例如Student表的Sage属性值在15岁至40岁之间等
三、按约束状态分类
静态约束:要求DB在任一时候均应满足的约束;例如Sage在任何时候都应满足大于0而小于150(假定人活最大年龄是150)。
动态约束:要求DB从一状态变为另一状态时应满足的约束;例如工资只能升,不能降:工资可以是800元,也可以是1000元;可以从800元更改为1000元,但不能从1000元更改为800元
803-SQL表完整性与列完整性(21分11秒)
check中的条件可以是Select-From-Where内任何Where后的语句,包含子查询。
804-SQL的断言及其应用(4分50秒)
805-SQL的触发器的概念(6分34秒)
806-触发器应用示例之一(7分32秒)
807-触发器应用示例之二(5分29秒)
808-第8讲回顾本讲学习了什么-完整性回顾(1分51秒)
809-数据库安全性的概念(6分06秒)
DBA的责任和义务
- 熟悉相关的法规、政策,协助组织的决策者制定好相关的安全策略
- 规划好安全控制保障措施,例如,系统安全级别、不同级别上的安全控制措施,对安全遭破坏的响应,
- 划分好数据的安全级别以及用户的安全级别
- 实施安全性控制:DBMS专门提供一个DBA账户,该账户是一个超级用户或称系统用户。DBA利用该账户的特权可以进行用户账户的创建以及权限授予和撤消、安全级别控制调整等
810-自主安全性机制(10分55秒)
自主安全性机制
- 通常情况下,自主安全性是通过授权机制来实现的。
- 用户在使用数据库前必须由DBA处获得一个账户,并由DBA授予该账户一定的权限,该账户的用户依据其所拥有的权限对数据库进行操作;同时,该帐户用户也可将其所拥有的权利转授给其他的用户(账户),由此实现权限在用户之间的传播和控制。
授权者:决定用户权利的人
授权:授予用户访问的权利
811-两种自主安全性控制(5分22秒)
812-SQL安全性控制(6分44秒)
授予视图访问的权利,并不意味着授予基本表访问的权利(两个级别:基本关系级别和视图级别)
授权者授予的权利必须是授权者已经拥有的权利
813-自主安全性控制的问题(3分56秒)
814-强制安全性机制(4分51秒)
DBMS引入强制安全性机制,可以通过扩展关系模式来实现
关系模式: R(A1: D1, A2: D2, ..., An:Dn)
对属性和元组引入安全性分级特性或称分类特性
R(A1: D1, C1, A2: D2, C2..., An:Dn, Cn, TC)
其中 C1,C2,..,Cn分别为属性D1,D2,..,Dn的安全分类特性; TC为元组的分类特性
这样,关系中的每个元组,都将扩展为带有安全分级的元组
强制安全性机制使得关系形成为多级关系(不同级别用户所能看到的关系的子集),也出现多重实例、多级关系完整性等许多新的问题或新的处理技巧,在使用中需注意仔细研究。
815-第8讲回顾本讲学习了什么-安全性回顾(1分56秒)
第8讲模拟练习题
在数据库的安全性控制中,授权的数据对象的范围越小,授权子系统就越灵活。
第9讲-嵌入式SQL语言之基本技巧
900-本讲学习什么(1分47秒)及第9讲教学课件PDF
901-什么是嵌入式SQL语言(10分20秒)
因此,高级语言+SQL语言:
既继承高级语言的过程控制性又结合SQL语言的复杂结果集操作的非过程性,同时又为数据库操作者提供安全可靠的操作方式:通过应用程序进行操作。
嵌入式SQL语言:
将SQL语言嵌入到某一种高级语言中使用。
这种高级语言,如C/C++,Java,PowerBuilder等,又称宿主语言(Host Language)
嵌入在宿主语言中的SQL与前面介绍的交互式SQL有一些不同的操作方式
902-程序与数据库连接(6分35秒)
903-为什么需要提交和撤销(7分54秒)
904-嵌入式SQL程序的一个示例(5分50秒)
905-为什么需要游标(5分41秒)
游标是指向某检索记录集的指针
通过这个指针的移动,每次读一行,处理一行,再读一行...,直至处理完毕
游标(Cursor)的使用需要先定义、再打开(执行)、接着一条接一条处理,最后再关闭
906-游标应用示例(9分13秒)
907-可滚动游标(4分22秒)
可滚动游标移动时需判断是否到结束位置,或到起始位置
- 可通过判断是否到EOF位置(最后一条记录的后面),或BOF位置(起始记录的前面)
- 如果不需区分,可通过whenever not found语句设置来检测
908-利用游标进行数据库增删改(3分32秒)
909-利用游标编写的一个程序(3分42秒)
910-异常状态捕获机制(14分26秒)
第9讲模拟练习题
21执行下面的程序:
int main()
{
exec sql whenever sqlerror goto handle_error;
exec sql create table customers(cid char(4) not null, cname varchar(13), …);
…
handle_error:
exec sql drop customers;
exec sql disconnect;
fprintf(stderr,”could not create customers table\n”);
return -1;
}
如果customers表在执行过程中出现了问题,没有人为干预,则该程序“Exec sql drop customers;”语句将被执行的次数为无限。
解析:如果customers表在执行过程中出现问题,程序将跳转到handle_error标签并执行其中的代码。在handle_error标签中,程序会执行"exec sql drop customers"语句,然后再次跳转回handle_error标签。这样会导致无限循环执行该语句,因为每次执行后仍然会出现问题导致再次跳转到handle_error标签。所以,“exec sql drop customers;”语句将被执行的次数为无限次。
附录 C With MySQL
当使用C语言和MySQL进行联合处理时,通常会使用MySQL提供的C API(MySQL C API)来与数据库进行交互。通过这个API,可以在C语言中执行查询、获取结果集、插入记录等操作。
下面是一个简单的示例代码,演示如何使用C语言和MySQL进行联合处理:
#include <stdio.h>
#include <mysql/mysql.h>
int main() {
MYSQL *conn;
MYSQL_RES *res;
MYSQL_ROW row;
conn = mysql_init(NULL);
if (conn == NULL) {
fprintf(stderr, "mysql_init() failed\n");
return 1;
}
if (mysql_real_connect(conn, "localhost", "user", "password", "database", 0, NULL, 0) == NULL) {
fprintf(stderr, "mysql_real_connect() failed\n");
mysql_close(conn);
return 1;
}
if (mysql_query(conn, "SELECT * FROM table")) {
fprintf(stderr, "mysql_query() failed\n");
mysql_close(conn);
return 1;
}
res = mysql_store_result(conn);
if (res == NULL) {
fprintf(stderr, "mysql_store_result() failed\n");
mysql_close(conn);
return 1;
}
while ((row = mysql_fetch_row(res))) {
printf("%s\n", row[0]);
}
mysql_free_result(res);
mysql_close(conn);
return 0;
}
在上面的代码中,我们首先初始化了一个MySQL连接,然后连接到指定的数据库,执行了一个SELECT查询,并打印查询结果中的第一列数据。
关于MySQL C API的更多信息和文档,你可以参考MySQL官方网站:https://dev.mysql.com/doc/c-api/en/。
第10讲-嵌入式SQL语言之动态SQL
A00-本讲学习什么(1分15秒)及第10讲教学课件PDF
A01-动态SQL的概念和作用(7分37秒)
A02-动态SQL构造示例之一(15分41秒)
A03-动态SQL构造示例之二(16分17秒)
A04-动态SQL的两种执行方式(5分44秒)
A05-数据字典及其作用(14分05秒)
模式的含义是指某一用户所设计和使用的表、索引及其他与数据库有关的对象的集 合,因此表的完整名应是:模式名.表名。这样做可允许不同用户使用相同的表名,而 不混淆。
一般而言,一个用户有一个模式。可以使用 Create schema 语句来创建模式(用法 略,参见相关文献),在 Create Table 等语句可以使用所定义的模式名称。
A06-SQLDA与数据字典的应用(5分33秒)
A07-什么是ODBC(10分21秒)
A08-什么是JDBC(9分31秒)
JDBC是什么?
JDBC:Java DataBase Connection
JDBC是一组Java版的应用程序接口API,提供了Java应用程序与数据库服务器的连接和通讯能力。
JDBC API
JDBC API分成两个程序包:
1、Java.sql 核心API--J2SE (Java2标准版)的一部分。使用java.sql.DriverManager类、java.sgl.Driver和Java.sql.connection接口连接到数据库
2、Javax.sql可选扩展API--J2EE(Java2企业版)的一部分。包含了基于JNDI(Java Naming and Directory Interface,Java命名和目录接口)的资源,以及管理连接池、分布式事务等,使用Datasource接口连接到数据库。
A09-ODBC-JDBC-嵌入式之比较(10分22秒)
第10讲模拟练习题
5、应用程序使用JDBC API访问数据库的具体实施过程有4步:
(3) 传递一个Driver给DriverManager,加载数据库驱动;
(1) 通过URL得到一个Connection对象, 建立数据库连接;
(2) 创建一个Statement对象(PreparedStatement或CallableStatement),用来查询或者修改数据库;
(4) 执行查询并返回一个ResultSet,提取数据到应用程序。
9、SQLCA和SQLDA是嵌入在C语言中的SQL语言经常使用的两种数据结构。关于SQLCA和SQLDA,下列说法正确的是_________。
SQLCA是SQL通讯区,记录着SQL语句被DBMS执行后返回的状态信息;SQLDA是SQL描述区,记录着数据库/表等对象的定义信息。
10、应用程序通过ODBC连接一个数据库服务器的基本步骤如下:
(2) SQLAllocConnect(env, &conn);
(1) SQLConnect(conn, "aura.bell-labs.com", SQL_NTS, "avi", SQL_NTS, avipasswd", SQL_NTS);
(3) { …. Do actual work … }
(4) SQLDisconnect(conn);SQLFreeConnect(conn);SQLFreeEnv(env);
11、关于嵌入式SQL语言的思维模式,说法正确的是_________。
建立数据库连接->声明一个游标(游标与SQL语句绑定)->打开游标(执行SQL语句)->循环地获取一条一条记录(属性与高级语言变量绑定)->关闭游标->可循环地再打开到关闭游标->断开数据库连接。
12、关于下面的思维模式,“建立数据库连接->请求分配语句句柄(申请内存空间)->用句柄执行SQL(句柄与SQL语句绑定)->建立高级语言变量与句柄属性的对应->循环地获取一条一条记录->释放语句句柄->断开数据库连接”。这是关于ODBC的思维模式。
13、关于下面的思维模式,“建立数据库连接->创建语句对象(申请内存空间)->用语句对象执行SQL(语句对象与SQL语句绑定)->返回结果对象->循环地从结果对象获取一条一条记录并提取对象的属性值传给高级语言变量->释放语句对象->断开数据库连接”。这是关于JDBC的思维模式。
14、SQL语句执行后,需要将结果记录集中的属性值,读到高级语言的变量中,那什么时候建立高级语言变量与属性的绑定,下列说法都正确。
嵌入式SQL语言:在一条一条地读取记录时(Fetch)建立绑定。
ODBC:在开始一条一条地读取记录之前用专门的语句建立绑定。
JDBC:一条一条记录的,边绑定,边读取相应的属性值。
16、一段构造SQL语句的程序代码如下:
char *dcid, *acid, *ecid;
dcid = “001”; ecid= “002”; acid= “003”;
strcpy(sqltext, “SELECT * from Student where s# =”);
strcpy(sqltext,“: dcid”);
… …
exec sql whenever not found goto no_such_s#;
exec sql prepare ecid from :sqltext;
exec sql execute ecid using :acid;
exec sql commit work; continue;
no_such_s#: printf("No such student in table Student\n");
continue;
问:当该段程序执行“exec sql execute ecid using :acid;”语句时,其执行的查询是_______。
-
A.检索001号同学的信息
-
B.检索002号同学的信息
-
C.检索003号同学的信息
-
D.其他都不是
正确答案:C你错选为A
正确答案:C。解析:真正传给动态SOL语句的变量是acid,即检索003号同学的信息
第1讲(总第11讲)数据建模:思想与方法(暨数据库设计之抽象与表达方法)
1100-本讲学习什么(4分33秒)及第11讲教学课件
“数据建模与数据库设计”内容学习的目标?
- 理解数据建模与数据库设计
- 扎实地理解并掌握E-R模型/IDEF1X模型:数据建模与数据库设计的重要工具
能够绘制E-R图/IDEF1X图而且绘制得正确
- 能够用E-R/IDEF1X模型准确理解现实世界并进行数据库设计
理解现实世界并进行抽象的能力,理解并抽象得正确
- 能够分析数据库设计的正确性
1101-为什么要数据建模与数据库设计(5分21秒)
需求的理解,简单来讲,包括数据需求的理解和处理规则需求的理解.....
1102-数据模型与概念模型的概念(4分44秒)
1103-关于抽象的八个字(2分10秒)
1104-什么是E-R模型(2分21秒)
1105-实体与实例(6分48秒)
1106-联系与联系的元数(4分39秒)
参与发生联系的实体的数目,称为联系的度或元
联系有一元联系、二元联系和多元联系
联系是需要存储和处理的
实体是相对稳定的,但是联系是多样化的
一元联系:同一个实体中的实例之间的联系
1107-联系与联系的基数(6分29秒)
联系的基数(Cardinalities):实体实例之间的联系的数量,即一个实体的实例通过一个联系能与另一实体中相关联的实例的数目
常见的映射基数如上,有一对一的(1:1),一对多的(1:m),多对多的(m:n)几种情况
1108-Chen方法表达E-R模型(12分49秒)
1109-Chen方法建模案例-物资管理系统数据建模(8分20秒)
Step1理解需求,寻找实体
E-R图建模首先要找出问题领域的实体,即找出有哪些类/实体
能够用一个个、一件件、一串串等重叠量词形容的,而不是一个、一件...
要覆盖需求涉及的可独立管理的每一类事物
Step2用属性刻画每一个实体,至少要给出一个重要属性
Step3确定每一个实体的关键字/码,关键字属性是必须要标记清晰的
Step4数据建模的重点是分析实体之间的联系
Step5检查是否覆盖了需求
1110-Crow's Foot方法表达E-R模型(8分40秒)
联系:菱形框表示,也可以将菱形框省略而直接以联系名来替代
1111-Crow's Foot方法建模案例-物资管理系统数据建模(4分55秒)
1112-型与值和三个世界(7分54秒)
信息
- 信息是现实世界中事物在人们头脑中的一种反映
- 信息可以准确地反映现实世界中事物(描述)
- 也可以通过对现实进行抽象,形成信息(抽象)
数据库设计往往因为忽视了信息(之间联系)的细致分析而造成设计失误
数据库设计能力的高低往住体现在信息(及其联系)的正确分析上,体现在理解现实世界能力的高低
三个世界与多层(级)抽象
现实世界==>(描述、抽象为)信息世界==>(描述、抽象为)计算机世界
现实(客观存在)==>抽象/描述(概念/观念)==>计算机中(用计算机实现)
类似的概念:
- “型”(Type)与值(Value)
- ”模式(Schema)与“数据(Data)“
- “数据模型(DataModel)“与“模式(Schema)”
- ”模式(Schema)”与“实例(Instance)”
- “类(Class)”与”对象(Object)“
- ”实体(Entity)”与“实例(Instance)”
1113-数据模型与两种抽象层次(8分06秒)
数据模型
- 不同范围的人对现实世界中事物的描述和抽象可能是不同的
- 现实的抽象与描述需要遵循统一的数据模型:统一的概念与统一的表达方法
- 数据模型是一组相互关联且已严格定义的概态集合,是用于刻画或描述现实世界、信息世界或计算机世界的模型
- 用统一的模型建模也是计算机学科学生所无为擅长的能力
统一是为了信息交流、信息共享
1114-再看抽象层次(6分39秒)
建模的不同层次:模型与元模型,模型(型)与实例(值)
第1讲(总第11讲)模拟题
实体虽然是指一个个可相互区分的个体,但E-R图建模是要寻找这些个体的“型”,而非这些个体本身;
实体是可以用重叠量词来形容的,在问题域中不能用重叠量词形容的则不是实体;
联系是指一个实体的实例与另一个实体的实例之间可能存在的某种联系;
在发现联系的过程中重点是联系的基数的判定即一个实体实例能够和另外实体的多少个实例发生联系,因为这将影响数据库设计——如何处理联系。
参与发生联系的实体的数目,称为联系的度或元。联系有一元联系、二元联系和多元联系
模型是依据元模型中的抽象概念及其关系,对现实世界进行理解,获得具体概念及其具体关系所形成的;
元模型是对模型的抽象,而模型是对现实世界的抽象;
同一元模型,可以产生不同的模型;而同一现实世界,也可以产生不同的模型。
第12讲-数据建模:工程化方法及案例分析
1200-本讲学习什么(36秒)及第12讲教学课件
1201-什么是IDEF1X(3分21秒)
IDEF1x是将E-R模型扩充语义含义而形成的,或者说,IDEF1x是E-R图的细化。
IDEF1x是一种进行数据建模或数据库设计的工程化的方法
1202-独立实体和从属实体(10分24秒)
实体(Entity):一个“实体”表示一个现实和抽象事物的集合,这些事物必须具有相同的属性和特征。这个集合的一个元素就是该实体的一个实例。
实体被区分为独立实体和从属实体;在扩展E-R图中,独立实体又称强实体,从属实体又称弱实体。
独立实体:一个实体的实例都被唯一的标识而不决定于它与其他实体的联系
独立实体的关键字属性是自身拥有的属性
从属实体:一个实体的实例的唯一标识需要依赖于该实体与其他实体的联系
一些规则续:
- 每一个实体必须使用唯一的实体名,相同的含义总是用于同一实体名,相同的含义不能用于不同的实体名
- 一个实体可以有一个或多个属性,这些属性可以是其自身所具有的,也可以是通过一个联系而继承得到的
- 一个实体应有一个或多个能唯一标识实体每一个实例的属性,即应有一个主关键字及若干次关键字(0或多个)
- 任意实体都可与模型中任意其他的实体有任何联系
- 如果一个完全外来关键字是一个实体主关键字的全部或部分,那么该实体就是从属实体。相反,如果仅一部分或根本没有外来关键字属性用作一个实体的主关键字,那么,这个实体就是独立实体
关于属性的规则:工程化的要求
- 每个属性都必须有一个唯一的名称,且相同的名字必须总是描述相同的含义。因此相同的含义不可能对应于不同的名字(别名除外)
- 每个实体可以具有任意个属性,一个属性只能归属于一个实体,这一规则称下“单主规则
- 一个实体可有任意个继承属性,而每个继承属性都必须是某个相关的父亲实体或一般实体主关键字的一部分。
- 实体的每一个实例,对每一个属性都必须具有一个值。这一规则称为“非空规则
- 就同某实体相关的属性而言,该实体没有一个实例可能具有一个以上的值。这一规则称为“非重复规则
(5)关于属性和关键字
关于主关键字和次关键字的规则:工程化的要求
- 每个实体必须有一个主关键字,可有任意个次关键字
- 主关键字和次关键字可由单个或多个属性组成
- 个别属性可以是多个关键字的一部分
- 构成主关键字或次关键字的属性可以是实体自身所具有的或由某些联系继承得到的属性
- 主关键字和次关键字必须仅包含有助于唯一标识实体的那些属性。也就是说,如果主关键字或次关键字中去掉任一部分属性,那么都无法唯一确定实体的实例。此规则称“最小关键字规则“
- 如主关键字是由多个属性组成,那么每个非键属性的值必须完全函数依赖于主关键字,也就是,如果主关键字的一部分属性被确定了,那么非键属性的值无法唯一确定。此规则称“完全函数依赖规则”
- 每个非键属性必须是仅仅函数依赖于主关键字和次关键字,也就是,没有一个非键属性的值能够由其他非键属性的值所确定。此规则称“非传递依赖规则“
(6)关于外码-外来关键字
关于外来关键字的规则:工程化的要求
- 在确定连接联系或分类联系中的儿子实体或分类实体时必须包含一个外来关键字
- 一般实体的主关键字必须遗传为每一个分类实体的主关键字
- 存在一个联系,只能有一个外来关键字
- 被继承属性只能是主关键字所包含的属性
- 分配给继承属性的每一个作用名(Role Name)都必须是唯一的,同时同一含义必须应用于同一作用名
- 如果在某实体的任一给定实例中,对于两个外来关键字而言,单一遗传属性总是具有相同值,那么,该属性可以是多个外来关键字的部分
1203-标定联系和非标定联系(6分07秒)
联系(Relationship)是实体之间的一种连接关系
联系有连接联系、分类联系和不确定性联系
连接联系,又称父子联系或依存联系,又可进一步区分为标定联系和非标定联系
联系分类:
- 标定联系
- 非标定联系
- 分类联系
- 非确定联系
IDEF1X建模重点在联系的识别与处理
(4)一些规则
- 一个确定性连接联系总是存在于两个实体之间,一个作为父实体,另一个作为子实体
- 子实体的一个实例必须且总是恰好地与父实体的一个实例相联系
- 父实体一个实例可与子实体的0个、1个或多个实例相联系,具体情况由特定基数而定。在子实体端标注P(1或大于1)/Z(0或1)/n(确定数目)/<省略>(0、1或大于1)
- 在标定联系中的子实体总是一个从属标识符实体
- 一个实体可以与任意多个其他实体相联系,可以在不同的联系中充当不同的角色,如在一些联系中充当父实体,而在另外一些联系中充当子实体。
1204-非确定联系与相交实体(5分31秒)
非确定联系:即实体之间的多对多的联系
非确定联系必须分解为若干个一对多的联系来表达
关于非确定联系的规则:工程化的要求
- 一个非确定联系总是存在于两个实体之间,而不是三个或更多个实体之间
- 两个实体中,任意一个实体的实例可以与另一实体的0,1或多个实例相关联,具体情况要视情况而定,在图中标出其基数
- 为了完全地设计出一个模型,非确定联系必须由确定联系来替代
1205-分类联系与分类实体(9分44秒)
分类联系:一个实体实例是由一个一般实体实例及多个分类实体实例构成的
- 一个一般实体是若干具体实体(分类实体)的类
- 分类实体与一般实体具有相同的主关键字
- 不同分类实体除具有一般实体特征外,各自还可能具有不同的属性特征
(3)泛化与具体化
属性继承
- 高层实体的属性被低层实体自动继承
- 低层实体特有的性质仅适用于某个特定的低层实例
- 如”Dissertation属性只适用于“研究生”实例
一些规则:
- 一个分类实体只能有一个对应的一般实体,即对一分类联系而言,它只能是一个分类集的成员
- 一个分类联系中的一个分类实体可以是一个其他分类联系中的一般实体
- 一个实体可以具有任意个分类联系,在这些分类联系中,这个实体作为一般实体。例如“雇员”实体可分类为“计时雇员”和“月薪雇员”,也可分类为“普通雇员”和“高级雇员”
- 一个分类实体不能是可标定联系中的子实体
- 分类实体的主关键字属性必须和一股实体主关键字属性相同。
- 一个分类实体的全部实例都具有相同的“鉴别器值”,并且不同分类实体的实例都具有不同的鉴别器值
1206-IDEF1X案例讲解之一-四个建模小例子(11分13秒)
1207-IDEF1X案例讲解之二-仓储系统建模(8分47秒)
1208-IDEF1X案例讲解之三-物料系统建模(7分21秒)
1209-IDEF1X案例讲解之四-六个模型示例点评(14分21秒)
1210-IDEF1X案例讲解之五-联赛管理系统建模(4分33秒)
第2讲(总第12讲)模拟题
第13讲-数据库设计过程
1300-本讲学习什么(3分51秒)及第13讲教学课件
1301-如何做需求分析(6分32秒)
1302-如何做概念数据库设计(12分10秒)
1303-如何做逻辑数据库设计(17分43秒)
基本转换规则:复合属性的转换
将每个分量属性作为复合属性所在实体的属性或者,将复合属性本身作为所在实体的属性
示例
学生(学号,姓名,年,月,日)或者学生(学号,出生日期,姓名)
基本转换规则:多值属性的转换
将多值属性与所在实体的关键字一起组成一个新的关系
示例
学生(学号,姓名)
选课(学号,所选课程号)
1304-逻辑数据库设计会出现什么问题(7分54秒)
不正确设计数据库引发的问题
冗余:数据库中存在大量冗余
非受控冗余
例如,右侧数据库设计
受控冗余问题
当数据发生改变时,如何使冗余数据同步更新?
如何避免?
设计满足规范性,由DBMS或数据库本身来保证
设计不满足规范性,由使用者或应用程序员使用过程中加以注意
1305-如何做物理数据库设计(3分33秒)
设计用户视图及访问控制规则,以进行安全性控制
建立索引
设计使数据库运行达到最佳效率的一些措施
设计备份Backup和恢复Recovery的步骤
理解Oracle、Sybase或其他DBMS的物理数据库管理方式,这是数据库管理员(DBA)的基本责任
第3讲(总第13讲)模拟题
第14讲-函数依赖及其公理/定理
1400-本讲学习什么(1分28秒)及第14讲教学课件
1401-什么是函数依赖(9分27秒)
1402-部分函数依赖与完全函数依赖(4分40秒)
1403-传递函数依赖(3分57秒)
1404-函数依赖相关的几个重要概念(8分17秒)
1405-关于函数依赖的Armstrong公理(8分05秒)
1406-什么是属性(集)闭包(6分01秒)
1407-属性闭包的计算算法与覆盖及其证明(7分53秒)
1408-什么是最小覆盖(6分08秒)
第4讲(总第14讲)模拟题
7、关系模式R(A1,A2,A3,A4,A5,A6),如果A1→(A3,A4); (A2,A4)→A5; (A3,A5)→ A6,则关于R的说法正确的是_________。
-
A.即不存在对候选键的部分函数依赖,又不存在对候选键的传递函数依赖
-
B.存在对候选键的部分函数依赖,但不存在对候选键的传递函数依赖
-
C.不存在对候选键的部分函数依赖,但存在对候选键的传递函数依赖
-
D.既存在对候选键的部分函数依赖,又存在对候选键的传递函数依赖
正确答案:D你错选为C
问题解析:可以求得候选码为(A1,A2),因为A1→(A3,A4),所以存在对候选键的部分函数依赖,因为候选码为(A1,A2),有(A1,A2)→(A1,A2,A3,A4,A5,A6),又因为在依赖集中有(A3,A5)→A6,因此就会有(A1,A2)→(A3,A5)→A6即存在对候选键的传递函数依赖
15、已知关系R(A,B,C,D,E,F,G),函数依赖集F为{ BC -> AE,DC->EF,DG->E,B->CD,D->G },问:F的最小覆盖为_________。
-
A.{ BC->A,BC->E,DC->E,DC->F,DG->E,B->C,B->D,D->G }
-
B.{ B->A,DC->F,D->E,B->C,B->D,D->G }
-
C.{ B->A,B->E,D->E,B->C,B->D,D->G }
-
D.{ B->A,B->E,D->F,C->F,D->E,B->C,B->D,D->G }
正确答案:B你错选为A
19、已知关系R(A,B,C,D,E,F,G),函数依赖集F为{ ADG-> EF,CD->F,F->B, A->D },问:能从F中推导出的函数依赖是_________。
-
A.ADG->E, AG->E
-
B.D->B,G->E
-
C.CD->B,AC->B,CDG->F,FE->CB
-
D.F->B,FA->D,A->EF
正确答案:A你错选为C
解析:G->E、FE->CB、A->EF这些推导不出来
第15讲-关系模式设计之规范形式
1500-本讲学习什么(1分19秒)及第15讲教学课件
1501-什么是第一范式(3分53秒)
1502-什么是第二范式(6分40秒)
目的:消除非受控冗余
1503-什么是第三范式(6分40秒)
目的:消除非受控冗余
1504-什么是Boyce-Codd范式(6分19秒)
1505-什么是多值依赖(9分31秒)
1506(选修)-关于多值依赖的Armstrong公理(14分40秒)
第5讲(总第15讲)模拟题
1、关系数据库规范化是为了解决关系数据库中插入问题、删除问题和数据冗余的问题而引入的。
11、已知关系模式R(A,B,C),函数依赖集F={B→C, B→A, A→BC}。则关于R,说 法正确的是?
解析:首先确定候选键,候选键为A能完全决定所有属性,B也能完全决定所有属性,所以A和B为候选键,非主属性为C。再进一步判断不存在部分函数依赖,不存在传递依赖,所以满足第2和第3范式。再看有没有不依赖于候选键的函数依赖,也不存在,故此R满足Boyce-Codd范式。
19、在R(XY)中,如果X→Y,并且对于X的某一个真子集X’,有X’→Y,则X为关系R的超码。
第16讲-模式分解存在什么问题
1600-本讲学习什么(1分48秒)及第16讲教学课件
1601-模式分解存在的问题(7分58秒)
1602-无损连接分解及其检验算法(14分48秒)
1603-保持依赖分解及其检验算法(11分58秒)
1604-模式分解成BCNF及第3范式的算法(11分43秒)
1605-连接依赖与第5范式(3分05秒)
1606-数据库设计需要知道的(6分50秒)
第6讲(总第16讲)模拟题
第17讲-数据库物理存储
1700-第17讲本讲学习什么(2分40秒)及第17讲教学课件
1701-存储体系回顾(13分48秒)
两个基本问题如何解决?
如何高效率的存储?——数据组织与索引
如何快速的检索?——查询实现与查询优化
面向大规模用户又如何解决?
1702-磁盘的结构与特性(17分19秒)
1703-查询实现的基本思想(12分41秒)
1704-记录与表在磁盘上的存储(12分12秒)
数据库记录在磁盘上的存储
定长记录,还是变长记录(靠分隔符区分开始与结束)
记录是非跨块存储,还是跨块存储(靠指针连接)
1705-四种文件组织方法(16分01秒)
(1)数据组织与存取方法
数据组织要考虑更新(增、删、改)和检索需求
- 更新将涉及数据存储空间的扩展与回收问题
- 检索将涉及扫描整个数据库的问题、大批量处理数据问题
- 不同的需求要求不同的数据组织方法和存取方法
- 文件组织(File organization)指的是数据组织成记录、块和访问结构的方式,包括把记录和块存储在磁盘上的方式,以及记录和块之间相互联系的方法
- 存取方法(Access Method)指的是对文件所采取的存取操作方法
- 一种文件组织可以采取多种存取方法进行访问
1706-Oracle数据库物理存储简介(14分43秒)
第17讲模拟练习题
9、数据库重组是对数据表的物理存储进行调整。
12、在堆文件组织结构中,记录通常是以输入顺序存储的。
13、在顺序文件组织结构中,记录通常是按照某一键值的顺序(升序或降序)存储。
14、如果要将一批记录均匀地存储在n个数据块中,应采用散列文件组织结构。
解析:
顺序文件是按照某一键值的顺序(开序或降序)存储。
堆文件是无序记录文件,通常是按照记录的输入顺序存储的,但如要利用被删除记录的空间,则也可能将其插入到被删除记录的空间中。
散列文件是按照关于键值的某一散列函数值确定的位置进行存储,散列文件组织具有将一批记录均匀存储在 n 个数据块中的特性。
聚簇文件是将一个表或多个表的数据集中在一起进行存储。
第18讲-数据库索引技术
1800-第18讲本讲学习什么(2分01秒)及第18讲教学课件
1801-索引的概念和作用(13分49秒)
(2)索引的一般性特点
索引文件是一种辅助存储结构,其存在与否不改变存储表的物理存储结构;然而其存在,可以明显提高存储表的访问速度。
索引文件组织方式有两种:(相对照的,主文件组织有堆文件、排序文件、散列文件、聚簇文件等多种方式)
- 排序索引文件(Ordered indices):按索引字段值的某一种顺序组织存储
- 散列索引文件(Hash indices):依据索引字段值使用散列函数分配散列桶的方式存储
在一个表上可以针对不同的属性或属性组合建立不同的索引文件,可建立多个索引文件。索引字段的值可以是Table中的任何一个属性的值或任何多个属性值的组合值
索引文件比主文件小很多。通过检索一个小的索引文件(可全部装载进内存),快速定位后,再有针对性的读取非常大的主文件中的有关记录
有索引时,更新操作必须同步更新索引文件和主文件,否则可能无法成功搜索文件。
1802-SQL中索引的创建和使用(5分52秒)
(1)基本知识
SQL语言关于索引的基本知识
- 当定义Table后,如果定义了主键,则系统将自动创建主索引,利用主索引对Table进行快速定位、检索与更新操作;
- 索引可以由用户创建,也可以由用户撤消
- 当索引被创建后,无论是主索引,还是用户创建的索引,DBMS都将自动维护所有的索引,使其与Table保持一致,即:当一条记录被插入到Table中后,所有索引也自动的被更新
- 当Table被删除后(drop table),定义在该Table上的所有索引将自动被撤消
(3)索引应用要注意效果
- 选择哪些属性创建索引,以及如何创建与维护索引,如何利用索引改善数据库的运行性能,是DBA(数据库管理员)的重要职责。
- 是否建立和在哪些属性上建立索引需要考虑:访问时间、 插入时间、 删除时间与空间负载。 既要改善性能,又要控制代价。
- 建立索引还需考虑索引的类型:索引如何支持存取的有效性,比如:支持的是属性的限定值(是否符合单一值),还是支持属性的限定范围的值(是否符合一定范围)
对哪些属性建立索引?
对经常出现在检索条件、连接条件、分组计算条件中的属性可建立索引
SELECT...FROM...WHERE...GROUP BY..
1803-稀疏索引与稠密索引(10分58秒)
(3)稠密索引如何定位记录
候选键属性的稠密索引一先查索引,然后再依据索引读主文件
无论是候选键属性的稠密索引,还是非候选键属性的稠密索引:索引文件中不存在搜索码的值,就代表着主文件中没有对应搜索码的记录
1804-主索引与辅助索引(6分31秒)
1805-聚簇索引与倒排索引(8分32秒)
(1)聚簇索引和非聚簇索引
聚簇索引是指索引中邻近的记录在主文件中也是临近存储的
非聚簇索引是指索引中邻近的记录在主文件中不一定是邻近存储的。
聚簇索引是指索引中邻近的记录在主文件中也是临近存储的;
非聚簇索引是指索引中邻近的记录在主文件中不一定是邻近存储的。
- 如果主文件的某一排序字段不是主码,则该字段上每个记录取值便不唯一,此时该字段被称为聚簇字段;聚簇索引通常是定义在聚簇字段上。
- 聚簇索引通常是对聚簇字段上的每一个不同值有一个索引项(索引项的总数和主文件中聚簇字段上不同值的数目相同),索引字段即是聚簇字段的不同值,由于有相同聚簇字段值的记录可能存储于若干块中,则索引项的指针指向其中的第一个块。
- 一个主文件只能有一个聚簇索引文件,但可以有多个非聚簇索引文件
- 主索引通常是聚簇索引(但其索引项总数不一定和主文件中聚簇字段上不同值的数目相同,其和主文件存储块数目相同);辅助索引通常是非聚簇索引。
- 主索引/聚簇索引是能够决定记录存储位置的索引;而非聚簇索引则只能用于查询,指出已存储记录的位置。
1806-B+树索引(3个视频总计20分50秒)
(1)多级索引
多级索引:当索引项比较多时,可以对索引再建立索引,依此类推,形成多级索引。
当某级索引不能一次性装入内存时,可对其再建立索引
B树和B+树有什么区别?
-
结构层次不同:B树是一种多路搜索树,每个节点包含多个子节点;而B+树是一种多路平衡搜索树,所有数据都存储在叶子节点,并且叶子节点之间用指针连接形成链表。
-
查询方式不同:在B树中,如果要查找一个关键字,可以在内部节点和叶子节点中都进行查找;而在B+树中,只能在叶子节点中进行查找。
-
插入与删除操作的影响范围不同:在B树中,插入和删除一个节点可能会导致整棵树的结构发生变化;而在B+树中,插入和删除只会影响到叶子节点,内部节点的结构不会变化。
-
范围查询的优势:由于B+树的所有数据都存储在叶子节点中且有序排列,并且叶子节点之间有指针连接,所以在B+树中进行范围查询效率更高。
-
更适合文件系统索引:由于B+树的数据都存储在叶子节点中,并且叶子节点之间有指针连接,更适合用于文件系统的索引结构。
1807-B+树键值插入与删除-结点分裂与合并操作示例(3个视频总计27分37秒)
插入键值为40的记录
(1)寻找保存键值记录的叶子结点
(2)应插入结点已满,则申请新结点
(3)同时调整应插入但未插入结点中的键值记录,使其均衡存放于两个叶结点中(分裂)
(4)调整指针使其指向新叶子结点
(5)寻找指向新叶子结点的非叶结点
(6)应插入结点已满,则申请新结点
(7)同时调整应插入但未插入结点的键值记录,使其均衡存放于两个非叶结点中(分裂)
(8)调整各结点指针使其指向正确
删除键值为7的记录
(1)叶子结点中寻找等于键值的记录,删除相应的指针及主文件中对应的记录
(2)调整其左侧(或右侧)结点及本结点中的键值记录,使其均衡存放于两个叶结点中
(3)如有调整,则进一步调整其上层非叶结点,重新确定其键值,以满足大于等于键值的记录都在其右侧
简单插入
先定位待插入键值的叶子结点:从根结点开始向下;检查叶子结点是否已满?
如未满,则可直接插入
如已满,则需分裂该结点为两个
如父结点已满,则如此继续将其分裂为两个结点,保存相应键值一直到根结点。如根结点也满则再生成新的根结点,结束。
1808-散列索引(12分52秒)
(4)散列的问题
桶的数目M是固定值——静态散列索引
如果桶的数目M不变:M过大,则浪费;M过小,则将产生更多的溢出桶增加散列索引检索的时间。
桶的数目随键值增多, 动态增加——动态散列索引
h(k)是和桶的数目M相关的。M的变化会否影响原来存储的内容呢?
是否需要将原来已经散列-存储的数据按新的桶数重新进行散列-存储呢?
1809(选修)-可扩展散列索引和线性散列索引(2个视频总计26分50秒)
桶的数目随键值增多, 动态增加——动态散列索引
h(k)是和桶的数目M相关的。M的变化会否影响原来存储的内容呢?
是否需要将原来已经散列-存储的数据按新的桶数重新进行散列-存储呢?
可扩展散列索引
- 为桶引入一间接层,即用一个指向块的指针数组来表示桶,而不是用数据块本身组成的数组来表示桶
- 指针数组能增长,其长度总是2的幂。因而数组每增长一次,桶的数目就翻倍。不过,并非每个桶都有一个数据块;如果某些桶中的所有记录可以放在一个块中,则这些桶可能共享一个块。
- 散列函数h为每个键计算出一个K位二进制序列,该K足够大,比如32。但是桶的数目总是使用从序列第一位或最后一位算起的若干位,此位数小于K,比如说i位。也就是说,当i是使用的位数时,桶数组将有个项
第18讲模拟练习题
第19讲-数据库查询实现算法之一趟扫描算法
1900-第19讲本讲学习什么(2分21秒)及第19讲教学课件
1901-查询实现算法概述(18分06秒)
查询优化不等于查询实现!
1902-由连接运算看查询实现的逻辑与物理算法(2个视频总计19分07秒)
由连接运算看查询实现的逻辑与物理算法(9分22秒)
连接运算的几个物理实现算法(9分45秒)
1903- 迭代器的概念与应用(3个视频总计17分36秒)
什么是和为什么要用迭代器(8分25秒)
利用迭代器构造查询实现算法(6分04秒)
利用迭代器构造连接操作实现算法
1904-查询实现的一趟扫描算法(2个视频总计17分38秒)
查询实现的一趟扫描算法-去重复操作算法(8分02秒)
查询实现的一趟扫描算法-其他操作算法(9分36秒)
1905-基于索引的选择与连接算法(2个视频总计9分35秒)
基于索引的选择算法(5分31秒)
基于索引的连接算法(4分04秒)
第19讲模拟练习题
4、下列关系代数操作,任何时候都能够用一趟算法实现的是______。
正确答案:B。解析:选择操作和包上的并操作,在征何时候都可以用一趟算法实现之。而 集合上的并操作则不一定能够用一趟算法实现之。故选项(B)是正确的
12、关于去重复&(R)操作的一趟扫描算法,下列说法不正确的是____________。
-
A.非精确的讲,算法的应用前提是B(R) < =M,其中M为可用内存块数,B(R)为R中数据所占用的磁盘块数。
-
B.算法的关键是建立内存数据结构,可以建立散列结构,也可以建立排序结构,目的是进行快速比较。
-
C.算法可以做到只与一个内存块中的数据进行比较,即可判断出是否有重复。
-
D.算法需要首先对R的所有数据建立内存数据结构,然后才能判断是否有重复的元组存在。
正确答案:D你错选为C
13、分组聚集操作的一趟扫描算法______________。
-
A.非精确的讲,算法的应用前提是B(R) < =M,其中M为可用内存块数,B(R)为R中数据所占用的磁盘块数
-
B.算法的关键是建立内存数据结构,可以建立散列结构,也可以建立排序结构,目的是进行快速比较
-
C.算法可以做到一条记录只与一个或少量几个内存块中的数据进行分组聚集计算
-
D.算法可以边执行边建立内存数据结构,即仅对已处理过的数据建立内存数据结构,便可进行各个分组的聚集计算
正确答案:D你选对了
第20讲-数据库查询实现算法之两趟扫描算法
2000-第20讲本讲学习什么(1分21秒)及第20讲教学课件
2001-两趟扫描算法的基本思想(7分20秒)
为什么需要两趟算法?
内存不够装载整个关系
2002-两阶段多路归并排序算法(2个视频总计16分41秒)
两阶段多路归并排序算法(9分11秒)
两阶段多路归并排序算法过程模拟及讨论(7分30秒)
2003-基于排序的两趟扫描算法(8分58秒)
2004-基于散列的两趟扫描算法(2个视频总计16分13秒)
基于散列的两趟扫描算法-去重与分组(8分00秒)
基于散列的两趟扫描算法-并交差与连接(8分13秒)
第20讲模拟练习题
1、已知内存共有8块,若要排序有70块的数据集,应如何组织,才能使磁盘读写次数最少。下列方案中磁盘读写次数最少的方案是________。
-
A.方案I:(1)以8块为一个单位划分子集合,每个子集合进行内排序并存储,形成9个已排序子集合(其中包含一个仅有6块的子集合);(2)接着在9个子集合中选择3个子集合 (其中包含仅有6块的子集合),进行一个三路归并,形成一个已排序子集合;(3)再将剩余5个子集合与刚才归并后形成的子集合,进行一个七路归并,形成最终的已排序集合。这个方案的磁盘读写次数最少。
-
B.方案II:(1)以7块为一个单位划分子集合,每个子集合进行内排序并存储,形成10个已排序子集合;(2)接着在10个子集合中任选5个子集合进行一个五路归并,形成一个已排序子集合;(3)再将剩余5个子集合与刚才归并后形成的子集合,进行一个六路归并,形成最终的已排序集合。这个方案的磁盘读写次数最少。
-
C.方案III:(1)以8块为一个单位划分子集合,每个子集合进行内排序并存储,形成9个已排序子集合(其中包含一个仅有6块的子集合);(2)接着在9个子集合中任选七个子集合进行一个七路归并,形成一个已排序子集合;(3)再将剩余2个子集合与刚才归并后形成的子集合,进行一个三路归并,形成最终的已排序集合。这个方案的磁盘读写次数最少。
-
D.方案IV:(1)以8块为一个单位划分子集合,每个子集合进行内排序并存储,形成9个已排序子集合;(2)接着在9个子集合中任选5个子集合进行一个五路归并,形成一个已排序子集合;(3)再将剩余4个子集合与刚才归并后形成的子集合,进行一个五路归并,形成最终的已排序集合。这个方案的磁盘读写次数最少。
正确答案:A你选对了
2、已知内存共有100块,若要排序有10000块的数据集,则该数据集不能在两趟内实现排序,磁盘读写次数为40400次。。
3、已知内存共有8块,若要排序有100块的数据集,则给定多路归并算法如下:(1)以8块为一个单位划分子集合,每个子集合进行内排序并存储,形成13个已排序子集合(含一个仅有4块的子集合);(2)接着在13个子集合中任选7个子集合(包含仅有4块的子集合)进行一个七路归并,形成一个已排序子集合;(3)再将剩余6个子集合与刚才归并后形成的子集合,进行一个七路归并,形成最终的已排序集合。问:这个方案的磁盘读写次数是504。
4、关于基于排序的两趟算法,下列说法都正确:
基于排序的两趟算法的第一趟都是划分子表并排序。每一个子表应都能装入内存,并进行排序,然后再存回磁盘。
基于排序的两趟算法的第二趟是进行归并,在归并的过程中可以边排序边去重复,归并完成即去重复操作完成。
基于排序的两趟算法的第二趟是进行归并,在归并的过程中可以一边排序一边进行分组并进行聚集计算,归并完成即分组聚集计算操作完成。
5、已知关系R和S。关系占用的磁盘块数B(R)=1000,B(S)=1000,已知可用内存页数M=40。采用基于排序的算法,下列说法正确的是用一趟算法即可实现R和S的包的并操作。
6、已知关系R和S。关系占用的磁盘块数B(R)=1000,B(S)=500,已知可用内存页数M=50。采用基于排序的算法,下列说法正确的是用两趟算法才能实现R和S的集合并操作。
7关于基于散列的两趟算法,下列说法都正确:
基于散列的两趟算法的第一趟是散列子表。用某一个散列函数,将具有相同散列值的元组散列到相同的子表中并存回磁盘。
基于散列的两趟算法的第二趟是用与第一趟不同的散列函数,将子表再散列到内存的不同内存块中,在具有相同散列值的所有内存块中去重复,即是在整个关系上去重复。所有子表处理完成,去重复操作即告完成。
两次散列函数的选择是不同的,第一趟是在大范围上进行散列,将一个大数据集散列成若干个具有相同散列值的散列子表,第二趟是在小范围上进行散列,将具有某相同散列值的散列子表(大范围上散列值相等)散列到内存的某一块或几块(小范围上散列值相等)。
8、基于散列的两趟算法和基于排序的两趟算法,其中第一趟都是划分子表,都要求子表的存储块数要小于可用内存数,以便子表可以一次性装入内存进行处理。关于划分子表,下列说法正确的是基于排序的算法总是可以均匀地划分子表(即每个子表的大小都一样,除最后一块外);基于散列的算法不能保证总是均匀地划分子表。
9、关于R与S的并、交、差运算的基于散列的两趟算法,其中第一趟都是划分子表,都要求子表的存储块数要小于可用内存块数,以便子表可以一次性装入内存进行处理。关于划分子表,下列说法正确的是必须用相同的散列函数将R和S分别散列成若干个子表。
10、关于基于散列的两趟算法和基于排序的两趟算法的基本思想,下列说法正确的是排序算法是先划分子表,独立处理子表(第一趟),然后再对各子表进行关联性处理(第二趟);散列算法是先从关联性角度处理,形成子表(第一趟),然后再独立处理每一个子表(第二趟)。
11、关于连接运算R (JOIN on R.A=S.B) S的基于散列的两趟算法,下列说法不正确的是_______。
-
A.必须以相同的散列函数分别散列R和S,形成若干个散列子表。
-
B.散列过程中,R必须以A属性值作为散列函数的键值,S必须以B属性值作为散列函数的键值。
-
C.散列过程中,R必须以A和B属性值作为散列函数的键值,S也必须以A和B属性值作为散列函数的键值。
-
D.第二趟处理中,须将R的子表再完整地散列到内存的若干块中,然后再一块一块处理S对应子表的每一块,以便快速决定可以连接的元组。
正确答案:C你选对了
12、关于基于散列的两趟算法,下列说法正确的是第一趟散列的目的是使数据子集具有某一种特性(如具有相同的散列值),而第二趟散列的目的是提高数据处理的速度。
第21讲-数据库查询优化技术
2100-第21讲本讲学习什么(1分25秒)及第21讲教学课件
2101-什么是查询优化(6分22秒)
查询优化
如何使数据库查询的执行时间最短?
三个层面进行优化:
- 语义优化:利用模型的语义及完整性规则,优化查询
- 语法优化---逻辑层优化:利用语法结构,优化操作执行顺序;
- 执行优化---物理层优化:存取路径和执行算法的选择与执行次序优化;
2102-查询优化的总体思路(13分31秒)
尽可能早的做选择操作,可有效地减少中间结果元组的数目。
尽可能早的做投影操作,可有效地减少中间结果所占用的内存块的数目。
将笛卡尔积操作与其后的选择操作组合成连接操作,可有效地减少中间结果元组的数目。
2103-逻辑层查询优化策略(13分50秒)
2104-关系代数操作等价变换定理(2个视频总计22分16秒)
将左侧公式变换为右侧公式,表示将两趟扫描数据库(左侧),变成一趟扫描数据库(右侧)。
将右侧公式变换为左侧公式,表示将复杂条件的选择操作(右侧),变成简单条件的选择操作(左侧)。
在逻辑优化起始,应首先将右侧形式的公式转变为左侧形式的公式。
在逻辑优化结束前,应将左侧形式的公式转变为右侧形式的公式。
因为先做差运算再投影,和先投影再做差运算,结果可能不一样,你可比较以下:假设上式的n=3,即投影三个属性,而E和E有6个属性。六个属性上的差运算和三个属性上的差运算结果可能是不同的。
2105-基于关系代数的查询优化算法(13分44秒)
2106-物理层查询优化(13分19秒)
2107-代价估算(2个视频总计15分39秒)
第21讲模拟练习题
1、关于逻辑查询优化和物理查询优化,下列说法正确的是逻辑查询优化是关系代数操作次序的优化;物理查询优化是关系代数操作实现算法选择的优化。
第22讲-数据库事务处理技术之并发控制
2200-第22讲本讲学习什么(1分45秒)及第22讲教学课件
2201-为什么要进行并发控制(8分56秒)
为什么要进行并发控制?
(1)数据库可能存在不一致
如果大家同时买起点终点、日期、 车次相同的车票,会否买到座位相重复的车票?
2202-深入认识事务(2个视频总计15分48秒)
深入认识事务(9分59秒)
(1)事务的概念
事务(Transaction)是数据库管理系统提供的控制数据操作的一种手段,通过这一手段,应用程序员将一系列的数据库操作组合在一起作为一个整体进行操作和控制,以便数据库管理系统能够提供一致性状态转换的保证。
(2)事务的宏观性和微观性
事务的宏观性 (应用程序员看到的事务):一个存取或改变数据库内容的程序的一次执行,或者说一条或多条SQL语句的一次执行被看作一个事务。
事务一般是由应用程序员提出,因此有开始和结束,结束前需要提交或撤消。
Begin Transaction
exec sql ...
exec sql ..
exec sql commit work I exec sql rollback work
End Transaction
在嵌入式SQL程序中,任何一条数据库操纵语句(如 exec sql select 等)都会引发一个新事务的开 始,只要该程序当前没有正在处理的事务。而事务的结束是需要应用程序员通过 commit 或 rollback 确认的。 因此 Begin Transaction 和 End Transaction两行语句是不需要的。
事务的微观性(DBMS看到的事务):对数据库的一系列基本操作(读、写)的一个整体性执行。
T: read(A);
A:= A - 5000;
write(A);
read(B);
B:= B + 5000;
write(B);
事务的并发执行:多个事务从宏观上看是并行执行的,但其微观上的基本操作(读、写)则可以是交叉执行的
事务ACID特性(5分49秒)
2203-事务调度与可串行性(3个视频总计22分39秒)
事务调度与可串行性(8分45秒)
注意:这里应该是并发调度,不是并行调度!
(2)一种简单的事务调度的标记模型
表达事务调度的一种模型
r_T(A): 事务T读A。 W_T(A) : 事务T写A
T1: r1(A); W1(A); r1(B); w1(B)
T2: r2(A); W2(A); r2(B); W2(B)
冲突可串行性(7分44秒)
冲突可串行性判别算法(6分10秒)
2204-基于锁的并发控制(3个视频总计30分57秒)
什么是锁(6分14秒)
基于封锁的并发控制方法
(2)什么是锁?
"锁" 是控制并发的一种手段
每一数据元素都有唯一的锁
每一事务读写数据元素前,要获得锁
如果被其他事务持有该元素的锁,则要等待。
事务处理完成后要释放锁
L_i(A): 事务T_i对数据元素A加锁
U_i(A): 事务T_i对数据元素A解锁
调度器可利用锁来保证冲突可串行性
锁本身并不能保证冲突可串行性。
锁为调度提供了控制的手段。但如何用锁,仍需说明。---不同的协议
封锁协议要考虑什么(13分57秒)
两段封锁协议(10分46秒)
2205-基于时间戳的并发控制(2个视频19分33秒)
基于时间戳的并发控制(10分40秒)
(2)什么是时间戳?
时间戳(TIMESTAMP)
一种基于时间的标志,将某一时刻转换成的一个数值。
时间戳具有唯一性和递增性。
事务的时间戳
事务T启动时,系统将该时刻赋予T,为T的时间戳
时间戳可以表征一系列事务执行的先后次序:时间戳小的事务先执行,时间戳大的事务后执行。
利用时间戳,可以不用锁来进行并发控制
核心思想:先执行的先操作,后执行的后操作,这样没有冲突
基于时间戳的另一种调度(8分53秒)
2206-基于有效性确认的并发控制(14分23秒)
能否进行批量性的冲突检测?
第22讲模拟练习题
13、T1,T2,T3三个事务,记wi(A)为事务Ti写数据对象A,ri(A)为事务Ti读数据对象A,一个调度S为 “w1(Y); w2(Y); w2(X); w1(X); w3(X);”,问该调度是S不是冲突可串行化调度,但却是可串行化调度,是正确的并行调度。
要判断给定的调度S是否是正确的并发调度以及是否是可串行调度,我们需要考虑事务之间的数据依赖关系和执行顺序。
首先,让我们逐步分析该调度:
- T1写入了数据对象Y(w1(Y))。
- T2写入了数据对象Y(w2(Y))。
- T2写入了数据对象X(w2(X))。
- T1写入了数据对象X(w1(X))。
- T3读取了数据对象X(r3(X))。
现在,让我们来分析一下:
正确的并发调度:
- 如果在该并发调度中,没有出现任何事务的读写冲突、写写冲突和不可重复读现象,则可以认为是一个正确的并发调度。
在给定的调度中,不存在两个事务同时访问相同的数据对象的情况,因此没有出现读写冲突或写写冲突。因此,这是一个正确的并发调度。
可串行调度:
- 如果该并发调度的执行结果与某个串行调度的执行结果相同,则称该并发调度是可串行的。
一个串行调度可以是w1(Y); w2(Y); w2(X); w1(X); w3(X)。在这个串行调度中,T1和T2的写操作按照其在调度S中的顺序执行,然后T3读取了X。调度S的执行结果与这个串行调度的执行结果相同,因此调度S是可串行的。
综上所述,给定的调度S是一个正确的并发调度,并且是可串行的。
这个调度S为:“w1(Y); w2(Y); w2(X); w1(X); w3(X);”
首先,我们来看这个调度是否是正确的并发调度。一个正确的并发调度必须满足以下两个条件:
-
事务操作的顺序不变:在调度S中,事务的操作顺序是不变的,即按照w1(Y), w2(Y), w2(X), w1(X), w3(X)的顺序执行。
-
事务操作必须保证数据一致性:对于每个数据对象,如果事务Ti写入了一个数据项后,再有其他事务Tj读取或者写入该数据项时,Tj必须读取Ti的写入值。
对于第一个条件,调度S满足,因为事务操作的顺序没有改变。
对于第二个条件,我们来逐步分析:
- w1(Y):事务T1写入了数据对象Y。
- w2(Y):事务T2写入了数据对象Y。
- w2(X):事务T2写入了数据对象X。
- w1(X):事务T1写入了数据对象X。
- w3(X):事务T3写入了数据对象X。
接下来判断这个调度是否是可串行调度。一个可串行调度是指,存在一个等价的串行调度,该串行调度与原调度S的操作序列相同。因为可串行调度是串行调度的特例,因此我们只需要验证是否存在一个串行调度等价于原调度S即可。
根据原调度S的操作序列,可以构建一个串行调度为:T1 -> T2 -> T3,即按照事务T1、T2、T3的顺序执行操作。
26、关于基于时间戳的并发控制方法(简称TS方法)和基于有效性确认的并发控制方法(简称VA方法)的异同点,下列说法不正确的是___________。
-
A.TS方法和VA方法都是利用时间戳表征事务的启动时刻,表征事务的执行次序
-
B.TS方法和VA 方法都是为每一数据库元素保存一个读时间戳和写时间戳
-
C.TS方法是比较事务的时间戳与数据库元素的时间戳来判断是否有冲突,而VA方法是通过比较两个事务的读写数据集合是否有交集来判断是否有冲突
-
D.TS方法和VA方法都是以撤销事务并重启事务来解决事务之间的冲突
正确答案:B你选对了
解析:选项A、C和D的说法都是正确的,但选项B的说法是不正确的,TS方法是为每一数据库元素保存一个读时间戳和写时间戳,以便于事务时间戳与数据库元素的时间戳进行比较判断冲突;而VA方法则是为每一个事务保存一个读数据集合和一个写数据集合,以便于数据集合之间的比较判断冲突,故选项B的说法是不正确的。
第23讲-数据库事务处理技术之故障恢复
2300-第23讲本讲学习什么(1分43秒)及第23讲教学课件
2301-数据库故障类型(6分44秒)
(1)你要知道的
DBMS 的运行方式:
- DBMS 利用内存(主存)和外存(辅存)这样的存储体系来进行数据库管理
- 在内存中,又将其分为程序数据(事务数据)和系统数据
事务是DBMS对数据库进行控制的基本逻辑单元。
事务:宏观上是由程序员设置的一条或多条SQL语句的一次执行;微观上是对数据元素的一系列基本操作,如读写等。需要提交和撤销。
数据元素:
- 通常 1 数据元素= 1 磁盘块/内存页
- 也可以更小 (=1 记录)或更大 (=1 关系)
事务具有四个特性:ACID特性
- 原子性 Atomicity
- 一致性 Consistency
- 隔离性 Isolation
- 持久性 Durability
故障恢复涉及如何保证原子性和持久性
2302-数据库故障恢复的宏观思路(12分10秒)
(1)故障恢复与事务故障恢复
数据库故障恢复
把DB由当前不正确状态恢复到已知为正确的某一状态。
需要保证事务的:
√原子性:事务的所有操作,要么全都执行,要么全都不执行。
√持久性:已提交的事务对数据库产生的影响是持久的,未提交的事务对数据库不应有影响。
事务故障的恢复
事务故障可通过重做事务(Redo)和撤消事务(Undo)来恢复。重做事务可保证已提交事务的持久性,而撤销事务则消除未提交事务的影响
系统故障可通过运行日志来恢复
按照运行日志记录的事务操作顺序重做事务(当事务在发生故障时已正确结束)或撤消事务(当事务在发生故障时未结束)
但故障恢复是需要时间的
运行日志保留了若干天的记录,当发生系统故障时应从哪一个点开始恢复呢?
(3)介质故障恢复
副本(Copy)
- 在某一时刻,对数据库在其他介质存储上产生的另一份等同记录
- 用副本替换被损坏的数据库
介质故障的恢复
- 用副本替换被破坏的数据库
- 由于介质故障影响全面,在用副本恢复后还需要依据运行日志进行恢复
如何确定备份的时刻:转储点
- 过频,影响系统工作效率;过疏,会造成运行日志过大,也影响系统运行性能
- 备份转储周期与运行日志的大小密切相关,应注意防止衔接不畅而引起的漏洞
2303-运行日志的概念(13分57秒)
DBMS需要保证事务的:
√持久性:已提交的事务对数据库产生的影响是持久的,未提交的事务对数据库不应有影响。
√原子性:事务的所有操作,要么全都执行,要么全都不执行。
持久性:
已提交事务——缓冲区内容保证写回磁盘
未提交事务——缓冲区内容不能影响磁盘
2304-UNDO型日志及其故障恢复(9分59秒)
(4)检查点及其使用
静止检查点:周期性地对日志设置检查点
- 停止接受新的事务, 等到所有当前活跃事务提交或终止,并在日志中写入了COMMIT或ABORT记录后
- 将日志刷新到磁盘,写入日志记录
<CKPT>
,并再次刷新日志
非静止检查点
- 在设置检查点时不必关闭系统,允许新事务进入
- 写入一条
<START CKPT(T1,...,Tk) >
,其中T1,...,Tk是所有活跃的未结束的事务 - 继续正常的操作,直到T1,...,Tk都完成时,写入
<ENDCKPT>
2305-REDO型日志及其故障恢复(7分54秒)
(4)检查点及其运用
非静止检查点
在进行检查点设置时不必关闭系统,允许新事务进入
写入一条<START CKPT(T1,...,Tk) >
其中T1,...,Tk是所有活跃的未结束的事务
将所有已提交的事务写回磁盘,继续正常的操作,直到T1,...,Tk都完成时,写入<ENDCKPT>
2306-UNDO/REDO结合型日志及其故障恢复(6分29秒)
第23讲模拟练习题
1、日志文件是用于记录对数据的所有更新操作。
解析:数据库的日志是记录对数据的所有更新操作,使于当数据库出现故障时能够顺利的恢复,保证事务的原子性和持久性。
2、下列说法正确的是检查点是DBMS强制使内存DB Buffer中的内容与介质DB中的内容保持一致的时刻点。
3、介质故障的恢复需要_________。
-
A.当前未执行完的事务撤销
-
B.当前执行完的事务需要按照运行日志记录的次序重做
-
C.用最新的备份文件替换发生故障的数据库文件
-
D.以上工作都需要,但需要注意操作的次序。
正确答案:D你错选为C
4、检查点是故障恢复技术中出现的概念。
5、DBMS管理数据库缓冲区有四种策略:No Steal, Steal, No Force, Force。对这四种策略有下面四种解释。
-
内存中的数据最晚在commit的时候写入磁盘;
-
内存中的数据可以一直保留,在commit之后过一段时间再写入磁盘;
-
允许在事务commit之前把内存中的数据写入磁盘;
-
不允许在事务commit之前把内存中的数据写入磁盘;
则策略与解释有正确对应的是Force:1; No Force:2; Steal:3; No Steal:4。
6、DBMS管理数据库缓冲区有四种策略:No Steal, Steal, No Force, Force。则效率较低但不会出现问题的策略组合是No Steal+ Force,而效率最高最常用但会出现问题的策略组合是Steal + No Force。
7、DBMS管理数据库缓冲区有四种策略:No Steal, Steal, No Force, Force。 为保证数据库系统故障能够有效地恢复,提出了三种类型的日志:Undo型日志、Redo型日志和Undo/Redo结合型日志。不同策略可以采用不同的日志予以恢复,则下列说法正确的是____________。
-
A.Steal + Force:不需要任何日志,不需要恢复
-
B.No Steal + Force:需要Undo/Redo结合型日志进行恢复,不需要Redo型日志
-
C.No Steal + No Force:需要Redo型日志进行恢复,不需要Undo型日志
-
D.Steal+ No Force:需要Undo型日志进行恢复, 不需要Redo型日志
正确答案:C你选对了
解析:本题需要理解这四种策略。Force+No Steal可以保证事务的持久性,不需恢复;
No Steal+No Force,会出现当发生系统故障时,已经提交事务却并未写入磁盘等问题,所以需要Redo型日志,以使重做事务保证持久性;
Steal+Force,会出现当发生系统故障时,未提交事务提早写入磁盘等问题,所以需要Undo型日志,以便撤销事务保证持久性;
而Steal+No Force,则在系统发生故障时,既会出现已经提交事务却并未写入磁盘等问题,也会出现未提交事务提早写入磁盘等问题,所以需要Undo/Redo结合型日志既执行已完成事务的重做,又执行未完成事务的撤销,才能保证持久性。
故此,选项C是正确的。
8、关于Undo型日志和Redo型日志的差别,下列说法正确的是Redo型日志是先将Commit记录写入日志,再将数据写回磁盘OUTPUT,而Undo型日志是先将数据写回磁盘OUTPUT,再将Commit记录写入日志。
9、关于用Undo型日志和Redo型日志进行数据库恢复,下列说法正确的是用Undo型日志恢复是从日志的尾部开始恢复,按日志记录的反序处理,直至遇到第一个检查点为止结束。
Redo型日志是先从日志尾部开始由后向前扫描直至遇到第一个检查点,然后自该检查点开始恢复,按日志记录正序处理,直至日志记录的尾部结束。
10、关于用Undo型日志进行数据库恢复,下列说法正确的是用Undo型日志恢复是对已完成的事务,跳过;而对未完成的事务,将日志记录的值写回磁盘。
Undo型日志仅保留了旧值,没有保留新值。
11、关于用Redo型日志进行数据库恢复,下列说法正确的是用Redo型日志恢复是对已完成的事务,将日志记录的值写回磁盘;而对未完成的事务,跳过。
Redo型日志仅保留了新值,没有保留旧值。
数据库存储过程
数据库存储过程定义:
数据库存储过程是一组预编译的SQL语句集合,可以被存储在数据库中并通过一个简单的调用来执行。存储过程可以接受参数、执行复杂的逻辑操作、返回结果集或输出参数。
存储过程语法:
CREATE PROCEDURE procedure_name AS BEGIN -- SQL statements END
实例1:存储过程示例
自然语言描述存储功能:该存储过程用于根据客户ID查询客户信息。
设计表结构:
CREATE TABLE Customers (
CustomerID INT PRIMARY KEY,
CustomerName VARCHAR(50),
Address VARCHAR(100)
)
存储过程代码实现:
CREATE PROCEDURE GetCustomerInfo
@CustomerID INT
AS
BEGIN
SELECT CustomerName, Address
FROM Customers
WHERE CustomerID = @CustomerID
END
结果:调用存储过程GetCustomerInfo
并传入客户ID,可以获取该客户的姓名和地址信息。
实例2:存储过程示例
自然语言描述存储功能:该存储过程用于插入新的订单信息到订单表中。
设计表结构:
CREATE TABLE Orders (
OrderID INT PRIMARY KEY,
CustomerID INT,
OrderDate DATE,
TotalAmount DECIMAL(10, 2)
)
存储过程代码实现:
CREATE PROCEDURE InsertOrder
@CustomerID INT,
@OrderDate DATE,
@TotalAmount DECIMAL(10, 2)
AS
BEGIN
INSERT INTO Orders (CustomerID, OrderDate, TotalAmount)
VALUES (@CustomerID, @OrderDate, @TotalAmount)
END
结果:调用存储过程InsertOrder
并传入客户ID、订单日期和总金额,可以向订单表中插入新的订单信息。