ToB企服应用市场:ToB评测及商务社交产业平台

标题: 数据库期末复习笔记 [打印本页]

作者: 温锦文欧普厨电及净水器总代理    时间: 2024-12-29 12:02
标题: 数据库期末复习笔记
第1章 绪论

1.1术语

1.数据(Data)

数据是数据库中存储的基本对象。界说为描述事务的符号记录。数据的寄义称为语义,数据与其语义是不可分的。

2.数据库(DataBase,DB)

恒久存储在盘算机内,有构造的,可共享的大量数据的聚集。
数据库基本特性:1.永世存储  2.有构造  3.可共享 4.冗余度小 5.易扩展

3.数据库管理体系(DataBase Management System,DBMS)core

位于用户与操作体系之间的一层数据管理软件
数据库管理体系和操作体系一样是盘算机的底子软件。
主要功能:提供数据界说语言(DDL)、数据利用语言(DML)等

4.数据库体系(DataBase System,DBS)

数据库体系由数据库(DB)数据库管理体系(DBMS)应用程序数据库管理员(DBA)组成的存储、管理、处置惩罚和维护数据的体系。

1.2重要概念

数据库管理技术的发展过程(三个阶段)

1.人工管理阶段:

在盘算机出现之前,人们运用通例的本领从事记录、存储和对数据加工,也就是利用纸张来记录和利用盘算工具(算盘、盘算尺)来进行盘算,并主要利用人的大脑来管理和利用这些数据。
特点:
(1)盘算机体系不提供对用户数据的管理功能;
(2)数据不能共享;
(3)不保存数据。

2.文件体系阶段:

在这一阶段(20世纪50年代后期至60年代中期)盘算机不光用于科学盘算,还利用在信息管理方面。随着数据量的增加,数据的存储、检索和维护标题成为紧迫的需要,数据结构和数据管理技术敏捷发展起来。此时,外部存储器已有磁盘、磁鼓等直接存取的存储设备。软件领域出现了操作体系和高级软件。操作体系中的文件体系是专门管理外存的数据管理软件,文件是操作体系管理的重要资源之一。
特点:
数据以“文件”形式可恒久保存在外部存储器的磁盘上。由于盘算机的应用转向信息管理,因此对文件要进行大量的查询、修改和插入等操作,这些操作由文件体系提供。   
缺点:
数据冗余;不同等性;数据独立性差。

3.数据库体系阶段:

20世纪60年代后期以来 ,盘算机性能得到进一步提高,更重要的是出现了大容量磁盘,存储容量大大增加且代价降落。在此底子上,才有可能降服文件 体系管理数据时的不敷,而满足和办理现实应用中多个用户、多个 应用程序共享数据的要求,从而使数据能为尽可能多的 应用程序服务,这就出现了数据库这样的数据管理技术。
特点:
(1)数据结构化。
(2)数据共享性高、冗余少且易扩充。
(3)数据独立性高。
(4)数据由DBMS统一管理和控制。

1.3 数据库体系结构


1.3.1 外部架构(External Architecture):


外部架构涉及了数据库体系与用户或应用程序之间的交互。以下是四种主要的外部架构范例:
1.3.1.1 单用户结构(Single-user Structure)




1.3.1.2 主从结构(Master-slave Structure)




1.3.1.3 分布式结构(Distributed Structure)



1.3.1.4 客户/服务器结构(Client-server Structure)




1.3.2 内部架构(Internal Architecture):

内部架构主要关注数据库的模式和实例两个焦点概念:
模式与实例(Schema and Instance)
1.模式(Schema)

2.实例(Instance)

总结
模式和实例分别代表了数据库体系中的两个条理:模式是对数据库结构的静态描述,是固定的筹划蓝图;而实例则是对数据库内容的动态描述,是详细的数据。模式界说了数据的范例和格式,而实例则是符合这些范例和格式的详细数据。理解这两个概念,有助于更好地筹划和管理数据库体系。

1.3.3 三层体系结构(Three-level Architecture)


详细表明:
1.外部层(External Level)

2.概念层(Conceptual Level)

3.内部层(Internal Level)

总结
数据库的三层体系结构通过将数据的外部视图、概念表示和内部存储分离,提供了高度的抽象和独立性。这种结构使得数据库体系能够更好地管理和控制数据,确保数据的同等性、安全性和高效的访问。外部层通过多个用户视图为不同的用户提供了个性化的数据访问方式,概念层作为中间层连接外部层和内部层,统一管理数据结构,而内部层则处置惩罚详细的数据存储和访问细节。理解这一结构有助于筹划更高效和安全的数据库体系。
1.3.4 映像(Mapping)

在数据库体系结构中,映像是指不同条理之间的对应关系:
1.外模式/概念模式映像(External/Conceptual Mapping)

2.概念模式/内模式映像(Conceptual/Logical Mapping)


1.3.5 数据独立性(Data Independence)

数据独立性是指当数据库的某一条理发生变化时,不需要对其他条理进行相应的修改。数据独立性分为两种:

逻辑数据独立性(Logical Data Independence)
界说:外模式不受概念模式变化的影响。这意味着,当我们在概念模式中添加或删除某些属性时,不需要修改用户的视图或应用程序。
重要性:逻辑数据独立性使得数据库体系更具机动性和扩展性,因为我们可以在不影响用户的情况下修改数据库的逻辑结构。
实现:通过外部/概念映像来实现,即将用户视图映射到概念模式上。
物理数据独立性(Physical Data Independence)
界说:概念模式不受内部模式变化的影响。这意味着,当我们改变数据的物理存储方式时,不需要修改数据库的逻辑结构或用户视图。
重要性:物理数据独立性提高了体系的服从和性能,因为可以在不影响逻辑结构和用户视图的情况下优化数据存储和访问方法。
实现:通过概念/内部映像来实现,即将概念模式映射到内部模式上。

第二章 关系模型

2.1 数据模型概述

2.1.1 数据模型的界说

—— 数据模型是对现实天下数据的抽象。


2.1.2 数据模型的要求



2.1.3 数据模型的三要素



2.2 关系模型

2.2.1 关系模型的起源与功能



2.2.2 关系模型的组成部分

关系就是一个表格。
关系模型用于处置惩罚表格,由三个部分组成:


2.2.3 关系模型的基本概念



比方,D1 中有两个元素,所以它的基数是2



2.2.4 笛卡尔积与关系

2.2.4.1 笛卡尔积





2.2.4.2 关系的界说



2.2.4.3 关系的表示方法





2.2.4.4 关系的例子

在许多DBMS中,关系模式 R(A11, A22, ..., Ann) 中附属性到域的映射通常描述为属性的范例和长度。
属性范例和长度:
在现实数据库中,属性的界说不光包括名称,还包括数据范例和长度。比方,学生表的学号(Sno)可以界说为字符型(char)且长度为10。
例子:

这些界说展示了怎样在关系模式中描述属性及其数据范例和长度。

2.2.4.5 关系(关系实例)和关系模式


例子



2.3 关系的特性

