第 11章 Web数据库应用
教材:数据库技术及应用 2006年 4月
宁可、吴菁、胡海编著
本章要点
? 关系数据库
? 结构化查询语言
? 数据库设计理论
目 录
2.1 关系数据库
2.1.1 关系数据结构
2.1.2 关系操作
2.1.3 关系的完整性
2.2 SQL语言
2.2.1 SQL概述及特点
2.2.2 SQL数据定义
2.2.3 SQL数据查询
2.2.4 SQL数据操纵
2.2.5 数据控制
2.3 关系数据理论
2.3.1 关系模式可能存在的问题
2.3.2 函数依赖及规范化
小结
2.1 关系 数据库
关系数据库系统是支持关系模型的数据库
系统 。 关系模型由关系数据结构, 关系操作集合
和关系完整性约束三部分组成 。
关系数据库是表的集合,数据库中的表,数
学家称为关系。关系数据库中还定义了关系操作
和完整性约束,关系操作就是对表中的数据的处
理、查询,完整性约束就是表中的数据要满足的
条件,这些条件由数据库系统自动维护,产生违
反这些约束条件的对数据的操作会被拒绝执行。
2.1.1 关系数据 结构
在关系模型中, 无论是实体还是实体之间的联系均由单一的
结构即关系 ( 表 ) 来表示 。 关系模型是建立在集合代数的基础上
的 。
1 关系的定义
在用户观点下, 关系模型中数据的逻辑结构是一张二维表 。
二维表的每一列称为属性 。 每个属性有一个取值范围, 称为值域 。
每个属性对应一个值域 。 下面是二维表的一个实例 。
学号
姓名
性
别
1
张三
男
2
李四
男
2 关系中的基本名词
(1) 关键字
能唯一标识一行记录或元组的一个或一组属性 。
(2) 候选关键字 ( Candidate key) 和主关键字 ( Primary key)
能作为关键字的属性可能有很多, 这些属性称为候选关键字 。
为数据管理方便, 若一个关系有多个候选关键字时, 指定其中
一个为主关键字 。
(3) 主属性 ( Primary Attribute) 和非主属性 ( Non-key Attribute)
候选关键字中的属性为主属性 。 不包含在任何候选关键字中
的属性为非主属性 。
3 数据库中关系的类型
关系可以有三种类型:基本关系 ( 通常称为基本表或基表 )
查询表和视图表 。
(1) 基本表
基本表是关系数据库中实际存在的表, 它是实际存储数据的
逻辑表 。
(2) 查询表
它是从基本表中查询得到的, 一般是临时表 。
(3) 视图表
视图表是由基本表或其它视图表导出的表, 它是为数据处理
方便以及数据安全要求而设计的虚表, 它一般是不存储数据的,
而只是存储提取数据的条件, 它的数据依赖于基本表 。
4 基本关系的性质
基本关系具有如下六条性质,
(1) 列是同性质的, 即同一列中的分量是同一类型的数据 。
(2) 关系中的列又称为属性, 并赋予属性名 。 不同列的属
性名不同 。 不同列可以取相同的数据类型 。
(3) 列的次序可以任意交换 。
(4) 任意两个元组不能完全相同 。
(5) 行的次序可以任意交换 。
(6) 列具有原子性, 即每一列值是不可分的数据项
5 关系模式
关系模式是对关系的描述, 可以理解为表的结构
定义 。
关系实际上就是关系模式在某一时刻的状态或内
容 。 也就是说, 关系模式是型, 关系是它的值 。
6 关系数据库
在关系模型中, 实体以及实体间的联系都是用关
系来表示 。 在一个给定应用中, 所有实体及实体之间
联系的集合构成一个关系数据库 。 关系数据库也有型
和值之分 。
2.1.2 关系操作
关系模型给出了关系操作的能力, 但不对具体的
RDBMS给出具体的语法要求 。 关系操作语言灵活方便,
表达能力和功能强大 。 关系模型的数据操作采用集合
操作方式, 即操作对象和结果都是集合 。
关系模型中常用的关系操作包括数据查询, 数据
维护和数据控制三大功能 。 数据查询指数据检索, 统
计, 排序等功能;数据维护指数据的增加, 删除, 修
改等数据的更新功能;数据控制是为了保证数据的安
全性和完整性而采用的数据存储控制及并发控制等功
能 。
2.1.3 关系的完整性
1 实体完整性
现实世界中的实体是可区分的, 即它们具有某种唯一性标识 。
相应地, 关系模型中以主键 ( 主关键字 ) 作为唯一性标识 。 主键
中的属性即主属性不能取空值 。 所谓空值就是, 不知道, 或, 无
意义, 的值 。
2 参照完整性
现实世界中的实体之间往往存在某种联系, 在关系模型中实
体及实体间的联系都是用关系来描述的 。 这样就自然存在着关系
与关系间的引用 。
3,用户定义的完整性
用户定义的完整性是针对某一具体关系数据库的约束条件,
它反映某一具体应用所涉及的数据必须满足的语义要求 。 例如:
某个属性的取值不能为空, 学生考试的成绩取值范围在 0到 100之
间 。
2.2 SQL语言
SQL全称是, Structured Query Language”,即结构
化查询语言, 它目前是关系数据库的标准语言, 它是
在 1974年由 Boyce和 Chamberlin提出的 。 经过不断修改,
扩充和完善, SQL语言最终发展成为关系数据库的标
准语言 。 由于它功能丰富, 语言简洁, 易学易用, 所
以深受用户和计算机工业界的欢迎, 被各计算机公司
和软件公司广泛采用 。
SQL标准的影响超出了数据库领域, SQL成为国际
标准后, 它在数据库以外的其他领域也得到了重视和
采用 。 在未来一段相当长的时间, SQL将是数据库语言
领域中的一个主流语言 。
2.2.1 SQL概述及特点
1,SQL概述
SQL是一种结构化查询语言, 其功能并不象名称
所显示的那样仅仅是查询, 而是一个通用的, 功能强
大的关系数据库语言 。 SQL从主要功能上可以分为 4个
部分:数据定义, 数据查询, 数据操纵和数据控制 。
它是一个综合的, 通用的关系数据库查询语言 。 它的
特点如下,
(1) 功能一体化
(2) 高度非过程化
(3) 以同一种语法结构提供两种使用方式
(4) 语言简洁, 易学易用
2,SQL语言的基本概念
SQL支持三级模式结构, 外模式对应于视图和部
分基本表, 模式对应于基本表, 内模式对应于存储文
件 。
基本表是独立存在的表, 一个关系就是一个表 。
基本表是按数据全局逻辑模式建立的 。 全体基本表构
成了数据库的模式 。 一个 SQL模式 ( Schema) 是表和
约束的集合 。
视图是从基本表或其他视图中导出的表, 它本身
不独立存储在数据库中, 也就是说数据库中只存放视
图的定义而不存放视图的数据, 这些数据仍存放在导
出视图的基本表中 。 因此, 视图是一个虚表 。
2.2.2 SQL数据定义
SQL的数据定义功能包括定义表, 定义视图,
定义索引和定义数据库 。 SQL的数据定义语句见下
表 。
操作对
象
创建语句
删除语句
修改语句
基本表
CREATE
TABLE
DROP TABLE
ALTER
TABLE
索引
CREATE
INDEX
DROP INDEX
ALTER
INDEX
视图
CREATE
VIEW
DROP VIEW
ALTER VIEW
数据库
CREATE
DATABASE
DROP
DATABASE
ALTER
DATABASE
1,基本表的定义和维护
SQL基本表的定义和维护功能包括表的定义, 修改
和删除 。
(1) 定义基本表 ( CREATE TABLE)
[例 2-2] 建立一个, 学生, 表, 它由学号, 姓名, 性别, 年龄, 所在
系五个属性组成, 年龄是整型数据, 其它为字符型 。
CREATE TABLE 学生
( 学号 CHAR( 5),
姓名 CHAR( 20),
年龄 INT,
性别 CHAR( 2),
所在系 CHAR( 20),
)
(2)修改基本表 ( ALTER TABLE)
[例 2-6] 删除, 学生, 表中, 入学时间, 列 。
ALTER TABLE 学生 DROP COLUMN 入学时间;
(3) 删除基本表
[例 2-7] 删除学生表
DROP TABLE 学生
2,索引的定义和维护
当你阅读一本厚书时, 如果你想快速找到特定的
内容, 你就需要查看目录, 找到你所关心的内容在
书中的准确位置 —— 页码, 然后直接翻到这个位置 。
索引对于表, 就相当于书的目录 。 索引可以提高数
据查询速度 。
可以对频繁查询的表增加索引 。 只有按有索引的
列查询, 索引才有作用 。
(1)建立索引 ( CREATE INDEX )
[例 2-8] 为学生表建立索引, 按学号升序建唯一索引 。
CREATE UNIQUE INDEX Stusno ON 学生 ( 学号 )
(2) 删除索引 ( DROP INDEX )
[例 2-9] DROP INDEX 学生, Stusno
2.2.3 SQL数据查询
数据库查询是数据库的核心操作, 查询就是从
数据库中挑选, 提取所需要的数据 。 SQL提供了
SELECT语句进行数据库的查询, 该语句使用方式
灵活, 功能强大 。
SELECT语句的语法格式为,
SELECT [ALL | DISTINCT]<目标列表达式 >[,<目标列
表达式 >]..,
FROM <表名或视图名 >[,<表名或视图名 >],.,
[WHERE <行选择条件 >]
[GROUP BY <列名 1>[HAVING <组选择条件 >]]
[ORDER BY <列名 2> [ASC|DESC]];
1,简单查询
简单查询是指从一个表中进行查询, 也叫单表查
询 。 如选择一个表中的某些列, 某些行 。
(1) 查询指定列
[例 2-10] 查询全体学生的姓名与学号 。
学生表中有很多列:学号, 姓名, 年龄, 性别,
所在系, 而下列语句只选择学号和姓名两列, 即查
询的结果是一个只包含两列的新关系 。
SELECT 学号, 姓名 FROM 学生;
(2) 查询全部列
[例 2-11] 查询学生表的全部列,
SELECT * FROM 学生
也可以写为,
SELECT学号, 姓名, 年龄, 性别, 所在系
(3) 查询经过计算的值
SELECT子句可以包含表达式, 运算对象可以是
常量或属性 。
[例 2-12] 查询 5年之后学生的年龄 。 假如数据库中学
生的年龄是今年的年龄 。
SELECT 学号, 姓名, 年龄 +5
FROM 学生
(4) 消除取值重复的行
一个表中两个本来不完全相同的行, 选择部分列
后, 可能完全相同了 。
[例 2-13] 查询选修了课程的学号 。
SELECT 学号
FROM 选课
如果要去掉重复行, 必须指定短语 DISTINCT,
SELECT DISTINCT 学号
FROM 选课
取消了重复行, 结果就是选了课的学生学号 。
(5) 查询满足条件的行
WHERE子句通过条件表达式描述表中行的选择
条件 。 DBMS系统根据选择条件扫描表中的每一行,
把不符合条件的行筛选掉 。 WHERE子句常用的查询条
件, 如下表所示,
查询条件
常用谓词
比较
=,>,<,>=,<=,<>,!>, !<;
NOT + 上述比较运算符
确定范围
BETWEEN AND, NOT
BETWEEN AND
确定集合 IN,NOT IN
字符匹配
LIKE,NOT LIKE
空 值
IS NULL,IS NOT NULL
多重条件
AND,OR
① 比较
[例 2-14] 查询信息系学生的名单
SELECT 姓名
FROM 学生
WHERE 所在系 ='信息系 '
[例 2-15] 查询所有 20岁以下的学生姓名和年龄
SELECT 姓名, 年龄
FROM 学生
WHERE 年龄 <20
[例 2-16] 查询有成绩不及格的学生的学号
SELECT DISTINCT 学号
FROM 选课
WHERE 成绩 <60
② 确定范围
[例 2-17] 查询年龄在 20到 23岁 ( 包括 20和 23) 之间的
学生姓名, 年龄, 所在系 。
SELECT 姓名, 年龄, 所在系
FROM 学生
WHERE 年龄 BETWEEN 20 AND 23
③ 确定集合
[例 2-18] 查询数学系或化学系学生的姓名, 性别, 所
在系 。
SELECT 姓名, 性别, 所在系
FROM 学生
WHERE 所在系 IN ( '数学系 ','化学系 ')
④ 字符串的匹配 。
[例 2-19] 查询姓刘的学生的姓名, 性别, 所在系 。
SELECT 姓名, 性别, 所在系
FROM 学生
WHERE姓名 LIKE '刘 %'
⑤ 涉及空值的查询
[例 2-22] 查询选修了课程而没参加考试的学生名单及
课程号 。
SELECT 学号, 课程号
FROM 选课
WHERE成绩 IS NULL
⑥ 多重条件查询
如果查询条件多于两个, 则要使用逻辑运算符
AND和 OR连接多个条件, AND的优先级高于 OR,但可
使用括号改变运算顺序 。
[例 2-23] 查询计算机系姓赵的学生 。
SELECT 姓名
FROM 学生
WHERE所在系 ='计算机系 ' AND 姓名 LIKE '赵 %'
(6) 对查询结果排序
如果没有指定查询结果的显示顺序, DBMS通常
按其数据录入的先后顺序 ( 物理存储顺序 ) 输出查
询结果 。 用户也可以用 ORDER BY子句指定按照一个
或多个属性列的升序 ( ASC) 或降序 ( DESC) 重新排
列查询结果, 其中升序 ASC为缺省值 。
[例 2-24] 查询选修了 3号课程的学生的学号及其成绩,
查询结果按成绩的降序排列 。
SELECT 学号, 成绩
FROM 选课
WHERE 课程号= '3'
ORDER BY 成绩 DESC
(7) 使用集合函数
为了进一步方便用户, 增强检索功能, SQL提供
了许多集函数, 常用的集函数见下表 。
函数名
意义
COUNT ( [DISTINCT
| ALL]*)
统计记录个数
COUNT ( [DISTINCT
| ALL] 列名 )
统计一列中值的个数
SUM ( [DISTINCT |
ALL] 列名 )
计算一列值的总和 ( 此列
必须是数值型 )
AVG ( [DISTINCT |
ALL] 列名 )
计算一列值的平均值 ( 此
列必须是数值型 )
MAX ( [DISTINCT |
ALL] 列名 )
求一列值中的最大值
MIN ( [DISTINCT |
ALL] 列名 )
求一列值中的最大值
[例 2-25] 查询学生总人数 。
SELECT COUNT( *)
FROM 学生
[例 2-26] 查询选修了课程的学生人数 。
SELECT COUNT( DISTINCT 学号 )
FROM 选课
学生每选修一门课, 在选课中都有一条相应的
记录, 而一个学生一般都要选修多门课, 为避免重
复计算学生人数, 必须在 COUNT函数中用 DISTINCT限
定词 。
(8) 对查询结果分组
GROUP BY子句可以将查询结果表的各行按一列
或多列的值分组, 值相等的为一组 。 对查询结果分
组的目的是为了细化集函数的作用对象 。 如果未对
查询结果分组, 集函数将作用于整个查询结果, 即
整个查询结果只有一个函数值, 如上面的例题, 否
则, 集函数将作用于每一个组, 即每一组都有一个
函数值 。
[例 2-28] 查询各个课程号与相应的选课人数 。
SELECT 课程号, COUNT( 学号 )
FROM 选课
GROUP BY 课程号
该 SELECT语句对课程表按课程号的取值进行分
组, 所有具有相同课程号的行为一组, 然后对每一
组作用集函数 COUNT以求得该组的学生人数 。
2,连接查询
一个数据库中的多个表之间一般都存在某种内
在联系, 它们共同提供有用的信息 。 前面的查询都
是针对一个表进行的 。 若一个查询同时涉及两个以
上的表, 则称之为连接查询 。 连接查询实际上是关
系数据库中最主要的查询, 主要包括等值连接查询,
非等值连接查询, 自身连接查询, 外连接查询和复
合条件连接查询 。
[例 2-31] 查询每个学生及其选修课程的情况 。
学生选课情况存放在选课表中, 所以本查询实
际上同时涉及学生表和选课表两个表中的数据 。 这
两个表之间的联系是通过两个表都具有的公共属性
学号实现的 。 要查询学生及其选修课程的情况, 就
必须将这两个表中学号相同的元组连接起来 。
这是一个等值连接 。 完成本查询的 SQL语句为,
SELECT 学生,*,选课,*
FROM 学生, 选课
WHERE 学生,学号=选课,学号
3,嵌套查询
在 SQL 语言中, 一个 SELECT— FROM—
WHERE语句称为一个查询块 。 将一个查询块嵌套
在另一个查询块的 WHERE子句或 HAVING短语的条
件中的查询称为嵌套查询或子查询 。
在嵌套查询中, 上层的查询块又称为外层查询
或父查询或主查询, 下层查询块又称为内层查询或
子查询 。 SQL语言允许多层嵌套查询 。 即一个子查
询中还可以嵌套其它子查询 。
嵌套查询使得可以用一系列简单查询构成复杂
的查询, 从而明显地增强了 SQL的查询能力 。
(1) 带有 IN谓词的子查询
带有 IN渭词的子查询是指父查询与子查询之间用
IN进行连接, 判断某个属性列值是否在子查询的结果
中 。 由于在嵌套查询中, 子查询的结果往往是一个集
合, 所以谓词 IN是嵌套查询中最经常使用的谓词 。
[例 2-32] 查询选修了, 数学, 课的学生姓名 。
学生名和课程名分别在, 学生, 和, 课程, 表中,
因此不能通过简单的查询一个表而得到结果 。 实际上
连接学生和课程的是, 选课, 表, 因此这个查询涉及
到三个表:学生, 课程, 选课 。
查询步骤如下,
? 在课程表中查询, 数学, 课的课程号 。
? 在选课表中找到选修了上一步得到的课程号的课程
的学生学号 。
? 在学生表中找到学号包含在上一步所得到的学号集
合中的学生姓名 。
SELECT 学号, 姓名
FROM 学生
WHERE 学号 IN ( SELECT 学号
FROM 选课
WHERE 课程号 IN ( SELECT 课程号
FROM 课程
WHERE 课程 ='数学 '))
(2) 带有比较运算符的子查询
带有比较运算符的子查询是指父查询与子查询
之间用比较运算符进行连接 。 当用户能确切知道内
层查询返回的是单值时, 可以用>, <, =, >=,
<=, 2=或<>等比较运算符 。
[例 2-33] 查询与, 刘刚, 同一个系的学生 。
这个查询分两步,
? 首先在学生表找到, 刘刚, 所在的系 。
? 然后在学生表中查询所在系与上一不的查询结果相
等的学生名单 。
SELECT 姓名
FROM 学生
WHERE 所在 系 = ( SELECT 所在系 FROM 学生
WHERE 姓名 ='刘刚 ')
2.2.4 SQL数据操纵
在对数据库进行操作时, 除了经常查询数据库外, 还要更
新数据 。 SQL中数据更新包括插入数据 ( INSERT), 修改数
据 ( UPDATE) 和删除数据 ( DELETE) 三条语句 。
1,插入语句 ( INSERT INTO )
[例 2-34] 将一个新学生记录 ( 学号,95005;姓名:陈俊;性别:
男;所在系:计算机;年龄,18岁 ) 插入学生表中 。
INSERT
INTO 学生
VALUES( "95020","陈俊 ","男 ",18,"计算机系 ") ;
2,删除语句 ( DELETE )
[例 2-35] 删除学号为 95001的学生记录 。
DELETE
FROM 学生
WHERE 学号 ='95001';
3,修改语句 ( UPDATE )
[例 2-36] 将学号为 95001的学生年龄改为 22岁 。
UPDATE 学生
SET 年龄 =22
WHERE 学号 ='95001'
2.2.5 SQL数据控制
这里所讨论的数据控制主要是指 SQL语言的安
全性控制功能, 通过对数据库用户的使用权限加以
限制而保证数据安全的重要措施 。 SQL语言的的数
据控制语句包括授权 ( Grant), 收权或删除权限
( Revoke), 拒绝访问 ( Deny) 三种, 权限的设置
对象可以是数据库用户或用户组 。
1,授权
[例 2-37] 将查询成绩的权限授予所有人 。
GRANT SELECT ON TABLE 成绩 TO PUBLIC
2,收权语句
数据库管理员 DBA,数据库拥有者 DBO或数据库
对象的拥有者 DBOO可以通过 REVOKE语句将其他用户
的数据操作权限收回 。
[例 2-38] 将用户 wp修改学生学号的权限收回 。
REVOKE UPDATE( 学号 ) ON 学生 FROM wp
2.3 关系数据理论
针对一个具体的问题, 应该如何构造一个适合
于它的数据模式 。 这是数据库设计问题, 确切地讲
是数据库逻辑设计问题 。
关系模型有严格的数学理论基础, 基于这种理
论上的优势, 关系模型可以设计的更加科学, 关系
数据库中的问题可以更好地解决 。 关系数据库规范
化理论就是数据库逻辑设计工具 。 关系数据库的规
范化理论就是解决如何设计出合理的关系数据库模
式, 也就是一个数据库中要定义哪些表, 每个表有
哪些属性, 表之间有哪些联系, 而尽量地减少数据
冗余, 消除插入, 删除等存在的问题 。
2.3.1 关系模式可能存在的问题
例如, 要设计一个教学管理数据库, 希望在该
数据库中保存学生的学号, 姓名, 性别, 年龄, 系
名, 系主任和该学生选修的课程及成绩信息 。 若据
此设计一个关系保存所有的数据, 关系模式为,
教学 ( 学号, 姓名, 性别, 年龄, 系名, 系
主任, 课程名, 成绩 )
这个关系模式存在以下的问题,
? 数据冗余大
? 插入异常
? 删除异常 。
? 更新异常
由于上述的问题, 它是一个不合理的设计 。 一
个合理的设计应该尽量减少以上的问题 。 只有找到
问题存在的原因, 才能找到解决办法 。 那么出现上
述问题的原因是什么呢? 这是因为这个关系模式中
的数据之间的依赖关系所造成的 。 如果把这个单一
的关系模式, 分解成如下三个关系模式,
学生 ( 学号, 姓名, 性别, 年龄, 所在系 ) ;
系 ( 系名, 系主任 ) ;
选课 ( 学号, 课程名, 成绩 )
2.3.2 函数依赖及规范化
为了使数据库模式的设计更合理, 人们研究了
规范化理论 。 而函数依赖理论是关系规范化的理论
基础 。 函数依赖反映了同一关系中属性间一一对应
的约束 。
1,关系模式的简化表示法
一般把关系模式看做一个三元组,
R( U,F)
其中, R是关系名, U是一组属性, F是属性组
U上的一组数据依赖关系的集合 。 当且仅当 U上的一
个关系 r 满足 F 时, r称为关系模式 R( U,F) 的一
个关系 。
2,函数依赖
函数依赖是数据依赖的一种, 函数依赖反映了
同一关系中属性间的一一对应约束 。 它是现实世界
属性间相互联系的抽象, 是数据内在的性质, 是语
义的体现 。 它是数据库规范化理论的基础 。
函数依赖普遍存在于现实生活中 。 例如在描述
学生的关系中, 可能的属性有学号, 姓名, 所在系
等 。 由于一个学号只对应于一个学生, 一个学生只
能属于一个系, 因此学号确定之后, 该学生的姓名
和所在系也唯一的确定了 。 类似于自变量确定了,
函数值也唯一确定了 。 起决定性的属性相当于自变
量 。 函数依赖记为:学号 → 姓名, 学号 → 所在系 。
现在讨论一个具体的关系模式 。 例如, 要设计
一个教学管理数据库, 希望该数据库中包括的信息
有学生学号, 姓名, 系名, 系主任姓名, 以及学生
学习的课程和成绩 。 于是得到一组属性,
U={学号, 姓名, 系名, 系主任, 课程名, 成绩 }
根据经验得知,
? 一个学号对应一个学生, 即一个学号对应一个
姓名, 但可以有多个学生重名;
? 一个系有若干学生, 但一个学生只属于一个系;
? 一个系只有一名 ( 正职 ) 负责人;
? 一个学生可选修多门课程, 每门课程有若干学生选
修;
? 学生学习每一门课程有一个成绩;
于是得到属性组上的一组函数依赖,
F={学号 → 姓名, 学号 → 系名, 系名 → 系主任, ( 学
号, 课程名 ) → 成绩 }
定义:设 R( U) 是属性集 U上的关系模式 。 X,
Y是 U的子集 。 若对于 R( U) 的任意一个可能的关
系 r( 一个满足约束条件的数据组成的表 ), r中不
可能存在两个元组在 X上的属性值相等, 而在 Y上的
属性值不等, 则称 X函数确定 Y或 Y函数依赖于 X,
记作 X→ Y。
定义:在 R( U) 中,,如果 X→Y, Y→Z, 且
( Y? X), Y X,则称 Z对 X传递函数依赖 。
例如, 在教学关系模式中, 学号 → 系名, 系名 → 系主
任, 所以系主任对学号传递依赖 。
3,范式
关系数据库中的关系是要满足一定要求的 。 满
足不同程度要求的为不同的范式 。 范式是满足一定
函数依赖的关系模式的集合 。 有多种范式:第一范
式, 第二范式, 第三范式, BCN范式等 。 满足最低
要求的叫第一范式, 简称 1NF。 在满足第一范式的
条件下, 满足进一步条件的为第二范式, 简称 2NF。
其余依此类推 。 显然各种范式之间存在关系,
1NF?2NF ? 3NF ? BCNF ? 4NF ? 5NF
一个低一级的范式模式, 通过模式分解可以转换
为若干个高一级范式的模式集合, 这个过程叫规范
化 。
(1) 第一范式 ( 1NF)
定义:如果一个关系模式 R的所有属性都是简单
属性, 即每个属性都是不可再分的基本数据项, 则
称 R属于第一范式, 记作 R ∈ 1NF。
例如, 教学模式中的所有属性都是不可再分的简
单属性, 即,
教学 ( 学号, 姓名, 系名, 系主任, 课程名, 成
绩 ) ∈ 1NF
(2 ) 第二范式 ( 2NF)
定义:若一个关系模式 R∈ lNF,且每一个非主
属性完全函数依赖于关键字, 则 R∈ 2NF。
将教学模式分为以下两个模式,
学生 _系 ( 学号, 姓名, 系, 系主任 ) ;
选课 ( 学号, 课程名, 成绩 )
在, 学生 _系, 关系中,, 学号, 是关键字, 其
它非主属性都完全依赖于关键字,, 选课, 关系中,
( 学号, 课程名 ) 是关键字, 非主属性也完全依赖
于关键字, 因此两个关系中非主属都完全函数依赖
于关键字, 服从 2NF,即,
学生 _系 ∈ 2NF,选课 ∈ 2NF。
(3 ) 第三范式 ( 3NF)
定义:若关系模式 R是第二范式, 且没有一个非主属性传
递函数依赖关键字, 则 R∈ 3NF。 R∈ 3NF,则非主属性对主属
性既不部分函数依赖于关键字, 也不传递函数依赖于关键字 。
考察, 学生 _系, 关系, 可以看出:学号 → 系名, 系名 → 系
主任, 即, 系主任, 传递依赖于, 学号, 。, 学号, 是关键字,
而, 系主任, 是非主属性, 它们之间存在传递函数依赖关系,
因此, 学生 _系, 关系 ?3NF。 如果对, 学生 _系, 关系按第三
范式的要求分解, 分解后的模式如下,
学生 ( 学号, 姓名, 系 )
系 ( 系, 系主任 )
则分解后的模式均属于 3NF。
规范化方法为设计人员判断关系模式的优劣提
供了理论依据, 可以使数据库的设计工作建立在严
格的理论基础上 。
关系模式的优化步骤如下,
① 按需求分析所得到的实体及其联系, 确定数据库中
各关系模式中存在的函数依赖集 。
② 逐一分析各关系模式, 确定关系模式属于第几范式 。
③ 对关系模式通过模式分解的方法进行改进, 使其达
到一定的范式 。
小结
本章介绍了关系数据库的基本概念, SQL语言, 函数依赖
理论及范式 。
1,关系数据库 。 在关系数据库中关系就是表 。 关系数据库中的
实体及联系均用关系来表示 。
2,SQL语言 。 它是关系数据库的结构化查询语言, 具有一体化,
高度非过程化, 语言简洁, 易于使用的特点 。 SQL语言提供了
创建数据库, 定义关系模式, 查询, 更新, 维护, 数据库安全
控制等一系列功能 。
3,关系数据库规范化理论
关系数据库规范化理论是数据库逻辑设计工具 。 关系数据库的
规范化理论就是解决如何设计出合理的关系数据库模式 。
习题
1,试说明 SELECT语句的作用 。
2,试说明 SELECT语句中 FROM,WHERE,GROUP,ORDER、
HAVING的作用 。
3,设学生选课数据库包含如下三个关系模式,
学生 ( 学号, 姓名, 性别, 年龄, 系名 ) ;
系 ( 系名, 系主任 ) ;
选课 ( 学号, 课程名, 成绩 )
试用 SQL语言实现下列操作,
(1) 查询年龄大于 20岁的男生 。
(2) 查询姓王的学生 。
习题
(3) 求出学习高等数学课程学生的最高成绩, 最低成绩和平均成
绩 。
(4) 求出学习数据库原理课程且成绩高于 80分的学生人数 。
(5) 查询每个学生的学号及选修课的数量,
(6) 查询选修三门以上课程的学生学号 。
(7) 查询学习数据库原理课程的学生姓名 。
(8) 把张三的年龄修改为 20。
(9) 删除学号为 951001的学生选修的数据库原理课程 。
习题
4,解释下列名词:函数依赖, 部分函数依赖, 传递函数依赖, 1NF、
2NF,3NF。
5,现在要建立关于系, 学生, 班级信息的数据库, 关系模式为,
学生 ( 学号, 姓名, 出生日期, 系名, 班号, 宿舍区 ) ;
系 ( 系号, 系名, 办公室, 系人数 ) ;
班级 ( 班号, 专业名, 系名, 人数, 入学年份 )
各个属性之间的关系:一个系有若干个专业, 每个专业每年只招一个
班, 每个班有若干学生, 一个系的学生住在同一个宿舍区 。
(1) 请写出每个关系模式的函数依赖, 分析是否存在部分依赖, 传递依
赖 。
(2) 找出各个关系的关键字, 外部关键字 。
(3) 每个关系是什么范式? 如果不是 3NF请规范化为 3NF。
教材:数据库技术及应用 2006年 4月
宁可、吴菁、胡海编著
本章要点
? 关系数据库
? 结构化查询语言
? 数据库设计理论
目 录
2.1 关系数据库
2.1.1 关系数据结构
2.1.2 关系操作
2.1.3 关系的完整性
2.2 SQL语言
2.2.1 SQL概述及特点
2.2.2 SQL数据定义
2.2.3 SQL数据查询
2.2.4 SQL数据操纵
2.2.5 数据控制
2.3 关系数据理论
2.3.1 关系模式可能存在的问题
2.3.2 函数依赖及规范化
小结
2.1 关系 数据库
关系数据库系统是支持关系模型的数据库
系统 。 关系模型由关系数据结构, 关系操作集合
和关系完整性约束三部分组成 。
关系数据库是表的集合,数据库中的表,数
学家称为关系。关系数据库中还定义了关系操作
和完整性约束,关系操作就是对表中的数据的处
理、查询,完整性约束就是表中的数据要满足的
条件,这些条件由数据库系统自动维护,产生违
反这些约束条件的对数据的操作会被拒绝执行。
2.1.1 关系数据 结构
在关系模型中, 无论是实体还是实体之间的联系均由单一的
结构即关系 ( 表 ) 来表示 。 关系模型是建立在集合代数的基础上
的 。
1 关系的定义
在用户观点下, 关系模型中数据的逻辑结构是一张二维表 。
二维表的每一列称为属性 。 每个属性有一个取值范围, 称为值域 。
每个属性对应一个值域 。 下面是二维表的一个实例 。
学号
姓名
性
别
1
张三
男
2
李四
男
2 关系中的基本名词
(1) 关键字
能唯一标识一行记录或元组的一个或一组属性 。
(2) 候选关键字 ( Candidate key) 和主关键字 ( Primary key)
能作为关键字的属性可能有很多, 这些属性称为候选关键字 。
为数据管理方便, 若一个关系有多个候选关键字时, 指定其中
一个为主关键字 。
(3) 主属性 ( Primary Attribute) 和非主属性 ( Non-key Attribute)
候选关键字中的属性为主属性 。 不包含在任何候选关键字中
的属性为非主属性 。
3 数据库中关系的类型
关系可以有三种类型:基本关系 ( 通常称为基本表或基表 )
查询表和视图表 。
(1) 基本表
基本表是关系数据库中实际存在的表, 它是实际存储数据的
逻辑表 。
(2) 查询表
它是从基本表中查询得到的, 一般是临时表 。
(3) 视图表
视图表是由基本表或其它视图表导出的表, 它是为数据处理
方便以及数据安全要求而设计的虚表, 它一般是不存储数据的,
而只是存储提取数据的条件, 它的数据依赖于基本表 。
4 基本关系的性质
基本关系具有如下六条性质,
(1) 列是同性质的, 即同一列中的分量是同一类型的数据 。
(2) 关系中的列又称为属性, 并赋予属性名 。 不同列的属
性名不同 。 不同列可以取相同的数据类型 。
(3) 列的次序可以任意交换 。
(4) 任意两个元组不能完全相同 。
(5) 行的次序可以任意交换 。
(6) 列具有原子性, 即每一列值是不可分的数据项
5 关系模式
关系模式是对关系的描述, 可以理解为表的结构
定义 。
关系实际上就是关系模式在某一时刻的状态或内
容 。 也就是说, 关系模式是型, 关系是它的值 。
6 关系数据库
在关系模型中, 实体以及实体间的联系都是用关
系来表示 。 在一个给定应用中, 所有实体及实体之间
联系的集合构成一个关系数据库 。 关系数据库也有型
和值之分 。
2.1.2 关系操作
关系模型给出了关系操作的能力, 但不对具体的
RDBMS给出具体的语法要求 。 关系操作语言灵活方便,
表达能力和功能强大 。 关系模型的数据操作采用集合
操作方式, 即操作对象和结果都是集合 。
关系模型中常用的关系操作包括数据查询, 数据
维护和数据控制三大功能 。 数据查询指数据检索, 统
计, 排序等功能;数据维护指数据的增加, 删除, 修
改等数据的更新功能;数据控制是为了保证数据的安
全性和完整性而采用的数据存储控制及并发控制等功
能 。
2.1.3 关系的完整性
1 实体完整性
现实世界中的实体是可区分的, 即它们具有某种唯一性标识 。
相应地, 关系模型中以主键 ( 主关键字 ) 作为唯一性标识 。 主键
中的属性即主属性不能取空值 。 所谓空值就是, 不知道, 或, 无
意义, 的值 。
2 参照完整性
现实世界中的实体之间往往存在某种联系, 在关系模型中实
体及实体间的联系都是用关系来描述的 。 这样就自然存在着关系
与关系间的引用 。
3,用户定义的完整性
用户定义的完整性是针对某一具体关系数据库的约束条件,
它反映某一具体应用所涉及的数据必须满足的语义要求 。 例如:
某个属性的取值不能为空, 学生考试的成绩取值范围在 0到 100之
间 。
2.2 SQL语言
SQL全称是, Structured Query Language”,即结构
化查询语言, 它目前是关系数据库的标准语言, 它是
在 1974年由 Boyce和 Chamberlin提出的 。 经过不断修改,
扩充和完善, SQL语言最终发展成为关系数据库的标
准语言 。 由于它功能丰富, 语言简洁, 易学易用, 所
以深受用户和计算机工业界的欢迎, 被各计算机公司
和软件公司广泛采用 。
SQL标准的影响超出了数据库领域, SQL成为国际
标准后, 它在数据库以外的其他领域也得到了重视和
采用 。 在未来一段相当长的时间, SQL将是数据库语言
领域中的一个主流语言 。
2.2.1 SQL概述及特点
1,SQL概述
SQL是一种结构化查询语言, 其功能并不象名称
所显示的那样仅仅是查询, 而是一个通用的, 功能强
大的关系数据库语言 。 SQL从主要功能上可以分为 4个
部分:数据定义, 数据查询, 数据操纵和数据控制 。
它是一个综合的, 通用的关系数据库查询语言 。 它的
特点如下,
(1) 功能一体化
(2) 高度非过程化
(3) 以同一种语法结构提供两种使用方式
(4) 语言简洁, 易学易用
2,SQL语言的基本概念
SQL支持三级模式结构, 外模式对应于视图和部
分基本表, 模式对应于基本表, 内模式对应于存储文
件 。
基本表是独立存在的表, 一个关系就是一个表 。
基本表是按数据全局逻辑模式建立的 。 全体基本表构
成了数据库的模式 。 一个 SQL模式 ( Schema) 是表和
约束的集合 。
视图是从基本表或其他视图中导出的表, 它本身
不独立存储在数据库中, 也就是说数据库中只存放视
图的定义而不存放视图的数据, 这些数据仍存放在导
出视图的基本表中 。 因此, 视图是一个虚表 。
2.2.2 SQL数据定义
SQL的数据定义功能包括定义表, 定义视图,
定义索引和定义数据库 。 SQL的数据定义语句见下
表 。
操作对
象
创建语句
删除语句
修改语句
基本表
CREATE
TABLE
DROP TABLE
ALTER
TABLE
索引
CREATE
INDEX
DROP INDEX
ALTER
INDEX
视图
CREATE
VIEW
DROP VIEW
ALTER VIEW
数据库
CREATE
DATABASE
DROP
DATABASE
ALTER
DATABASE
1,基本表的定义和维护
SQL基本表的定义和维护功能包括表的定义, 修改
和删除 。
(1) 定义基本表 ( CREATE TABLE)
[例 2-2] 建立一个, 学生, 表, 它由学号, 姓名, 性别, 年龄, 所在
系五个属性组成, 年龄是整型数据, 其它为字符型 。
CREATE TABLE 学生
( 学号 CHAR( 5),
姓名 CHAR( 20),
年龄 INT,
性别 CHAR( 2),
所在系 CHAR( 20),
)
(2)修改基本表 ( ALTER TABLE)
[例 2-6] 删除, 学生, 表中, 入学时间, 列 。
ALTER TABLE 学生 DROP COLUMN 入学时间;
(3) 删除基本表
[例 2-7] 删除学生表
DROP TABLE 学生
2,索引的定义和维护
当你阅读一本厚书时, 如果你想快速找到特定的
内容, 你就需要查看目录, 找到你所关心的内容在
书中的准确位置 —— 页码, 然后直接翻到这个位置 。
索引对于表, 就相当于书的目录 。 索引可以提高数
据查询速度 。
可以对频繁查询的表增加索引 。 只有按有索引的
列查询, 索引才有作用 。
(1)建立索引 ( CREATE INDEX )
[例 2-8] 为学生表建立索引, 按学号升序建唯一索引 。
CREATE UNIQUE INDEX Stusno ON 学生 ( 学号 )
(2) 删除索引 ( DROP INDEX )
[例 2-9] DROP INDEX 学生, Stusno
2.2.3 SQL数据查询
数据库查询是数据库的核心操作, 查询就是从
数据库中挑选, 提取所需要的数据 。 SQL提供了
SELECT语句进行数据库的查询, 该语句使用方式
灵活, 功能强大 。
SELECT语句的语法格式为,
SELECT [ALL | DISTINCT]<目标列表达式 >[,<目标列
表达式 >]..,
FROM <表名或视图名 >[,<表名或视图名 >],.,
[WHERE <行选择条件 >]
[GROUP BY <列名 1>[HAVING <组选择条件 >]]
[ORDER BY <列名 2> [ASC|DESC]];
1,简单查询
简单查询是指从一个表中进行查询, 也叫单表查
询 。 如选择一个表中的某些列, 某些行 。
(1) 查询指定列
[例 2-10] 查询全体学生的姓名与学号 。
学生表中有很多列:学号, 姓名, 年龄, 性别,
所在系, 而下列语句只选择学号和姓名两列, 即查
询的结果是一个只包含两列的新关系 。
SELECT 学号, 姓名 FROM 学生;
(2) 查询全部列
[例 2-11] 查询学生表的全部列,
SELECT * FROM 学生
也可以写为,
SELECT学号, 姓名, 年龄, 性别, 所在系
(3) 查询经过计算的值
SELECT子句可以包含表达式, 运算对象可以是
常量或属性 。
[例 2-12] 查询 5年之后学生的年龄 。 假如数据库中学
生的年龄是今年的年龄 。
SELECT 学号, 姓名, 年龄 +5
FROM 学生
(4) 消除取值重复的行
一个表中两个本来不完全相同的行, 选择部分列
后, 可能完全相同了 。
[例 2-13] 查询选修了课程的学号 。
SELECT 学号
FROM 选课
如果要去掉重复行, 必须指定短语 DISTINCT,
SELECT DISTINCT 学号
FROM 选课
取消了重复行, 结果就是选了课的学生学号 。
(5) 查询满足条件的行
WHERE子句通过条件表达式描述表中行的选择
条件 。 DBMS系统根据选择条件扫描表中的每一行,
把不符合条件的行筛选掉 。 WHERE子句常用的查询条
件, 如下表所示,
查询条件
常用谓词
比较
=,>,<,>=,<=,<>,!>, !<;
NOT + 上述比较运算符
确定范围
BETWEEN AND, NOT
BETWEEN AND
确定集合 IN,NOT IN
字符匹配
LIKE,NOT LIKE
空 值
IS NULL,IS NOT NULL
多重条件
AND,OR
① 比较
[例 2-14] 查询信息系学生的名单
SELECT 姓名
FROM 学生
WHERE 所在系 ='信息系 '
[例 2-15] 查询所有 20岁以下的学生姓名和年龄
SELECT 姓名, 年龄
FROM 学生
WHERE 年龄 <20
[例 2-16] 查询有成绩不及格的学生的学号
SELECT DISTINCT 学号
FROM 选课
WHERE 成绩 <60
② 确定范围
[例 2-17] 查询年龄在 20到 23岁 ( 包括 20和 23) 之间的
学生姓名, 年龄, 所在系 。
SELECT 姓名, 年龄, 所在系
FROM 学生
WHERE 年龄 BETWEEN 20 AND 23
③ 确定集合
[例 2-18] 查询数学系或化学系学生的姓名, 性别, 所
在系 。
SELECT 姓名, 性别, 所在系
FROM 学生
WHERE 所在系 IN ( '数学系 ','化学系 ')
④ 字符串的匹配 。
[例 2-19] 查询姓刘的学生的姓名, 性别, 所在系 。
SELECT 姓名, 性别, 所在系
FROM 学生
WHERE姓名 LIKE '刘 %'
⑤ 涉及空值的查询
[例 2-22] 查询选修了课程而没参加考试的学生名单及
课程号 。
SELECT 学号, 课程号
FROM 选课
WHERE成绩 IS NULL
⑥ 多重条件查询
如果查询条件多于两个, 则要使用逻辑运算符
AND和 OR连接多个条件, AND的优先级高于 OR,但可
使用括号改变运算顺序 。
[例 2-23] 查询计算机系姓赵的学生 。
SELECT 姓名
FROM 学生
WHERE所在系 ='计算机系 ' AND 姓名 LIKE '赵 %'
(6) 对查询结果排序
如果没有指定查询结果的显示顺序, DBMS通常
按其数据录入的先后顺序 ( 物理存储顺序 ) 输出查
询结果 。 用户也可以用 ORDER BY子句指定按照一个
或多个属性列的升序 ( ASC) 或降序 ( DESC) 重新排
列查询结果, 其中升序 ASC为缺省值 。
[例 2-24] 查询选修了 3号课程的学生的学号及其成绩,
查询结果按成绩的降序排列 。
SELECT 学号, 成绩
FROM 选课
WHERE 课程号= '3'
ORDER BY 成绩 DESC
(7) 使用集合函数
为了进一步方便用户, 增强检索功能, SQL提供
了许多集函数, 常用的集函数见下表 。
函数名
意义
COUNT ( [DISTINCT
| ALL]*)
统计记录个数
COUNT ( [DISTINCT
| ALL] 列名 )
统计一列中值的个数
SUM ( [DISTINCT |
ALL] 列名 )
计算一列值的总和 ( 此列
必须是数值型 )
AVG ( [DISTINCT |
ALL] 列名 )
计算一列值的平均值 ( 此
列必须是数值型 )
MAX ( [DISTINCT |
ALL] 列名 )
求一列值中的最大值
MIN ( [DISTINCT |
ALL] 列名 )
求一列值中的最大值
[例 2-25] 查询学生总人数 。
SELECT COUNT( *)
FROM 学生
[例 2-26] 查询选修了课程的学生人数 。
SELECT COUNT( DISTINCT 学号 )
FROM 选课
学生每选修一门课, 在选课中都有一条相应的
记录, 而一个学生一般都要选修多门课, 为避免重
复计算学生人数, 必须在 COUNT函数中用 DISTINCT限
定词 。
(8) 对查询结果分组
GROUP BY子句可以将查询结果表的各行按一列
或多列的值分组, 值相等的为一组 。 对查询结果分
组的目的是为了细化集函数的作用对象 。 如果未对
查询结果分组, 集函数将作用于整个查询结果, 即
整个查询结果只有一个函数值, 如上面的例题, 否
则, 集函数将作用于每一个组, 即每一组都有一个
函数值 。
[例 2-28] 查询各个课程号与相应的选课人数 。
SELECT 课程号, COUNT( 学号 )
FROM 选课
GROUP BY 课程号
该 SELECT语句对课程表按课程号的取值进行分
组, 所有具有相同课程号的行为一组, 然后对每一
组作用集函数 COUNT以求得该组的学生人数 。
2,连接查询
一个数据库中的多个表之间一般都存在某种内
在联系, 它们共同提供有用的信息 。 前面的查询都
是针对一个表进行的 。 若一个查询同时涉及两个以
上的表, 则称之为连接查询 。 连接查询实际上是关
系数据库中最主要的查询, 主要包括等值连接查询,
非等值连接查询, 自身连接查询, 外连接查询和复
合条件连接查询 。
[例 2-31] 查询每个学生及其选修课程的情况 。
学生选课情况存放在选课表中, 所以本查询实
际上同时涉及学生表和选课表两个表中的数据 。 这
两个表之间的联系是通过两个表都具有的公共属性
学号实现的 。 要查询学生及其选修课程的情况, 就
必须将这两个表中学号相同的元组连接起来 。
这是一个等值连接 。 完成本查询的 SQL语句为,
SELECT 学生,*,选课,*
FROM 学生, 选课
WHERE 学生,学号=选课,学号
3,嵌套查询
在 SQL 语言中, 一个 SELECT— FROM—
WHERE语句称为一个查询块 。 将一个查询块嵌套
在另一个查询块的 WHERE子句或 HAVING短语的条
件中的查询称为嵌套查询或子查询 。
在嵌套查询中, 上层的查询块又称为外层查询
或父查询或主查询, 下层查询块又称为内层查询或
子查询 。 SQL语言允许多层嵌套查询 。 即一个子查
询中还可以嵌套其它子查询 。
嵌套查询使得可以用一系列简单查询构成复杂
的查询, 从而明显地增强了 SQL的查询能力 。
(1) 带有 IN谓词的子查询
带有 IN渭词的子查询是指父查询与子查询之间用
IN进行连接, 判断某个属性列值是否在子查询的结果
中 。 由于在嵌套查询中, 子查询的结果往往是一个集
合, 所以谓词 IN是嵌套查询中最经常使用的谓词 。
[例 2-32] 查询选修了, 数学, 课的学生姓名 。
学生名和课程名分别在, 学生, 和, 课程, 表中,
因此不能通过简单的查询一个表而得到结果 。 实际上
连接学生和课程的是, 选课, 表, 因此这个查询涉及
到三个表:学生, 课程, 选课 。
查询步骤如下,
? 在课程表中查询, 数学, 课的课程号 。
? 在选课表中找到选修了上一步得到的课程号的课程
的学生学号 。
? 在学生表中找到学号包含在上一步所得到的学号集
合中的学生姓名 。
SELECT 学号, 姓名
FROM 学生
WHERE 学号 IN ( SELECT 学号
FROM 选课
WHERE 课程号 IN ( SELECT 课程号
FROM 课程
WHERE 课程 ='数学 '))
(2) 带有比较运算符的子查询
带有比较运算符的子查询是指父查询与子查询
之间用比较运算符进行连接 。 当用户能确切知道内
层查询返回的是单值时, 可以用>, <, =, >=,
<=, 2=或<>等比较运算符 。
[例 2-33] 查询与, 刘刚, 同一个系的学生 。
这个查询分两步,
? 首先在学生表找到, 刘刚, 所在的系 。
? 然后在学生表中查询所在系与上一不的查询结果相
等的学生名单 。
SELECT 姓名
FROM 学生
WHERE 所在 系 = ( SELECT 所在系 FROM 学生
WHERE 姓名 ='刘刚 ')
2.2.4 SQL数据操纵
在对数据库进行操作时, 除了经常查询数据库外, 还要更
新数据 。 SQL中数据更新包括插入数据 ( INSERT), 修改数
据 ( UPDATE) 和删除数据 ( DELETE) 三条语句 。
1,插入语句 ( INSERT INTO )
[例 2-34] 将一个新学生记录 ( 学号,95005;姓名:陈俊;性别:
男;所在系:计算机;年龄,18岁 ) 插入学生表中 。
INSERT
INTO 学生
VALUES( "95020","陈俊 ","男 ",18,"计算机系 ") ;
2,删除语句 ( DELETE )
[例 2-35] 删除学号为 95001的学生记录 。
DELETE
FROM 学生
WHERE 学号 ='95001';
3,修改语句 ( UPDATE )
[例 2-36] 将学号为 95001的学生年龄改为 22岁 。
UPDATE 学生
SET 年龄 =22
WHERE 学号 ='95001'
2.2.5 SQL数据控制
这里所讨论的数据控制主要是指 SQL语言的安
全性控制功能, 通过对数据库用户的使用权限加以
限制而保证数据安全的重要措施 。 SQL语言的的数
据控制语句包括授权 ( Grant), 收权或删除权限
( Revoke), 拒绝访问 ( Deny) 三种, 权限的设置
对象可以是数据库用户或用户组 。
1,授权
[例 2-37] 将查询成绩的权限授予所有人 。
GRANT SELECT ON TABLE 成绩 TO PUBLIC
2,收权语句
数据库管理员 DBA,数据库拥有者 DBO或数据库
对象的拥有者 DBOO可以通过 REVOKE语句将其他用户
的数据操作权限收回 。
[例 2-38] 将用户 wp修改学生学号的权限收回 。
REVOKE UPDATE( 学号 ) ON 学生 FROM wp
2.3 关系数据理论
针对一个具体的问题, 应该如何构造一个适合
于它的数据模式 。 这是数据库设计问题, 确切地讲
是数据库逻辑设计问题 。
关系模型有严格的数学理论基础, 基于这种理
论上的优势, 关系模型可以设计的更加科学, 关系
数据库中的问题可以更好地解决 。 关系数据库规范
化理论就是数据库逻辑设计工具 。 关系数据库的规
范化理论就是解决如何设计出合理的关系数据库模
式, 也就是一个数据库中要定义哪些表, 每个表有
哪些属性, 表之间有哪些联系, 而尽量地减少数据
冗余, 消除插入, 删除等存在的问题 。
2.3.1 关系模式可能存在的问题
例如, 要设计一个教学管理数据库, 希望在该
数据库中保存学生的学号, 姓名, 性别, 年龄, 系
名, 系主任和该学生选修的课程及成绩信息 。 若据
此设计一个关系保存所有的数据, 关系模式为,
教学 ( 学号, 姓名, 性别, 年龄, 系名, 系
主任, 课程名, 成绩 )
这个关系模式存在以下的问题,
? 数据冗余大
? 插入异常
? 删除异常 。
? 更新异常
由于上述的问题, 它是一个不合理的设计 。 一
个合理的设计应该尽量减少以上的问题 。 只有找到
问题存在的原因, 才能找到解决办法 。 那么出现上
述问题的原因是什么呢? 这是因为这个关系模式中
的数据之间的依赖关系所造成的 。 如果把这个单一
的关系模式, 分解成如下三个关系模式,
学生 ( 学号, 姓名, 性别, 年龄, 所在系 ) ;
系 ( 系名, 系主任 ) ;
选课 ( 学号, 课程名, 成绩 )
2.3.2 函数依赖及规范化
为了使数据库模式的设计更合理, 人们研究了
规范化理论 。 而函数依赖理论是关系规范化的理论
基础 。 函数依赖反映了同一关系中属性间一一对应
的约束 。
1,关系模式的简化表示法
一般把关系模式看做一个三元组,
R( U,F)
其中, R是关系名, U是一组属性, F是属性组
U上的一组数据依赖关系的集合 。 当且仅当 U上的一
个关系 r 满足 F 时, r称为关系模式 R( U,F) 的一
个关系 。
2,函数依赖
函数依赖是数据依赖的一种, 函数依赖反映了
同一关系中属性间的一一对应约束 。 它是现实世界
属性间相互联系的抽象, 是数据内在的性质, 是语
义的体现 。 它是数据库规范化理论的基础 。
函数依赖普遍存在于现实生活中 。 例如在描述
学生的关系中, 可能的属性有学号, 姓名, 所在系
等 。 由于一个学号只对应于一个学生, 一个学生只
能属于一个系, 因此学号确定之后, 该学生的姓名
和所在系也唯一的确定了 。 类似于自变量确定了,
函数值也唯一确定了 。 起决定性的属性相当于自变
量 。 函数依赖记为:学号 → 姓名, 学号 → 所在系 。
现在讨论一个具体的关系模式 。 例如, 要设计
一个教学管理数据库, 希望该数据库中包括的信息
有学生学号, 姓名, 系名, 系主任姓名, 以及学生
学习的课程和成绩 。 于是得到一组属性,
U={学号, 姓名, 系名, 系主任, 课程名, 成绩 }
根据经验得知,
? 一个学号对应一个学生, 即一个学号对应一个
姓名, 但可以有多个学生重名;
? 一个系有若干学生, 但一个学生只属于一个系;
? 一个系只有一名 ( 正职 ) 负责人;
? 一个学生可选修多门课程, 每门课程有若干学生选
修;
? 学生学习每一门课程有一个成绩;
于是得到属性组上的一组函数依赖,
F={学号 → 姓名, 学号 → 系名, 系名 → 系主任, ( 学
号, 课程名 ) → 成绩 }
定义:设 R( U) 是属性集 U上的关系模式 。 X,
Y是 U的子集 。 若对于 R( U) 的任意一个可能的关
系 r( 一个满足约束条件的数据组成的表 ), r中不
可能存在两个元组在 X上的属性值相等, 而在 Y上的
属性值不等, 则称 X函数确定 Y或 Y函数依赖于 X,
记作 X→ Y。
定义:在 R( U) 中,,如果 X→Y, Y→Z, 且
( Y? X), Y X,则称 Z对 X传递函数依赖 。
例如, 在教学关系模式中, 学号 → 系名, 系名 → 系主
任, 所以系主任对学号传递依赖 。
3,范式
关系数据库中的关系是要满足一定要求的 。 满
足不同程度要求的为不同的范式 。 范式是满足一定
函数依赖的关系模式的集合 。 有多种范式:第一范
式, 第二范式, 第三范式, BCN范式等 。 满足最低
要求的叫第一范式, 简称 1NF。 在满足第一范式的
条件下, 满足进一步条件的为第二范式, 简称 2NF。
其余依此类推 。 显然各种范式之间存在关系,
1NF?2NF ? 3NF ? BCNF ? 4NF ? 5NF
一个低一级的范式模式, 通过模式分解可以转换
为若干个高一级范式的模式集合, 这个过程叫规范
化 。
(1) 第一范式 ( 1NF)
定义:如果一个关系模式 R的所有属性都是简单
属性, 即每个属性都是不可再分的基本数据项, 则
称 R属于第一范式, 记作 R ∈ 1NF。
例如, 教学模式中的所有属性都是不可再分的简
单属性, 即,
教学 ( 学号, 姓名, 系名, 系主任, 课程名, 成
绩 ) ∈ 1NF
(2 ) 第二范式 ( 2NF)
定义:若一个关系模式 R∈ lNF,且每一个非主
属性完全函数依赖于关键字, 则 R∈ 2NF。
将教学模式分为以下两个模式,
学生 _系 ( 学号, 姓名, 系, 系主任 ) ;
选课 ( 学号, 课程名, 成绩 )
在, 学生 _系, 关系中,, 学号, 是关键字, 其
它非主属性都完全依赖于关键字,, 选课, 关系中,
( 学号, 课程名 ) 是关键字, 非主属性也完全依赖
于关键字, 因此两个关系中非主属都完全函数依赖
于关键字, 服从 2NF,即,
学生 _系 ∈ 2NF,选课 ∈ 2NF。
(3 ) 第三范式 ( 3NF)
定义:若关系模式 R是第二范式, 且没有一个非主属性传
递函数依赖关键字, 则 R∈ 3NF。 R∈ 3NF,则非主属性对主属
性既不部分函数依赖于关键字, 也不传递函数依赖于关键字 。
考察, 学生 _系, 关系, 可以看出:学号 → 系名, 系名 → 系
主任, 即, 系主任, 传递依赖于, 学号, 。, 学号, 是关键字,
而, 系主任, 是非主属性, 它们之间存在传递函数依赖关系,
因此, 学生 _系, 关系 ?3NF。 如果对, 学生 _系, 关系按第三
范式的要求分解, 分解后的模式如下,
学生 ( 学号, 姓名, 系 )
系 ( 系, 系主任 )
则分解后的模式均属于 3NF。
规范化方法为设计人员判断关系模式的优劣提
供了理论依据, 可以使数据库的设计工作建立在严
格的理论基础上 。
关系模式的优化步骤如下,
① 按需求分析所得到的实体及其联系, 确定数据库中
各关系模式中存在的函数依赖集 。
② 逐一分析各关系模式, 确定关系模式属于第几范式 。
③ 对关系模式通过模式分解的方法进行改进, 使其达
到一定的范式 。
小结
本章介绍了关系数据库的基本概念, SQL语言, 函数依赖
理论及范式 。
1,关系数据库 。 在关系数据库中关系就是表 。 关系数据库中的
实体及联系均用关系来表示 。
2,SQL语言 。 它是关系数据库的结构化查询语言, 具有一体化,
高度非过程化, 语言简洁, 易于使用的特点 。 SQL语言提供了
创建数据库, 定义关系模式, 查询, 更新, 维护, 数据库安全
控制等一系列功能 。
3,关系数据库规范化理论
关系数据库规范化理论是数据库逻辑设计工具 。 关系数据库的
规范化理论就是解决如何设计出合理的关系数据库模式 。
习题
1,试说明 SELECT语句的作用 。
2,试说明 SELECT语句中 FROM,WHERE,GROUP,ORDER、
HAVING的作用 。
3,设学生选课数据库包含如下三个关系模式,
学生 ( 学号, 姓名, 性别, 年龄, 系名 ) ;
系 ( 系名, 系主任 ) ;
选课 ( 学号, 课程名, 成绩 )
试用 SQL语言实现下列操作,
(1) 查询年龄大于 20岁的男生 。
(2) 查询姓王的学生 。
习题
(3) 求出学习高等数学课程学生的最高成绩, 最低成绩和平均成
绩 。
(4) 求出学习数据库原理课程且成绩高于 80分的学生人数 。
(5) 查询每个学生的学号及选修课的数量,
(6) 查询选修三门以上课程的学生学号 。
(7) 查询学习数据库原理课程的学生姓名 。
(8) 把张三的年龄修改为 20。
(9) 删除学号为 951001的学生选修的数据库原理课程 。
习题
4,解释下列名词:函数依赖, 部分函数依赖, 传递函数依赖, 1NF、
2NF,3NF。
5,现在要建立关于系, 学生, 班级信息的数据库, 关系模式为,
学生 ( 学号, 姓名, 出生日期, 系名, 班号, 宿舍区 ) ;
系 ( 系号, 系名, 办公室, 系人数 ) ;
班级 ( 班号, 专业名, 系名, 人数, 入学年份 )
各个属性之间的关系:一个系有若干个专业, 每个专业每年只招一个
班, 每个班有若干学生, 一个系的学生住在同一个宿舍区 。
(1) 请写出每个关系模式的函数依赖, 分析是否存在部分依赖, 传递依
赖 。
(2) 找出各个关系的关键字, 外部关键字 。
(3) 每个关系是什么范式? 如果不是 3NF请规范化为 3NF。