1.同质性(Homogeneity)
列/属性的同质性:每列的所有值来自同一域,具有相同的数据范例。
2.属性(的序次
在关系中,列的序次可有可无。
3.元组的序次
在关系中,元组的序次可有可无。
4.元组的唯一性
每个元组/行必须是唯一的,即关系中不允许有两个完全相同的元组。
5.属性的原子性
属性值是不可再分的,这一特性也称为第一范式(1NF)。

2.4 键的范例

2.4.1 候选键(Candidate Key)



2.4.2 主键与超键(Primary key & Super key




2.4.3 单键/全键与主属性/非主属性(Single key / All key & Primary attribute / Non-primary attribute


1. 单键和全键

2. 主属性和非主属性


2.4.4 外键Foreign Key


1. 外键的界说


2. 引用关系和被引用关系


2.4.5 键范例总结



2.5 完备性约束

2.5.1 完备性约束的组成

关系模型用于处置惩罚表格,由三个部分组成:
1.数据结构(表格)
2.数据操作(关系代数和关系演算)
3.数据约束(完备性约束)


2.5.2 实体完备性

实体完备性:候选键的属性值不允许为空(NULL)。
实体完备性规则规定,每个表的候选键中的所有值都不能为空。这确保了每一行记录在候选键上的唯一性和可辨识性。
NULL值表示未知值或不存在的值,通常用于表示数据缺失或不可用。
NULL的影响:聚合、算术表达式、比较等。


2.5.3 参照完备性

参照完备性:如果Fk是关系R1的外键,Pk是关系R2的候选键,那么Fk的值必须即是Pk的值或为空(NULL)。
参照完备性确保一个表中的外键值必须在被引用表中存在,或为空。这维护了不同表之间的数据同等性。

用户界说的完备性

2.5.4 用户界说的完备性

用户界说的完备性:根据不同的应用程序,用户可以界说的完备性约束。
用户界说的完备性是指根据特定应用需求,由用户界说的约束规则。这些规则可以保证数据符合特定业务逻辑。


2.6 本章术语回顾



第三章 形式化关系查询语言

3.1 查询语言 (Query Language)

查询语言是用户从数据库中请求信息的语言。
3.1.1 语言分类 (Categories of languages)

过程化语言 (procedural):用户需要描述怎样获取数据。
非过程化语言 (non-procedural):用户只需描述需要什么数据,而不需要描述怎样获取数据。
3.1.2 “纯”语言 ("ure" languages)

“纯”语言指只包罗数据操作元素的语言。
过程化语言 (Procedural)

非过程化语言 (Non-procedural)

纯语言的作用
纯语言构建了查询语言的底子,查询语言是用户常用的语言。

3.2 关系代数 (Relational Algebra)

关系代数是一种过程化语言,提供了一系列的操作,包括:

关系代数的运算符操作基于聚集论,输入一个或多个关系,输出一个新的关系。这些操作是关系数据库管理体系(RDBMS)中SQL查询的底子。

3.2.1 关系代数概览

关系代数提供了一系列基于聚集的操作,包括并、交、差、笛卡尔积、投影、选择、连接和除。操作符接受一个或多个关系作为输入,并输出一个新的关系。
3.2.1.1 传统关系代数操作 (Traditional Relational Algebra Operations)

这些操作只涉及行

暗号:R

 S
寄义:返回两个关系中所有不重复的元组。
运算规则:所有在关系 R 或 S 中的元组。

暗号:R

 S
寄义:返回两个关系中共有的元组。
运算规则:所有在关系 R 和 S 中的元组。

暗号:R - S
寄义:返回在关系 R 中但不在关系 S 中的元组。
运算规则:所有在关系 R 中但不在关系 S 中的元组。

暗号:R

 S
寄义:返回关系 R 和 S 的所有可能组合。
运算规则:所有关系 R 的元组和关系 S 的元组的组合。
3.2.1.2 特别关系代数操作 (Special Relational Algebra Operations)

这些操作涉及行和列

暗号:

 
寄义:从关系 R 中选择指定的列。
运算规则:返回关系 R 的某些列,并去重。

暗号:

 
寄义:关系 R 中选择满足条件 p 的元组。
运算规则:返回关系 R 中所有满足条件 p 的元组。

暗号:

 
寄义:将关系 R 和 S 中的元组基于某个条件连接。
运算规则:返回关系 R 和 S 的所有满足连接条件的组合。

暗号:R ÷ S
寄义:从关系 R 中找出在 S 中出现的所有元组。
运算规则:返回关系 R 中在 S 中出现的元组。

3.2.2 关系的相容性 (Compatibility for the Relational Algebra)

要保证并、交、差操作的有用性,到场操作的关系必须相容。
相容条件:


3.3 关系代数(详细):

3.3.1 并 (Relational Algebra (1): Union)

暗号:R

 S
界说:( R

 S =

 )
要求:( R ) 和 ( S ) 必须相容。
性子:( R

 S = S

 R )
3.3.2 差、交同理


3.3.3 笛卡尔积 (Cartesian Product)

暗号:R

 S
界说:( R

 S = { t q | t

 R

 q

 S } )
假设:假设 ( R ) 和 ( S ) 的属性不相交。
性子:( R

 S = S

 R )

示例:
关系 ( R ) 和 ( S ) 的笛卡尔积效果展示了所有可能的组合。

3.3.4 选择 (Select)

暗号:

   ( p ) 被称为选择谓词。
界说:

 =

此中 ( p ) 是命题演算中的公式,由 (

 )(和)、(

 )(或)、(

 )(非)等连接词组成。
示例
关系 R:Student,选择年事小于20岁的学生:


3.3.4.1 操作符优先级

操作符的优先级序次如下:

3.3.5 投影 (Project)

暗号:

   ( A1, A2, ..., Ak ) 是属性名称,( R ) 是关系名称。
界说:
投影的效果是通过删除未列出的列而获得的具有 ( k ) 列的关系。
由于关系是聚集,因此效果中重复的行会被删除。
示例:
关系 R:Student
投影得到学生的名字和年事:

投影得到学生的名字和部门编号:

组合操作:先选择部门编号为“03”且年事大于19岁的学生,再投影得到学号和名字:


3.3.6 连接 (Join)

为什么利用连接 (Why use Join?)

暗号: R

 S
界说: R


θ-连接 通常与选择和投影一起利用。
连接操作示例:
示例 1
展示了关系R和S的笛卡尔积与连接的区别。

示例 2
选择学历不低于岗位要求的员工,找出所有员工的姓名及其可能竞聘职位的名称。

步骤 1:笛卡尔积
归并员工和职位两个关系。
步骤 2:选择
过滤出学历不低于岗位要求的员工。
步骤 3:投影
最终效果仅保留员工编号、姓名和职位名称。
3.3.7 更名 (Rename)

暗号:

 
界说:
将一个关系重命名为另一个不同的名称。
复制一个关系并赋予新名称。

,此中



关系名不同,但结构相同。
示例
选择既修读过“2015030101”又修读过“2015040101”的课程编号列表。

3.3.8 各类连接

3.3.8.1 等值连接(Equal-Join)

暗号:

界说:


等值连接是 θ-连接的一种特别情况,此中连接条件是相等比较(=)
示例:
展示了关系 ( R ) 和 ( S ) 的等值连接:


3.3.8.2 自然连接(Natural-Join)

暗号:

界说:

自然连接要求 R 和 S 具有相同的属性,且在效果中删除重复的列。
自然连接是等值连接的一种特别情况,它不光检查相等条件,还自动去除重复的属性。

示例:
展示了关系 R 和 S 的自然连接:


3.3.8.3 外连接(Outer Join)

查询:列出所有西席的全部信息。
查询语句:


标题:只利用内连接时,编号为“003”的西席的信息丢失了。

为什么利用外连接



外连接范例

只返回两个关系中匹配的元组。

主要用于保留左表中的所有记录,纵然在右表中没有对应的匹配记录。
示例:列出所有西席的信息,纵然他们没有传授任何课程。


主要用于保留右表中的所有记录,纵然在左表中没有对应的匹配记录。
示例:列出所有课程的信息,纵然这些课程没有任何西席传授。


返回左右关系中的所有元组,岂论是否存在匹配。
示例:列出所有西席和所有课程的信息,岂论是否存在匹配。


3.3.9 除法(Division)

符号表示:

关系模式:

除法运算效果:


适用于包罗“对于所有...”的查询。
数学界说:


示例:通过除法找出选了全部课程的同砚的学号


3.4 元组关系演算 (2024不考)

3.4.1 界说与底子

元组关系演算公式:



关系:
元组关系演算基于谓词演算(Predicate Calculus),用于数理逻辑中的查询表达。

元组关系演算的界说
非过程化查询语言:
元组关系演算是一种非过程化查询语言,每个查询形式为



术语表明:


3.4.2 谓词演算公式的构成

组成部分:



3.4.3 原子公式

元组在关系中:


属性值比较:



示例:( t[A] θ u[B] )
查询:找出所有不是最年轻的学生。
查询语句:



3.4.4 连接词

连接词的界说:


连接词的利用:
查询示例:
查询1:找出所有年事小于20岁的男学生。

查询2:找出所有03号系年事小于20岁的男学生。

查询3:找出所有不在03号系的学生。

查询4:找出所有不属于年事小于20岁的男学生的学生。


3.4.5 量词

量词的界说:
如果 F 是一个公式,则 ( ∃ t ∈ R (F(t)) ) 也是一个公式。
如果 F 是一个公式,则 ( ∀ t ∈ R (F(t)) ) 也是一个公式。

量词的利用
查询示例:
查询1:找出所有不是最年轻的学生。

查询2:找出所有每门课效果都大于60分的学生。

查询3:找出所有就读于“盘算机科学”系的学生。
查询语句:

查询4:找到所有年事比“Sun Mei”小的学生。

查询5:找到选修了所有课程的学生。

查询6:找到每个学生的分数都大于60分的系信息。


3.4.6 运算符的优先级

优先级序次:
( ) 、 ¬ 、∧ 、∨ 、∃ 、∀
示例查询:


3.4.7 关系代数与元组关系演算的结合

查询 1:列出选修了由西席编号为“001”的西席授课的至少一门课程的所有学生的名字。
关系代数:

元组关系演算:


查询 2:列出没有选修由西席编号为“001”的西席授课的课程的所有学生的名字。
关系代数:

元组关系演算:


查询 3:列出选修了由西席编号为“001”的西席授课的所有课程的学生的名字。
关系代数:

元组关系演算:


查询 4:列出没有选修由西席编号为“001”的西席授课的至少一门课程的所有学生的名字。
关系代数:

元组关系演算:


焦点概念
存在量词 (∃):表示存在至少一个元组满足条件。
全称量词 (∀):表示所有元组都满足条件。
逻辑运算符:
与 (∧):表示两个条件都为真。
或 (∨):表示至少一个条件为真。
非 (¬):表示条件为假。
应用场景
复杂查询:用于描述需要复杂逻辑判定的查询。
多表关联:能够处置惩罚多表之间的关联和过滤条件。

第四章 结构化查询语言

4.1 SQL 概述 (Overview of SQL)

4.1.1 SQL 操作


创建 (Create)
修改 (Alter)
删除 (Drop)

插入 (Insert)
更新 (Update)
删除 (Delete)
查询 (Select)

授权 (Grant)
收回 (Revoke)

4.1.2 数据界说语言 (DDL)

允许指定一组关系及每个关系的详细信息,包括:

4.1.3 SQL 中的域范例



4.1.4 SQL 中的日期和时间范例


比方:date '2001-7-27'

比方:time '09:00:30' 或 time '09:00:30.75'

比方:datetime '2012-3-13 08:25:30.75'
*其他:所有域范例允许利用空值(null),声明属性为 not null 则克制该属性为空

4.2 SQL-DDL/DML:创建数据库 (Create Database)



4.2.1 SCT 数据库示例

Student 表:( Sno ) char(10), ( Sname ) char(20), ( Gender ) char(2), ( Age ) integer, ( Dno ) char(2), ( Class ) char(8)
Dept 表:( Dno ) char(2), ( Dname ) char(20), ( Dean ) char(20)
Course 表:( Cno ) char(3), ( Cname ) char(30), ( Hours ) integer, ( Credit ) float(1), ( Tno ) char(3)
Teacher 表:( Tno ) char(3), ( Tname ) char(30), ( Dno ) char(2), ( Salary ) float(2)
SC 表:( Sno ) char(10), ( Cno ) char(3), ( Score ) float(1)

4.2.2 创建数据库

下令:Create database db_name;
示例:Create database SCT;
创建表
下令:Create table R (A1 D1, A2 D2, ..., An Dn, (integrity-constraint1), ..., (integrity-constraintk));
表明:

示例:
Create Table Student (Sno char(10) Not Null, Sname char(20), Gender char(2), Age integer, Dno char(2), Class char(8));

4.2.3 创建表中的完备性约束



这里界说了Student表,此中Sno为主键且不能为空,Age字段必须大于12。

4.2.4 插入数据和删除数据

插入数据
利用 INSERT INTO 下令:
Insert into R [(A1, A2, ..., An)]
values (value1, value2, ..., valuen);
示例:
Insert into Student values ('2015030101', 'Li Jian', 'M', 20, '03', '20150301');
注意:如果违背任何完备性约束,插入操作将失败。

删除数据
利用 DELETE FROM 下令删除表中的所有元组:
示例:
注意:后续我们将学习怎样删除特定的元组。

4.3 SQL-DML:SELECT 语句

SQL 基于聚集和关系操作,经过一定的修改和加强。
典型的 SQL 查询形式
这个查询等价于关系代数表达式:

SQL 查询的效果是一个关系。

4.3.1 SELECT 子句

SELECT 子句列出查询效果中所需的属性,对应于关系代数中的投影操作。
示例
找出所有学生的名字:
Select Sname From Student;
在关系代数中,这个查询等价于:

注意:SQL 名称不区分大小写,可以利用大写或小写字母。
星号 (*) 表示选择所有属性:
Select * From Student;

SQL 允许关系中有重复值
去除重复值,在 SELECT 后插入关键字 DISTINCT:
示例:找出效果大于95的所有学生学号,去除重复:
elect distinct Sno From SC Where score > 95;
保留重复值,关键字 ALL 表示不去除重复值:
示例:
Select all Sno From SC Where score > 95;

SELECT 子句中可以包罗算术表达式


4.3.2 WHERE 子句

WHERE 子句指定查询效果必须满足的条件,对应于关系代数中的选择谓词。
找出所有在 '03' 号系且年事小于20岁的学生姓名:
Select Sname
From Student
Where Dno = '03' and Age < 20;
比较效果可以利用逻辑连接词 and, or, not 组合

SQL 包罗 BETWEEN 比较操作符
示例:找出工资在3000到4000之间的西席姓名:
Select Tname
From Teacher
Where Salary between 3000 and 4000;
示例:找出年事在19到21岁的学生姓名:
Select Sname
From Student
Where Age between 19 and 21;

注意利用 and, or, not 时的优先序次
Select Tname
From Teacher
Where Salary < 2000 or (Salary > 2500 and Dno = '03');

列出选修了课程 '001' 或 '002' 的所有学生的学号
Select Sno
From SC
Where Cno = '001' or Cno = '002';

4.3.3 FROM 子句

FROM 子句列出查询中涉及的关系,对应于关系代数中的笛卡尔积操作。
示例
找出 Student 和 SC 表的笛卡尔积:
Select *
From Student, SC;
找出选修了课程编号为 '002' 的所有学生的姓名:
Select Sname
From Student, SC
Where Student.Sno = SC.Sno and Cno = '002';

4.3.4 重命名操作

SQL 允许利用 AS 子句对关系和属性进行重命名
示例:
old_name as new_name
找出所有学生的名字、学号和年事,并将列名 Sno 重命名为 Student_ID:
Select Sname, Sno as Student_ID, Age
From Student;

示例:找出选修了课程编号为 '003' 的所有学生的名字和效果:
Select T.Sname, S.score
From Student as T, SC as S
Where T.Sno = S.Sno and S.Cno = '003';

4.3.5字符串操作:LIKE 和 NOT LIKE

SQL 包罗用于字符串比较的字符串匹配操作符

示例:找出姓氏为 '刘' 的所有学生的名字和年事:
Select Sname, Age
From Student
Where Sname like '刘%';
查询名字是“刘某某”的学生的名字和年事
Select Sname, Age
From Student
Where Sname like '刘_ _';
说明:利用LIKE操作符和下划线(_)进行字符串匹配,此中每个下划线代表一个字符。
查询姓氏不是“刘”的学生的名字和年事
Select Sname, Age
From Student
Where Sname not like '刘%';
说明:利用NOT LIKE操作符和百分号(%)进行字符串匹配,百分号代表任意多个字符。

4.3.6 效果排序:ORDER BY

有时候需要对查询效果进行重新排序
ORDER BY 子句

示例:按学号升序排列显示所有学生的学号和姓名:
Select Sno, Sname
From Student
Order by Sno asc;
示例:按效果降序排列显示效果大于90并选修了课程'002'的学生学号:
Select Sno
From SC
Where Cno = '002' and Score > 90
Order by Score desc;

4.3.7 多表连接操作

4.3.7.1 等值连接 (Equal-Join)

多表连接的基本结构
Select A1, A2, ..., An
From R1, R2, ..., Rm
Where P;
关系代数表示为:

示例:找出选修了课程'001'的所有学生的名字,并按效果降序排列:
Select Sname
From Student, SC
Where Student.Sno = SC.Sno and SC.Cno = '001'
Order by Score DESC;
示例:三表连接,找出选修了数据库课程的所有学生的名字,并按效果降序排列:
Select Sname
From Student, SC, Course
Where Student.Sno = SC.Sno and SC.Cno = Course.Cno and Cname = 'Database'
Order by Score DESC;
4.3.7.2 不等值连接 (Not Equal-Join)

示例:找出薪水不同的两位西席的名字:
Select T1.Tname, T2.Tname
From Teacher T1, Teacher T2
Where T1.Salary > T2.Salary;
示例:找出年事不同的两位学生的名字:
Select S1.Sname as Stud1, S2.Sname as Stud2
From Student S1, Student S2
Where S1.Age < S2.Age;
示例:列出选修了课程'001'和'002'的所有学生的学号:
Select S1.Sno
From SC S1, SC S2
Where S1.Sno = S2.Sno and S1.Cno = '001' and S2.Cno = '002';
示例:列出同时选修了课程'001'和'002',且'001'课程效果高于'002'课程效果的学生学号:
Select S1.Sno
From SC S1, SC S2
Where S1.Sno = S2.Sno and S1.Cno = '001' and S2.Cno = '002' and S1.Score > S2.Score;
示例:列出未选修任何由“李敏”传授课程的所有学生的名字:
Select Sname
From Student S, SC, Course C, Teacher T
Where S.Sno = SC.Sno and SC.Cno = C.Cno and C.Tno = T.Tno and T.Tname <> 'Li Min';

4.3.8 嵌套子查询




4.3.8.1 嵌套子查询:[not] in

基本语法
Expression 通常是列名或常量。
示例:列出“刘刚”和“张强”的所有信息:
Select *
From Student
Where Sname in ('Liu Gang', 'Zhang Qiang');
示例:列出选修课程号为'001'的所有学生的学号和名字:
Select Sno, Sname
From Student
Where Sno in (Select Sno From SC Where Cno = '001');
示例:列出选修了课程'001'和'002'的所有学生的学号:
Select Sno
From SC
Where Cno = '001' and Sno in (Select Sno From SC Where Cno = '002');
示例:列出未选修任何由“李敏”传授的课程的所有学生的名字:
Select Sname
From Student
Where Sno not in (Select Sno
     From SC, Course C, Teacher T
     Where SC.Cno = C.Cno and C.Tno = T.Tno and T.Tname = 'Li Min');

4.3.8.2 相对子查询与非相对子查询

示例:包括外层查询和内层查询:


如果内层查询可以独立执行且不需要从外层查询中导入参数值,则称为非相对子查询。
有时内层查询需要从外层查询中导入参数值,称为相对子查询
示例:列出未通过任何课程考试的所有学生的名字:
Select Sname
From Student S1
Where 60 > all 
(Select Score
From SC
Where SC.Sno = S1.Sno);

4.3.8.3 嵌套子查询some / all

基本语法
Expression θ some (subquery);
Expression θ all (subquery);
此中 θ 为比较操作符(>, >=, <, <=, =, <>)。
表明
Expression θ some (subquery) 等价于存在某个子查询效果使得表达式为真。
Expression θ all (subquery) 等价于所有子查询效果使得表达式为真。
示例
(5 < some (5, 6)) 为真,因为 5 < 6。
(5 = some (5, 6)) 为真,因为 5 = 5。
示例
(5 < all (5, 6)) 为假,因为 5 不小于 5。
(5 = all (5)) 为真,因为 5 即是 5。

找出工资最低的西席姓名:
Select Tname
From Teacher T1
Where T1.Salary <= all (Select Salary From Teacher);
找出选修了课程'001'但效果不是最高的所有学生的学号:
Select Sno
From SC
Where Cno = '001' and Score < some (Select Score From SC Where Cno = '001');

Select Sname
From Student S1
Where 60 > all (Select Score From SC Where SC.Sno = S1.Sno);
Select Sno
From SC
Where Cno = '001' and Score = (Select Max(Score) From SC Where Cno = '001');
Select Count(*)
From SC
Where Score = (Select Min(Score) From SC Where Sno = '2015030101');
Select Count(*)
From SC
Where Score = (Select Min(Score) From SC Where Sno = '2015030101' and Sname = '李建');

Select Sno, Sname
From Student
Where Sno in (Select Sno From SC Where Cno = '001');

Select Sno, Sname
From Student
Where Sno = some (Select Sno From SC Where Cno = '001');

Select Sno, Sname
From Student
Where Sno not in (Select Sno From SC Where Cno = '001');

Select Sno, Sname
From Student
Where Sno <> some (Select Sno From SC Where Cno = '001');
4.3.8.4 嵌套子查询[not] Exists

基本语法


列出由'李明'西席传授的所有学生的姓名
Select distinct Sname
From Student S, SC, Course C, Teacher T
Where exists (Select * From SC, Course, Teacher
              Where SC.Sno = S.Sno and SC.Cno = C.Cno and C.Tno = T.Tno and T.Tname = '李明');
not exists 在某些查询中非常重要和必要
列出所有选修了'2015030101'学生所选的所有课程的学生数量(至少,多于)
Select DISTINCT Sno From SC SC1
Where not exists
      ( Select * From SC SC2
        Where SC2.Sno = '2015030101' and
              not exists
              ( Select * From SC SC3
                Where SC3.Cno = SC2.Cno and SC3.Sno = SC1.Sno));

例子解析
列出所有选修了'2015030101'学生所选课程的学生数量(至少,多于)

(∀Cy)(P → Q) ≡ ¬∃Cy(¬(P → Q))
≡ ¬∃Cy(¬(¬P ∨ Q)) ≡ ¬∃Cy(P ∧ ¬Q)

列出所有选修了'2015030101'学生所选的所有课程的学生数量(至少,多于)
Select DISTINCT Sno From SC SC1
Where not exists
      ( Select * From SC SC2
        Where SC2.Sno = '2015030101' and
              not exists
              ( Select * From SC SC3
                Where SC3.Cno = SC2.Cno and SC3.Sno = SC1.Sno));

列出由'001'西席传授的所有学生的姓名


列出未选修由'李明'西席传授的任何课程的所有学生的姓名
Select Sname From Student S
Where not exists
      ( Select * From Course, SC, Teacher
        Where SC.Sno = S.Sno and SC.Cno = Course.Cno and Course.Tno = Teacher.Tno and Teacher.Tname = '李明');

列出所有利用'S1'供应的所有零件的项目编号
Select DISTINCT Jno From SPJ SPJ1
Where not exists
      ( Select * From SPJ SPJ2
        Where SPJ2.Sno = 'S1' and
              not exists
              ( Select * From SPJ SPJ3
                Where SPJ3.Pno = SPJ2.Pno and SPJ3.Jno = SPJ1.Jno));

4.3.9 效果盘算和聚合函数

SELECT 子句不光仅可以包罗列名,还可以包罗盘算表达式或聚合函数
例子:如果两个西席的工资不同,请列出他们的姓名和工资差:
Select T1.Tname as TR1, T2.Tname as TR2, T1.Salary - T2.Salary
From Teacher T1, Teacher T2
Where T1.Salary > T2.Salary;
SQL 中的聚合函数

例子
列出所有西席的工资总和:
Select SUM(Salary) From Teacher;
列出学生的数量:
Select Count(*) From Student;
列出'数据库'课程的匀称分数:
Select Avg(Score)
From Course C, SC
Where C.Cname = 'database' and C.Cno = SC.Cno;
Select 子句不光遵循列名,还包罗一些盘算表达式或聚集函数。
Select 列名 | 表达式 | 聚集函数(列名) [...]
From R1, R2, ..., Rm
Where P
比方,如果两个老师的工资不同,请列出他们的姓名和工资差额。
Select T1.Tname as TR1, T2.Tname as TR2, T1.Salary - T2.Salary
From Teacher T1, Teacher T2
Where T1.Salary > T2.Salary
4.3.9.1 聚集函数

聚集函数在SQL中

这些函数操作关系中某列的多值聚集,返回一个值。


列出所有老师工资的总和。
Select SUM(Salary) From Teacher
列出学生的数量。
Select Count(*) From Student
列出“数据库”课程的匀称分。
Select Avg(Score)
From Course C, SC
Where C.Cname='database' and C.Cno=SC.Cno

Select MAX(Score) Select MIN(Score)

4.3.10 group by分组与Having子句

分组与Having子句
Select Cno, Avg(Score) From SC Group by Cno
Select Sno, Avg(Score) From SC Group by Sno
注意:Select子句中除聚集函数外的属性必须出现在Group by列表中。



Select Sno
From SC
Where Score < 60 
Group by Sno 
having Count(*) > 2

Select Sno,Avg(Score)
From SC
Where Sno in (Select Sno
From SC
Where Score<60 
Group by Sno 
Having Count(*)>2

Group by Sno 


4.3.11 聚集操作(union/intersect/except)

聚集操作


示例:
列出修了‘002’或‘003’课程的学生人数。
Select Sno From SC Where Cno = '002' 
Union [all]
Select Sno From SC Where Cno = '003'
表明:
在SQL中,聚集操作如UNION、INTERSECT和EXCEPT用于归并或比较两个或多个效果集。UNION操作符用于归并两个效果集,并自动消除重复项。INTERSECT操作符返回两个效果会合共有的行,而EXCEPT操作符返回在第一个效果会合但不在第二个效果会合的行。
4.3.12 空值

空值




示例:5 + null 效果为 null;100 * null 效果为 null;等等。

示例:5 < null 效果为 false;null = null 效果为 unknown;null < null 效果为 unknown;

示例:
Select Avg(Score) From SC;
Select Count(*) From SC;


4.3.13 关系连接操作

连接操作主要包罗三个要素:连接范例(Join type)、连接条件(Join condition)和最终效果。
4.3.13.1 连接范例(Join Type)

关系连接(Join operation)是关系数据库中最基本且最重要的操作之一。它用于将两个关系(表)结合起来,生成一个新的关系作为效果。其主要目的是从多个表中获取相关数据。
连接范例决定了在连接过程中如那边理在一个关系中但不在另一个关系中的元组。主要的连接范例包括:

4.3.13.2 连接条件(Join Condition)

连接条件界说了两个表中哪些记录匹配,以及连接效果中包罗哪些属性。常见的连接条件有:


实例讲解
关系Loan
Loan_number

Branch_name

Amount

L-170

Downtown

3000

L-230

Redwood

4000

L-260

Perryridge

1700

关系Borrower
Customer_name

Loan_number

Jones

L-170

Smith

L-230

Hayes

L-155


4.3.13.4 内连接(Inner Join)

SELECT *
FROM Loan
INNER JOIN Borrower ON Loan.Loan_number = Borrower.Loan_number;
效果:
Loan_number

Branch_name

Amount

Customer_name

L-170

Downtown

3000

Jones

L-230

Redwood

4000

Smith


4.3.13.5 自然内连接(Natural Inner Join)

SELECT *
FROM Loan
NATURAL JOIN Borrower;
效果:
Loan_number

Branch_name

Amount

Customer_name

L-170

Downtown

3000

Jones

L-230

Redwood

4000

Smith


4.3.13.6 左外连接(Left Outer Join)

SELECT *
FROM Loan
LEFT OUTER JOIN Borrower ON Loan.Loan_number = Borrower.Loan_number;
效果:
Loan_number

Branch_name

Amount

Customer_name

L-170

Downtown

3000

Jones

L-230

Redwood

4000

Smith

L-260

Perryridge

1700

NULL


4.3.13.7 右外连接(Right Outer Join)

SELECT *
FROM Loan
RIGHT OUTER JOIN Borrower ON Loan.Loan_number = Borrower.Loan_number;
效果:
Loan_number

Branch_name

Amount

Customer_name

L-170

Downtown

3000

Jones

L-230

Redwood

4000

Smith

NULL

NULL

NULL

Hayes

4.3.13.8 全外连接(Full Outer Join)

SELECT *
FROM Loan
FULL OUTER JOIN Borrower ON Loan.Loan_number = Borrower.Loan_number;
效果:
Loan_number

Branch_name

Amount

Customer_name

L-170

Downtown

3000

Jones

L-230

Redwood

4000

Smith

L-260

Perryridge

1700

NULL

NULL

NULL

NULL

Hayes

连接查询实例
假设我们需要列出所有借款人和贷款的详细信息,并按贷款金额排序:
SELECT Customer_name, Loan_number, Branch_name, Amount
FROM Loan
FULL OUTER JOIN Borrower USING (Loan_number)
ORDER BY Amount;

4.4 SQL-DML:INSERT/DELETE/UPDATE

概述:
数据操作语言 (DML) 是SQL语言的一部分,用于查询和修改数据库中的数据。主要包括四种操作:插入 (INSERT)、删除 (DELETE)、更新 (UPDATE) 和选择 (SELECT)。以下将重点先容插入、删除和更新操作。

4.4.1 插入操作 (INSERT)

插入操作用于向表中添加一条或多条记录。基本语法如下:
INSERT INTO 表名 (列1, 列2, ..., 列N) VALUES (值1, 值2, ..., 值N);
示例:
向学生表中插入一条新的学生记录:
INSERT INTO Student VALUES ('2015030101', 'Li Jian', 'M', 20, '03', '20150301');
高级插入:
将一个查询效果插入到新表中。比方,我们创建一个新的表 St,其结构为 St(Sno, Sname, avgScore),并将 Student 和 SC 两个表的查询效果插入到 St 表中:
INSERT INTO St (Sno, Sname, avgScore)
SELECT Sno, Sname, AVG(Score)
FROM Student, SC
WHERE Student.Sno = SC.Sno
GROUP BY Student.Sno;

4.4.2 删除操作 (DELETE)

删除操作用于从表中删除一条或多条记录。基本语法如下:
DELETE FROM 表名 WHERE 条件;
示例:
从 SC 表中删除记录:
DELETE FROM SC;
根据特定条件删除记录:
DELETE FROM Student WHERE Sno = '2015030102';
高级删除:
删除所有至少有四门课程不及格的学生:
DELETE FROM Student
WHERE Sno IN (
  SELECT Sno
  FROM SC
   WHERE Score < 60
  GROUP BY Sno
HAVING COUNT(*) >= 4
);

4.4.3 更新操作 (UPDATE)

更新操作用于修改表中的记录。基本语法如下:
UPDATE 表名 SET 列1 = 值1, 列2 = 值2, ... WHERE 条件;
示例:
将西席表中所有西席的工资提高10%:
UPDATE Teacher
SET Salary = Salary * 1.1;
根据条件更新工资:
UPDATE Teacher
SET Salary = Salary * 1.2
WHERE Dno IN (
     SELECT Dno
FROM Dept
WHERE Dname = 'Computer Science'
);
高级更新:
若学生效果低于匀称分,则将其效果提高5%:
UPDATE SC
SET Score = Score * 1.05
WHERE Cno = '001' AND Score < (
SELECT AVG(Score)
FROM SC
WHERE Cno = '001'
);
将 Li Ji 的效果更新为其班级的匀称分:
UPDATE SC
SET Score = (
SELECT AVG(SC2.Score)
FROM SC SC1, Student S1, SC SC2, Student S2
WHERE S1.Class = S2.Class
AND SC1.Sno = S1.Sno
AND SC2.Sno = S2.Sno
AND S1.Sname = 'Li Ji'
AND SC1.Cno = '001'
AND SC1.Cno = SC2.Cno
)
WHERE Cno = '001' AND Sno IN (
SELECT Sno
FROM Student
WHERE Sname = 'Li Ji'
);

4.5 数据库视图详解

视图 (VIEW) 概述
视图是数据库中的一种捏造表,它通过SQL查询从一个或多个表中提取数据并生成效果集。视图不存储现实数据,只存储查询效果,这使得视图非常机动且高效。
视图的优点

视图的创建

创建视图的基本语法如下:
CREATE VIEW 视图名 [(列名1, 列名2, ...)] AS 子查询;
示例:
创建一个视图 CompStud,包罗所有盘算机科学系学生的信息:
CREATE VIEW CompStud AS
SELECT *
FROM Student
WHERE Dno IN (
  SELECT Dno
  FROM Dept
  WHERE Dname = 'Computer Science'
);
创建一个视图 Teach,包罗西席传授课程的信息:
CREATE VIEW Teach AS
SELECT T.Tname, C.Cname, Credit
FROM Teacher T, Course C
WHERE T.Tno = C.Tno;
视图的查询

通过视图,我们可以执行与普通表相同的查询操作。比方:



视图的更新

大多数SQL实现只允许在简单视图(不含聚合)的情况下更新。视图可以更新的条件包括:

示例:
创建一个视图 ClassStud,包罗学生的姓名和班级信息:
CREATE VIEW ClassStud (Sname, Sclass) AS
SELECT Sname, Class
FROM Student;
向 ClassStud 插入数据:
INSERT INTO ClassStud
VALUES ('Qian San', '20150402');
更新视图 S_G 中的匀称效果:
UPDATE S_G
SET AvgS = 85
WHERE Sno = '2015030102';
数据界说语言 (DDL) 操作详解

删除操作 (DROP)

删除操作用于移除数据库中的视图、表或数据库。
语法:



示例:



修改操作 (ALTER)

修改操作用于修改数据库表的结构,如添加、删除或修改列。
语法:



示例:




第五章 数据库筹划

5.1 数据库筹划概述

数据库筹划界说
数据库筹划是创建一个详细的数据模型的过程。

数据库筹划 — 模型化
什么是模型?
模型是对现实体系(如企业)的目标、结构和行为的抽象描述。现实天下的某个部分视观察者的观点和任务设置而定。

数据库筹划:
天下上每个对象都有许多信息。
应该涉及多少以及什么样的信息?
这取决于要办理的标题。
比方:


筹划阶段:
1.描述数据需求
2.概念筹划

3.数据库实行

筹划替换方案:
必须避免两大陷阱:


5.2 实体-关系模型

5.2.1 实体(聚集)

实体:现实天下中与其他对象区别开来的“事物”或“对象”。
实体集:同范例实体的聚集,它们具有相同的属性。

实体的第一步是找出相关应用领域中的所有实体。
比方,图书管理中的实体有:读者、册本、书架。

5.2.2 属性

属性:一个实体由一组属性表示,属性是每个实体成员拥有的描述性特性。
值:每个实体都有其属性的值。

示例


键:实体的键是一组属性,这些属性足以区分实体。
比方,读者的键是LB_ID,因为LB_ID的值是唯一的,其他属性的值可能会重复。

简单属性与复合属性(Simple and Composite attribute)


单值属性与多值属性(Single-valued and Multi-valued)


派生属性(Derived attribute):可以从其他相关属性或实体的值中导出。
比方,生日可以导出年事。
空值属性与非空值属性:当实体没有属性值时,属性取空值。

弱实体与强实体(Weak Entity and Strong Entity)
弱实体:依赖于其他实体存在的实体。
强实体:不依赖于其他实体存在的实体。
例子

合同(强实体)和合同条目(弱实体)的关系图。


实体分类
分类是辨认、区分和理解对象(实体)的过程。分类意味着将对象(实体)分为某些特定用途的类别。
学生分类:本科生、研究生、硕士、博士。

关系是多个实体之间的关联。




3度关系:供应商、零件和项目。


1度关系:零件与部门之间的关系。


角色(Role)
实体在关系中扮演的功能称为实体的角色。

描述性属性
关系也可以有称为描述性属性的属性。
比方:借书关系的描述性属性包括借书时间和还书时间。


描述性属性的例子包括供应数量和供应时间。

映射基数



示例




通常,到场关系的一个实体在关系中有一个最小基数和最大基数,表示为(MinCard..MaxCard)

完全到场(Full Participation)
至少有一个实体到场关系,最小基数为1。
部分到场(Partial Participation)
允许没有实体到场关系,最小基数为0。


5.3实体-关系图

E-R建模过程
1.辨认实体
2.确定每个实体的属性
3.为每个实体选择主键
4.创建实体之间的关系
5.绘制E-R模型
E-R图
常用的E-R图方法有:


5.3.1 Chen方法










读者、册本、书架之间的借阅关系。


图书管理体系中的实体及其关系,包括借书和保管关系。


复合属性、多值属性和派生属性的示例。

带有笔墨标志的线:表示实体在关系中的角色。


现实案例分析:企业员工、部门、项目之间的关系。


Chen方法:弱实体



三角形带有isa笔墨:表示分类。

5.3.2 Crow’s Foot方法








映射基数


示例






 

分类
示例
车辆分类为汽车和卡车的关系图。

IDEF1X 方法案例
展示了订单、产品、服务等的关系和属性。


概念筹划阶段
1.辨认并列出实体。
2.辨认业务规则,这些规则有助于辨认实体间的关系,并同时找到约束条件。
3.辨认实体的属性和主键。
4.检查实体间的关系。
5.绘制ER图。

5.3.3 业务规则

1.描述特定构造内的政策、程序或原则。
2.描述在构造情况内创建/执行操作的规则。
3.必须书面形式。
4.必须易于理解和广泛传播。

业务规则的来源
1.公司经理。
2.政策制定者。
3.部门经理。
4.书面文档(程序、标准、操作手册)。
5.与最终用户的直接访谈。

概念筹划案例研究








概念筹划案例研究
展示了员工登记表,包括员工编号、姓名、部门、职位、入职日期、学历、培训经历、工作经历等信息。

5.4 转换ER模型到关系模式的步骤

以下是从ER模型(实体-关系模型)转换到关系模式的详细步骤和表明:
目标:
1.从概念数据模型中派生关系聚集

2.利用规范化技术验证这些关系

3.验证逻辑数据模型是否支持所需的事务

4.将多个用户视图归并为全局逻辑数据模型


详细步骤:
5.4.1 从逻辑数据模型派生关系


1.复合属性

2.多值属性

3.一对一(1:1)关系

4.一对多(1:n)关系

5.多对多(m:n)关系

6.弱实体

7.多度关系

这些步骤确保了从ER模型到关系模式的转换过程清晰、准确,并且最终的关系模式能够有用支持数据库体系的所有事务和操作。

分类实体(Classified Entity)
在ER模型中,分类实体通常包罗一个高层实体和一个或多个低层实体。转换时需要注意以下几点:

详细实例:
图中展示了一个ER图的转换示例:


有两种转换方式:
1.方式1:

2.方式2:


5.4.2 利用规范化验证关系



5.4.3 验证关系是否支持用户事务

确保逻辑数据模型中的关系支持所需的用户事务:

5.4.4 检查完备性约束


主要包括:


5.4.5 与用户一起审查逻辑数据模型



5.4.6 归并逻辑数据模型到全局模型




5.5 规范化(Normalization)

本部分的目标是学习以下内容:
1.规范化的目的

2.没有规范化的潜在标题

3.函数依赖的概念

4.怎样进行规范化过程

5.怎样辨认第一范式(1NF),第二范式(2NF),第三范式(3NF)和BC范式(BCNF)

6.违背1NF、2NF、3NF和BCNF规则的关系所存在的标题


5.5.1 为什么规范化(Why normalize)

5.5.1.1 不良数据库筹划的例子

以下是一个公司的订单体系信息表的示例,展示了不良数据库筹划:
Cno   Cname  Caddr      Ono    Pno   Pname  Pprice  Qty
C001  Kris   New York    O001   P001  iPhone  600     3
C001  Kris   New York    O001   P002  iTouch  350     2
C001  Kris   New York    O002   P003  iPad    900     5
C002  Jenny  Washington  O003   P001  iPhone  600     8
字段表明:

标题


导致上述标题的原因


5.5.1.2 办理方案:规范化

通过规范化,将上述关系拆分为以下三个关系:
1.Customer(Cno, Cname, Caddr)
2.Product(Pno, Pname, Pprice)
3.Order(Ono, Cno, Pno, Qty)

5.5.1.3 规范化

界说

适合的关系特性


5.5.1.4 规范化的好处



5.5.1.5 数据冗余和更新异常

具有冗余信息的关系可能会产生更新异常,主要有三种范例:
1.修改异常:因遗漏更新而导致的不同等性。
2.插入异常:由于某些信息无法插入而引发的标题。
3.删除异常:因删除导致的非预期数据丢失。
例子
5.5.1.6更新异常的原因


5.5.1.7 各种范式



通过这些规范化步骤,可以有用减少数据冗余,避免更新异常,从而提高数据库的完备性和同等性。

5.5.2 函数依赖(Functional Dependencies)

5.5.2.1 函数依赖的界说:


例子
学生关系

例子分析
考虑一个关系

 的实例
  A  B


5.5.2.2 常见的函数依赖范例

1.平常依赖与非平常依赖

2.例子


5.5.2.3 部分函数依赖与完全函数依赖

1.部分函数依赖

2.完全函数依赖

3.例子



5.5.2.4 候选键与非主属性

1.候选键

2.主属性

3.非主属性


5.5.2.5 传递依赖

1.传递函数依赖

2.例子


5.5.3 第一范式(1NF)

1.界说

2.例子



5.5.4 第二范式(2NF)

1.界说

2.怎样满足 2NF

3.例子


这些步骤和概念是理解和应用数据库规范化的底子,帮助我们筹划更高效和可靠的数据库。
5.5.5 第三范式(3NF)

第三范式 (3NF):对于关系

,如果每个非主属性都不传递依赖于候选键,那么我们称关系

 满足 3NF。
怎样使关系满足 3NF
1.分析关系的所有函数依赖
2.如果有些非主属性传递依赖于候选键,则将关系分解为两个新关系。
例子

[1] Sno → SDept
[2] SDept → Dname
[3] Sno → Dname (传递依赖)
分解后的关系:
SC(Sno, Cno, Score)
SD(Sno, SDept)
Dept(SDept, Dname)
5.5.6 Boyce-Codd 范式(BCNF)

Boyce-Codd 范式 (BCNF):对于关系

,如果每个类似于

 的函数依赖中,

 必须是候选键,那么我们称关系

 满足 BCNF。
怎样使关系满足 BCNF
1.分析关系的所有函数依赖
2.如果有些函数依赖不满足 BCNF,则将关系分解为两个新关系。
例子

[1] (Sno, Cno) → Tno
[2] (Sno, Tno) → Cno
[3] (Cno) → Tno
[4] (Tno) → Cno

SC(Sno, Cno)
CT(Cno, Tno)
规范化与连接操作的衡量

SC(Sno, Cno, Score)
SD(Sno, SDept)
Dept(SDept, Name)

结论

数据库筹划的意义和阶段: 

E-R 模型

从 E-R 模型到关系模式的转换

规范化

通过上述过程和方法,能够有用地筹划和实现一个高效、无冗余且同等性强的数据库体系。

第六章:数据库的完备性

6.1 基本完备性概念

关系模型中的完备性
在特定应用的数据库筹划中有许多完备性约束

1.怎样在数据库中界说完备性约束

2.完备性约束怎样影响数据库




数据库完备性的控制机制

完备性检查是基于完备性约束进行的,因此完备性约束的界说是数据库完备性控制机制的焦点。

6.2 完备性约束的分类

6.2.1 按约束对象的粒度分类

1.列级约束

2.元组级约束

3.关系级约束


6.2.2 按约束状态分类

1.静态约束

2.动态约束

动态约束的例子


6.2.3 静态列约束



6.2.4 静态元组约束



6.2.5 静态关系约束



6.2.6 动态列约束



6.2.7 动态元组约束



6.2.7 动态关系约束



6.3 完备性约束的表示方法

6.3.1 完备性约束的五元组表示法

完备性约束可以表示为五元组:( {D, O, A, C, P} )


示例 01
约束:“学生编号不能为空” 在学生表中。


示例 02
约束:“传授的工资不能低于 3600” 在西席表中。


6.4 完备性约束的实现

6.4.1 DBMS 提供的功能



6.4.2 参照完备性约束的实现

数据库“员工-部门”包括两个关系:EMP 和 DEPT
1.“Deptno”是 DEPT 的主键
2.EMP 的主键是“Empno”,Deptno 是外键
3.参照关系:EMP;被参照关系:DEPT

需要考虑的四种情况
1.外键是否允许为空
2.在被参照关系中删除元组
3.在参照关系中插入元组
4.更新主键的值

6.4.2.1 外键是否允许为空



6.4.2.2 在被参照关系中删除元组


1.级联删除:删除被参照关系中的元组及其在参照关系中的对应元组。
2.受限删除:体系拒绝删除被参照关系中的元组。
3.置空删除:删除被参照关系中的元组,并将参照关系中对应元组的外键值设为空。

6.4.2.3 在参照关系中插入元组


1.受限插入:体系拒绝将元组插入参照关系中。
2.递归插入:起首插入被参照关系中的相应元组,然后再将元组插入参照关系中。

6.4.2.4 更新主键的值


1.级联更新:更新被参照关系中的主键值,并将参照关系中对应元组的外键值也进行相应更新。
2.受限更新:体系拒绝更改被参照关系中的主键值。
3.置空更新:更新被参照关系中的主键值,并将参照关系中对应元组的外键值设为空。
例子:主键值的更新

1.级联更新:更新 SC 表中元组的 Sno 为 '960123'。
2.受限更新:体系拒绝更改 Student 表中的 Sno。
3.置空更新:将 Student 表中的 Sno 更新为 '960123',并将 SC 表中对应元组的 Sno 设为空。
通过这些方法和计谋,可以确保在执行数据库操作时,参照完备性约束得以维持,从而保持数据的同等性和完备性。

好的,接下来我将对这些幻灯片的内容进行翻译并讲解。内容涉及SQL完备性约束和触发器的相关知识。我们按照每页进行讲解。

6.5 SQL语句用于完备性约束

SQL-DDL 提供了多种界说完备性约束的方法,包括如下的“创建表”语句:
CREATE TABLE tablename
(
    colname datatype [DEFAULT {default value | NULL}] [Constraint {col_constr...}],
    colname datatype [DEFAULT {default value | NULL}] [Constraint {col_constr...}],
    ...
    table_constr
);

6.5.1 列约束

列约束(col_constr):单列上的完备性约束
{ NOT NULL | CONSTRAINT constraintname { UNIQUE | PRIMARY KEY | CHECK (search_cond) | REFERENCES tablename [(colname)] [ON DELETE CASCADE] }}

列约束是在单个列上施加的限定条件。常见的列约束包括:


Create Table Student
(
    Sno char(8) primary key,
    Sname char(10),
    Gender char(2) constraint ctsGender check (Gender='M' or Gender='F'),
    Age int check (Age>=12 and Age<=50),
    Dno char(2) references Dept(Dno) on delete cascade,
    Class char(6)
);

Create Table Course
(
    Cno char(3) primary key,
    Cname char(12),
    Hours int,
    Credit float(1) constraint ctcredit check (Credit>=0.0 and Credit<=5.0),
    Tno char(3) references Teacher(Tno) on delete cascade
);

这里展示了怎样在创建表时利用列约束。Student表和Course表的示例展示了各种列约束的应用:

6.5.2 表约束

表约束(table_constr):表级别的完备性约束
[CONSTRAINT constraintname]
{
    UNIQUE (colname {, colname...}),
    PRIMARY KEY (colname {, colname...}),
    CHECK (search_condition),
    FOREIGN KEY (colname {, colname...}) REFERENCES tablename [(colname {, colname...})] [ON DELETE CASCADE]
}

表约束是在整个表级别施加的限定条件,常见的表约束包括:


Create Table Student
(
    Sno char(8),
    Sname char(10),
    Gender char(2) constraint ctsGender check (Gender='M' or Gender='F'),
    Age int check (Age>=12 and Age<=50),
    Dno char(2) references Dept(Dno) on delete cascade,
    Class char(6),
    primary key(Sno)
);

Create Table Course
(
    Cno char(3),
    Cname char(12),
    Hours int,
    Credit float(1) constraint ctcredit check (Credit>=0.0 and Credit<=5.0),
    Tno char(3) references Teacher(Tno) on delete cascade,
    primary key(Cno),
    constraint ctcc check (Hours*Credit = 20)
);
这个示例展示了怎样在表级别利用约束条件。与列级别约束不同,表级别约束可以同时涉及多个列,比方:


6.5.3复合约束示例

6.5.3.1 表约束(table_constr):复合约束示例

Create Table SC
(
    Sno char(8),
    Cno char(3),
    Score float(1) constraint ctscore check (Score>=0.0 and Score<=100.0),
    primary key (Sno, Cno),
    foreign key (Sno) references Student(Sno) on delete cascade,
    foreign key (Cno) references Course(Cno) on delete cascade
);
这个示例展示了一个包罗复合主键和多个外键的表SC。该表:


6.5.3.2 修改和删除约束

修改和删除约束
列约束和表约束可以利用Alter table语句添加、修改和删除。
ALTER TABLE tblname
    [ADD ({colname datatype [DEFAULT {default_const | NULL}] [col_constr {col_constr...} | table_constr] {colname...}})]
    [DROP {COLUMN colname | (colname {, colname...})}]
    [ALTER COLUMN colname datatype [DEFAULT {default_const | NULL}] [NOT NULL] [col_constr {col_constr...} | table_constr]]
    [ADD CONSTRAINT constr_name]
    [DROP CONSTRAINT constr_name]
利用ALTER TABLE语句,我们可以在表创建后对表的结构进行修改,包括添加、删除和修改列约束和表约束。比方,可以添加新的列,删除现有的列,修改列的数据范例和约束条件,还可以添加和删除表级别的约束。

示例
修改和删除约束:示例
Alter Table SC
    DROP CONSTRAINT ctscore;

Alter Table SC
    ALTER COLUMN Score float(1) constraint ctscore check (Score>=1.0 and Score<=150.0);
这个示例展示了怎样利用ALTER TABLE语句删除和修改约束。在第一个语句中,删除了SC表上的ctscore约束。在第二个语句中,修改了Score列的数据范例,并重新界说了ctscore约束,使其范围变为1.0到150.0。

6.6 触发器概述

6.6.1 触发器用于动态完备性约束

-- 为什么我们需要触发器
典型应用:银行ATM体系
(标题:张三的账户余额没有自动变化)
触发器是一种特别的存储过程,它在某个事件(如插入、更新或删除)发生时自动执行。这里以银行ATM体系为例,当用户进行存取款操作时,账户余额需要自动更新。通过触发器,我们可以自动执行相关操作,确保数据的动态同等性。


要筹划一个触发器机制,我们必须:

触发器用于在数据操作发生时自动执行特定的操作。与静态完备性约束不同,触发器可以处置惩罚更复杂的逻辑。筹划触发器时,需要明确触发器触发的条件以及详细执行的操作,以确保数据的同等性和完备性。

6.6.2 触发器范例

触发器范例:

当在一个表上执行插入、删除、更新操作时,DBMS将自动执行触发器语句,并确保数据操作符合触发器的规则。
触发器根据触发的事件范例分为插入触发器、删除触发器和更新触发器。当相关操作发生时,DBMS会自动执行预界说的触发器逻辑,以确保数据操作的规则和约束得到遵守。

6.6.3 插入表和删除表

触发器用于动态完备性约束
-- 插入表和删除表
当触发器执行时,体系将在内存中自动创建插入表和/或删除表。

插入表:

删除表:

当触发器执行时,DBMS会创建暂时的插入表和删除表,用于存储相关的数据变更。插入表存储新插入的数据,而删除表存储将被删除的数据。这些表是只读的,并且在触发器执行完毕后会自动删除。

触发器用于动态完备性约束
-- 插入表和删除表
存储在插入表和删除表中的信息
操作

插入表

删除表

INSERT

存储新插入的记录

-----

DELETE

-----

存储删除前的记录

UPDATE

存储更新操作后的记录

存储更新操作前的记录

这张表详细展示了在不同操作下插入表和删除表中存储的信息。在插入操作中,插入表存储新插入的记录;在删除操作中,删除表存储将被删除的记录;在更新操作中,插入表存储更新后的记录,而删除表存储更新前的记录。

6.6.4 创建触发器语句

触发器用于动态完备性约束
-- 创建触发器语句
CREATE TRIGGER trigger_name
ON table_name
[WITH ENCRYPTION]
FOR {DELETE, INSERT, UPDATE}
AS
T-SQL Statement
GO
WITH ENCRYPTION:用于加密触发器界说的SQL文本。
这展示了怎样创建触发器。CREATE TRIGGER语句用于界说触发器,包括触发器名称、作用的表、触发的事件范例(DELETE, INSERT, UPDATE)以及触发后执行的T-SQL语句。WITH ENCRYPTION选项用于加密触发器的界说。
6.6.5 插入触发器的工作原理

-- 插入触发器工作原理
1.执行INSERT语句,插入新记录。
2.执行插入触发器,将新记录从transInfo表插入到inserted表。
3.触发器检查inserted表中的新记录,并决定回滚或执行相关操作。
这表明了插入触发器的工作流程。当执行INSERT语句时,新记录起首插入到transInfo表。然后,插入触发器将新记录复制到暂时的inserted表,并对新记录进行检查,决定是否回滚或执行其他操作。

-- 插入触发器示例
[需求] 为办理银行ATM体系中的标题,当向transInfo表插入新记录时,应自动更新bank表中的currentMoney值。
[分析]
1.在transInfo表上创建INSERT触发器。
2.从插入的暂时表中获取新记录的副本。
3.检查交易范例。
4.根据交易范例更新bank表中的currentMoney值。
这个示例详细表明了怎样筹划和实现一个插入触发器,以办理银行ATM体系中的自动更新标题。详细步骤包括创建触发器,获取新插入的数据,检查交易范例,并根据交易范例更新账户余额。

CREATE TRIGGER trig_transInfo
ON transInfo
FOR INSERT AS
DECLARE @type char(4), @transMoney MONEY
DECLARE @myCardID char(10)
SELECT @type=transType, @transMoney=transMoney, @myCardID=cardID FROM inserted
IF (@type='withdraw')
    UPDATE bank SET currentMoney=currentMoney-@transMoney WHERE cardID=@myCardID
ELSE
    UPDATE bank SET currentMoney=currentMoney+@transMoney WHERE cardID=@myCardID
GO
这个示例展示了一个完备的插入触发器代码。当在transInfo表上发生插入操作时,触发器会执行以下操作:
1.获取插入记录的交易范例、金额和卡号。
2.如果交易范例为提款,更新bank表,减少对应账户的余额。
3.如果交易范例为存款,更新bank表,增加对应账户的余额。
通过这个触发器,可以实现自动更新账户余额的功能,确保数据的同等性和准确性。

好的,继承对这些幻灯片内容进行翻译和讲解,主要讲述的是删除触发器和更新触发器的内容。我们按页进行讲解。

6.6.6 删除触发器的工作原理

-- 删除触发器
工作原理:
1.执行DELETE语句,删除一条记录。
2.执行删除触发器,将从transInfo表删除的记录插入到deleted表中。
3.触发器将检查deleted表中的已删除记录,并决定回滚或执行其他相关操作。
删除触发器用于在记录从表中删除时自动执行一些操作。比方,在删除记录时,触发器会将该记录复制到暂时的deleted表中,以便后续检查或恢复操作。这可以确保在删除操作中数据的同等性和完备性。

[需求] 当从transInfo表中删除记录时,应将已删除的记录备份到bk_transInfo表中。
[分析]
1.在transInfo表上创建DELETE触发器。
2.获取已删除记录的副本。
这个示例展示了删除触发器的应用。当从transInfo表中删除记录时,触发器会将删除的记录备份到另一个表中。这是一种常见的数据保护步伐,防止重要数据在删除时丢失。

CREATE TRIGGER trig_delete_transInfo
ON transInfo
FOR DELETE AS
BEGIN
    PRINT 'Start to backup data, please wait....';
    IF NOT EXISTS (SELECT * FROM sysobjects WHERE name='bk_transInfo')
        SELECT * INTO bk_transInfo FROM deleted;
    ELSE
        INSERT INTO bk_transInfo SELECT * FROM deleted;
    PRINT 'Backup data complete, the data in backup table is as following:';
    SELECT * FROM bk_transInfo;
END
GO
这个触发器代码示例展示了怎样在删除操作时备份数据。触发器起首检查bk_transInfo表是否存在,如果不存在,则创建该表并插入已删除的记录。如果存在,则直接插入删除的记录。这样可以确保每次删除操作的记录都被备份。
6.6.7 更新触发器的工作原理

工作原理:
1.执行UPDATE语句。
2.执行更新触发器,将旧记录插入到deleted表中,将新记录插入到inserted表中。
3.触发器将检查旧记录和新记录,然后决定回滚或执行其他相关操作。
更新触发器在更新操作发生时自动执行。触发器会将更新前的旧记录保存到deleted表中,并将更新后的新记录保存到inserted表中。这种机制可以帮助追踪数据的变化,确保更新操作的完备性和同等性。

[需求] 追踪客户的交易,如果交易金额超过20000,则取消交易并给出通知。
[分析]
1.在bank表上创建UPDATE触发器。
2.获取旧记录的副本。
3.获取新记录的副本。
这个示例展示了更新触发器的现实应用。在银行体系中,如果客户的交易金额超过20000,触发器会自动取消交易并通知客户。这有助于防止大额错误交易,保护客户的资金安全。
CREATE TRIGGER trig_update_bank
ON bank
FOR UPDATE AS
BEGIN
    DECLARE @beforeMoney MONEY, @afterMoney MONEY;
    SELECT @beforeMoney=currentMoney FROM deleted;
    SELECT @afterMoney=currentMoney FROM inserted;
    IF ABS(@afterMoney - @beforeMoney) > 20000
    BEGIN
        PRINT 'Transaction Amount: ' + CONVERT(varchar(8), ABS(@afterMoney - @beforeMoney));
        RAISERROR ('Each transaction will not be more than 20000, Transaction failed', 16, 1);
        ROLLBACK TRANSACTION;
    END
END
GO
这个代码示例展示了一个更新触发器,当交易金额超过20000时自动取消交易。触发器起首获取更新前后的金额,如果差额超过20000,则触发错误并回滚事务。这种方式有用地控制了单笔交易的最大金额。
6.6.8 列更新触发器

更新触发器还可以用于检查某一列的值是否被更新。
[需求] 交易日期由体系创建,且设置为当前日期时间,克制被更新。
[分析]
利用体系函数UPDATE(column_name)来测试column_name是否被更新。
列更新触发器用于确保某些特定列的值不能被更改。比方,交易日期通常由体系生成,不允许用户修改。通过列更新触发器,可以检测到任何对交易日期的修改,并采取相应的步伐。
CREATE TRIGGER trig_update_transInfo
ON transInfo
FOR UPDATE AS
BEGIN
    IF UPDATE(transDate)
    BEGIN
        PRINT 'Transaction failed ....';
        RAISERROR ('Security Alert: Transaction datetime cannot be updated', 16, 1);
        ROLLBACK TRANSACTION;
    END
END
GO
这个代码示例展示了怎样利用列更新触发器来防止交易日期被修改。触发器检测到transDate列被更新时,会触发错误并回滚事务,从而确保交易日期保持不变。

第七章:数据库安全

7.1 安全性的基本概念

7.1.1 标题的提出


例子:


7.1.2 非法利用数据库的方法:


安全性:


7.1.3 盘算机体系安全标题的范例

1.技术安全:

2.管理安全:

3.政策法律:


7.1.4 安全控制模型



7.2 访问控制(DAC 和 MAC)

访问控制:

访问控制机制的组成:


常用方法:


7.2.1 自主访问控制DAC)


访问规则:

授权粒度:


访问权限有不同级别:


示例:


访问规则:


在 SQL 中的授权下令:


实例:


在 SQL 中的取消下令
REVOKE {all privileges | priv [, priv...]}
ON tablename | viewname
FROM {public | user [, user...]};
示例:


7.2.2 强制访问控制 (MAC)



主体与客体:


敏感度标签:


MAC 规则:

1.只有当主体的允许级别大于或即是客体的分类级别时,主体才能读取客体。
2.只有当主体的允许级别小于或即是客体的分类级别时,主体才能写入客体。

MAC 实现:


示例:
[table]
P#

  
C

  
Pname

  
C

  
Psalary

  
C

  
TC

  
Emp001

  
S

  
张三

  
U

  
10,000

  
S

  
S

  
Emp002

  
S

  
李四

  
U

  
8,000

  
S

  
C

  
Emp003

  
S

  
王五

  
U

  
4,000

  
C

  
C

  
Emp004

  
S

  
李六

  
U

  
2,000

  
C

  
C

  
Emp005

  
U

  
张四

  
U

  
1,000

  
S

  
U

  
7.3 视图和审计



7.4 统计数据库安全

统计数据库的特性:

示例:

标题:


示例 1: 以下两个查询是合法的

标题:

办理方案 1:


示例 2: 用户A合法查询如下:

标题:

办理方案 2:


办理方案 3:


第八章:事务与并发控制

8.1 事务的基本概念


1.读取(A)
2.A := A - 50
3.写入(A)
4.读取(B)
5.B := B + 50
6.写入(B)


8.1.1 事务的必要属性

示例:从账户A向账户B转账$50:
1.读取(A)
2.A := A - 50
3.写入(A)
4.读取(B)
5.B := B + 50
6.写入(B)
然而,并发执行多个事务具有显著的上风,这将在反面看到。

8.1.2 ACID 属性



8.1.3 事务状态:


SQL 中的事务示例:
Begin Transaction

exec sql ...
...
exec sql ...
exec sql commit work | exec sql rollback work

End Transaction

8.2 并发控制

8.2.1 多事务的执行


8.2.2 并发执行



8.2.3 并发控制方案



8.2.3.1 丢失更新



8.2.3.2 不可重复读



三种不可重复读


8.2.3.3 脏读


示例:

并发调度的可串行化:

怎样确保并发调度的可串行化?——锁

8.3 锁机制

锁:


8.3.1 基本锁范例



8.3.2 基本锁相容性矩阵



8.3.3 基于锁的协议



8.3.3.1 一级锁协议


示例:
防备丢失更新。
防备丢失更新
产生脏读和不可重复读

8.3.3.2 二级锁协议



防备脏读
产生不可重复读

8.3.3.3 三级锁协议



防备不可重复读

8.3.3.4 锁协议总结


·  一级锁协议:只对修改操作加锁,防止丢失更新,但不能防止不可重复读和脏读。
·  二级锁协议:对读取操作加共享锁,防止丢失更新和脏读,但不能防止不可重复读。
·  三级锁协议:在读取数据后设置共享锁,并在末了开释锁,防止丢失更新、脏读和不可重复读。


8.3.4 饥饿与死锁



8.3.4.1 饥饿



示例:
怎样防止饥饿:根据先来先服务计谋。

8.3.4.2 死锁



示例:

死锁防备:

一些防备计谋:


预声明协议(一次封锁法):


序次封锁法:

结论:


死锁检测和解除:

解除方法:


超时法:

优点:

缺点:


优先图法:

并发控制子体系定期检查优先图。如果图中存在循环,则体系中存在死锁。
选择本钱最低的事务解除,并开释该事务持有的所有锁,以使其他事务继承进行

并发控制的其他标题:






免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4