第一部分第1讲要点关系数据库应用举例及主要概念1.docx
《第一部分第1讲要点关系数据库应用举例及主要概念1.docx》由会员分享,可在线阅读,更多相关《第一部分第1讲要点关系数据库应用举例及主要概念1.docx(19页珍藏版)》请在冰豆网上搜索。
第一部分第1讲要点关系数据库应用举例及主要概念1
第一部分关系数据库应用举例及相关概念
数据库群108138854
第一讲【20110310/第三周/教室C1-206】(3节课)
例一基于数据库的简单的学生信息【学生(学号,姓名,性别,年龄,系)】管理【问:
管理的内容?
如何进行手工管理?
如何使用基本文件系统管理?
】
1、信息管理应考虑的几方面因素【关系数据(处理)模型的组成要素:
数据结构、数据操作、数据的完整性约束条件P13】
1)数据结构【信息】描述成表的形式:
学生(学号,姓名,性别,年龄,系)
涉及的数据库术语:
*表,即“关系”,
*表结构,即为“关系模式”
*表列,即表属性
2)数据处理【操作】【对应SQL命令】:
增加、删除、修改、查询【根据条件查找】
3)一些完整性约束条件【有三点,此例涉及两点】:
对数据操作的约束,如学号非空唯一【实体完整性,即主码约束】,年龄在15-36【用户自定义完整性约束】等
2、基于数据库管理系统(BDMS)实现
1)安装数据库管理系统(DBMS),先安装使用SQLServer2008后安装使用oracle11g(实验一:
提供安装过程要点说明文档,安装程序自己找,5人一小组共同完成,第一周完成前一个系统安装,第二周完成后一个安装。
交安装过程详细说明报告)。
见书P6图1.2数据库在计算机系统中的地位,P11图1.7数据库系统阶段应用程序和数据之间的对应关系。
2)建立学生信息数据库
*数据库名:
jsj,
*目录:
D:
\SQLServer2008_db\
*对应若干文件:
数据文件:
D:
\SQLServer2008_db\jsj_Data.MDF
日志文件:
D:
\SQLServer2008_db\jsj_Log.LDF
(1)使用DBMS图形用户界面建立及删除数据库
建立:
右击【数据库】,选择【新建数据库】,输入数据库名【如jsj,或test】,修改数据库对应的数据文件及日志文件的目录【D:
\SQLServer2008_db】,右击数据库并点击【刷新】
删除:
右击要删除的数据库,在弹出的快捷菜单中点击删除。
(2)使用命令(SQL命令)建立数据库
新建查询,输入命令并保存为文件【或打开已经保存的命令文件】,执行建立或删除数据库
建立数据库命令:
CREATEDATABASEjsj
ON(NAME='jsj_Data',--数据库文件名称
FILENAME='D:
\SQLServer2008_db\jsj_Data.MDF',
SIZE=3,--数据库大小,至少M
FILEGROWTH=10%)
LOGON(NAME='jsj_Log',--数据库日志文件名称
FILENAME='D:
\SQLServer2008_db\jsj_Log.LDF',
SIZE=3,--2008至少M
FILEGROWTH=10%)
COLLATEChinese_PRC_CI_AS--指定数据库的默认排序规则
删除数据库命令:
Usemaster
DROPDATABASEjsj
3)在数据库中建立(定义)表SQL命令
SQL建表命令为:
usejsj--选择数据库
createtables
(
snochar(8)primarykey,
snamechar(20)null,
ssexchar
(2),
sageint,
sdeptchar(20)
)
说明:
primarykey主码约束(非空唯一)
null空约束,notnull非空约束
4)对表进行增、删、改、查询操作SQL命令
*见命令文件
*增加(插入)记录
usejsj--选择数据库
insertintosvalues('1001','n1','f',20,'信电系')
insertintosvalues('1002','n2','f',21,'信电系')
insertintosvalues('1003','n3','f',21,'信电系')
insertintosvalues('1004','n4','m',21,'信电系')
insertintosvalues('1005','n5','m',21,'信电系')
*查询(例如:
查找女同学信息)
usejsj
select*fromswheressex='f'
*删除表中的记录
usejsj
deletefroms
*修改记录
usetest
updatessetssex='f'wheresno='1004'
*修改、删除、查询可以加入条件(问题:
删除女同学记录?
)
5)关于完整性约束条件的实现
*在建表语句中定义完整性约束条件,DBMS自动维护完整性约束条件。
*主键约束【即非空唯一】定义【任何表需要】:
primarykey【可定义在行级,也可以定义在列级】(列级级约束与行级约束)(P152实体完整性)。
*用户自定义完整性定义(P156):
**检查约束:
check(sage>=15andsage<=36);
**空否:
notnull;
**唯一否:
notunique;
**缺省:
default
*数据结构与完整性约束定义举例。
命令文件为:
操作【2】test中创建表s【加完整性】
createtables
(
snochar(8),--primarykey,
snamechar(20)unique,
ssexchar
(2),
sageintcheck(sage>=15andsage<=36),
sdeptchar(20)notnull,
constraintPK_Sprimarykey(sno)–显式定义约束名
)
(重要考点:
不显式定义约束名,是否意味系统没有约束名?
)
*对数据库操作进行操作时完整性约束条件维护
6)建表语句产生的结果(P85)(重要考点!
)
*建表语句产生的结果:
建立空表,将表定义以及完整性约束条件存放到数据字典(系统表)中。
*学生表中的主键约束,既可以定义在列级(列级约束)也可以定义在表级(称表级约束)
*学生选课表中的主键约束是否可以定义在列级?
(不可以)
7)P30术语对比(非规范关系即表中套表)(P45关系模型要求关系必须是规范化的即满足一定的规范条件,这些规范条件中最基本的一条是关系的每一个分量必须是一个不可分割的数据项,即分量必须取原子值)(例子学生表中的属性“入校毕业年份”)(重要考点!
)
例一要点总结:
关系【表】,关系模式【表结构或表头】,属性,主码,数据模型的三要素,完整行约束条件【实体、参照(后述)、用户自定义】,SQL命令的使用【建立(删除)数据库、建立(删除)表(包括完整性约束条件定义)、对表的增加、删除、修改、查询操作】。
再次理解图1.2图1.7。
上机作业(实验一):
安装DBMS,建立数据库、建立表、表中记录的增删改查询、命令文件的保存以及打开。
第二、三、四讲【20110317/第四周(2节课*2),第五周(3节课)/教室C1-206】
例二基于关系数据库的学生选课信息管理
1、需求分析(P205):
信息(数据)要求、处理要求、安全性与完整性要求
2、需求描述(数据流图、数据字典)
3、关系模型数据结构即一组表(不同方案优劣比较)
*需要描述的信息有:
学生、课程、选课
*描述成几张表【讨论】?
讨论以下两个方案哪个好?
方案一:
三个关系模式
学生(学号,姓名,性别,年龄,系,)
课程表(课程号,课程名,先修课,学分)
选课(学号,课程号,成绩)
方案二:
一个关系模式
学生选课(学号,姓名,性别,年龄,系,课程号,课程名,先修课,学分,成绩)
不同方案优劣比较基于以下四个方面考虑:
**数据冗余度:
方案二学生信息【一学生学修多门课程】、课程信息【一门课程被多个学生选修】
**更新异常:
修改冗余信息时会面临数据不一致性问题
**插入异常:
方案二学生未选修课程时不能将学生信息存入表中,课程未被学生选时课程信息不能存入表中。
即需要保存的信息保存不了。
**删除异常:
方案2中,如果学生删除全部选课信息时,学生自己的信息也被删除;同样如果某课程的选课信息被全部删除,此课程的信息也被删除。
即不该删除的信息被删除。
4、规范的数据库设计过程【设计E-R图,将E-R图转变为关系模式】
1)设计E-R图【概念模型】P14(必考点!
)
*现实世界有两类信息:
实体型,实体型之间的联系
实体型指用实体名及其属性来抽象和刻画同类实体
*学生选课的E-R图【P224三个要素:
实体型,实体属性,实体型间的联系、联系属性、联系类型(三类)】
mn
补充1:
1及1:
n联系
*信息世界涉及的概念主要有P14【实体、属性、码、域、实体型、实体集、联系】
2)将E-R图向关系模型的转换【转换结果同方案1】(必考点!
)
*(P224)E-R图向关系模型的转换要解决的问题是如何将实体型和实体间的联系转换为关系模式,如何确定这些关系模式的属性和码。
*将实体型、实体的属性和实体间的联系转换为关系模式的主转换原则(P225):
一个实体型转换为一个关系模式;联系转换(1:
1,1:
n,m:
n)?
*根据转换规则(P224-225)将学生选课E-R图转换为一组关系模式的结果:
正好是方案一(规范设计过程得到的规范结果)
*方案二不是规范设计过程得到的规范结果
问题:
如何对方案二进行规范化?
使用目前已经学的知识进行规范化。
以后将介绍别的规范化知识:
关系数据库设计理论(规范设计过程)
*问题:
分析去年规范化考题。
考题要求使用规范化理论进行规范化,现在还没有学规范化理论,该如何规范化?
(规范设计过程)
3)学生选课E-R图中增加班级实体型及学生与班级联系(1:
n)
*E-R图(实体型个数,实体的联系个数)(班级的属性有班号、班名、人数)
*与ER图相对应的一组关系模式
学生(学号,姓名,性别,年龄,系,班号)
课程表(课程号,课程名,先修课,学分)
选课(学号,课程号,成绩)
班级(班号,班名,人数)
(关系模式既描述了实体型,也描述了实体间的联系)(问题:
只描述了实体型的关系模式?
只描述了实体间联系的关系模式?
既描述了实体型又描述了实体间联系的关系模式?
)
学生(学号,姓名,性别,年龄,系,班号)--实体及联系
课程表(课程号,课程名,先修课,学分)--实体
选课(学号,课程号,成绩)--联系
班级(班号,班名,人数)--实体
*问题:
人数是否一定需要描述?
(是否是冗余数据?
即此数据是否可以从其它数据中导出?
)(重要考点!
)
*问题:
教材中的P222图7.28ER消除冗余中冗余数据的理解?
教材P19图1.14工厂物资管理ER图(c)完整的实体-联系图中如果零件实体型中加上数量属性你认为是否有必要?
(课后结合P222内容辩证考虑)(重点!
)
*课堂练习:
去年考题数据库设计(设计ER图,设计关系模式)(应特别注意ER图中的冗余属性!
)
5、外码及参照完整性(P50、51)
*外码概念的引出:
描述联系的属性,非主码
问题:
找出4-3)中各关系模式的外码。
问题:
班号是外码,学号是外码的说法是否正确?
*参照完整性(对外码取值的约束)【外码或者取空值,或者取以此外码作为主码表的某个元组的主码值】【P51】
*问题:
a)选课(学号,课程号,成绩)关系模式中外码是否可以取空值?
b)外码取空值的含义?
6、建立学生选课项目数据库、表、往表中插入数据(元组)
1)建立数据库(几个项目可以使用一个数据库,或一个项目一个数据库)
*考虑目录,数据库文件(数据文件、日志文件、文件大小、是否自动增长等)(如数据库已存在先删除,可基于图形化界面的菜单,先关闭所有查询窗口)
--删除并建立数据库jsj
IFEXISTS(SELECTnameFROMmaster.dbo.sysdatabasesWHEREname='jsj')
DROPDATABASEjsj
GO
CREATEDATABASEjsj
ON(NAME='jsj_Data',--数据库文件名称
FILENAME='D:
\SQLServer2008_db\jsj_Data.MDF',
SIZE=3,--数据库大小,至少M
FILEGROWTH=10%)
LOGON(NAME='jsj_Log',--数据库日志文件名称
FILENAME='D:
\SQLServer2008_db\jsj_Log.LDF',
SIZE=3,--2008至少M
FILEGROWTH=10%)
COLLATEChinese_PRC_CI_AS--指定数据库的默认排序规则
2)在数据库中建立表(表及完整性约束条件定义,约束显式命名,表级及列级约束)
usejsj
/*Table:
course*/
createtablec(
cnochar(8)constraintPK_Cprimarykey,--列级显式定义约束名
cnamechar(20),
cpnochar(8)constraintfk_c_cpnoreferencesc(cno),--列级显式定义约束名
ccreditint
)
/*Table:
student*/
createtables(
snochar(8)primarykey,--未给出约束名,DBMS自动命名
snamechar(10)null,
ssexchar
(2),
sageint,
sdeptchar(20)
)
/*Table:
sc*/
createtablesc(
snochar(8),
cnochar(8),
gradeintegernull,
primarykey(sno,cno),--问题:
是否可以定义在列级?
(不可以)
foreignkey(sno)referencess(sno),
foreignkey(cno)referencesc(cno)--问题:
是否可以定义在列级?
)
3)往表中插入元组
usejsj;
deletefroms;
deletefromc;
deletefromsc;
insertintosvalues(97001,'aa','f',22,'信电系');
insertintosvalues(97002,'bb','f',21,'信电系');
insertintosvalues(97003,'cc','f',20,'信电系');
insertintosvalues(97004,'dd','m',22,'信电系');
insertintosvalues(97005,'ee','m',21,'信电系');
insertintosvalues(97101,'ff','m',18,'化工系');
insertintocvalues('1','计算机语言_pascal',null,null);
insertintocvalues('2','操作系统_dos',null,1);
insertintocvalues('3','数据库原理','1',2);
insertintocvalues('4','编译原理',null,1);
insertintoscvalues(97001,1,90);
insertintoscvalues(97002,2,89);
insertintoscvalues(97002,3,89);
insertintoscvalues(97003,3,95);
insertintoscvalues(97003,1,null);
7、对学生选课数据库操作(增加、删除、修改、查询)
1)增加、修改参照表(如SC表)操作必须满足(不能违背)完整性约束条件(即SC表中元组的外码sno值必须取S表中元组的主码分量值,cno值必须取C表中元组的主码分量值)
*P155表5.1第1、2行
S表:
SC表:
--增加SC表记录(外码取值约束)
usejsj
insertintoscvalues(98001,1,null);--出错原因?
sno未取S表中元组的主码分量值?
--修改SC表记录(外码取值约束)
usejsj
updatescsetsno='98001'wheresno='97001'
问题:
sno改为'97101'是否可以?
2)删除被参照表(也称主表,如S或C)元组或修改被参照表元组的主码值,参照表(也称子表如SC)元组操作与参照完整性约束条件
--删除s表中未被引用记录(如97004)
usejsj
deletefromswheresno='97004'--未被引用
--删除s表中已被引用记录(如97001)
usejsj
deletefromswheresno='97001'–已被引用,无法删除
--修改S表中未被引用记录(允许,为什么?
)
usejsj
updatessetsno='98004'wheresno='97004'
--修改S表中已被引用记录(不允许,为什么?
)
usejsj
updatessetsno='98002'wheresno='97002'
*P155表5.1第3、4行
usejsj
--droptablec;
createtablec
(
cnochar(8)constraintPK_Cprimarykey,--列级约束,显式定义约束名
cnamechar(20),
cpnochar(8)constraintfk_c_cpnoreferencesc(cno)ondeleteNOACTION,
ccreditint
);
--droptables;
createtables
(
snochar(8),--primarykey,
snamechar(20)unique,
ssexchar
(2),
sageint,
sdeptchar(20),
constraintPK_Sprimarykey(sno),--表级约束显式定义约束名
constraintcheck_scheck(ssexin('f','m')andsage<36)--元组级命名check约束
--或者
--check(ssexin('f','m')andsage<36)--元组级非显式命名check约束【自动命名】
);
--注:
主键与唯一约束自动建立索引
--droptablesc;
createtablesc
(
snochar(8)referencess(sno)ondeletecascadeonupdatecascade,
--cascade表示当删除或修改主表中被引用列的数据时,级联删或修改子表中相应的数据行
--或者setnull表示当删除主表中被引用列的数据时,将子表中相应引用列的值设置为null
--或者noaction表示当删除主表中被引用列的数据时,如果子表中引用的列包含该值,则禁止操作执行【默认】
cnochar(8),--referencesc(cno)ondeletecascade,
gradeintegernull,
primarykey(sno,cno),
constraintfk_sc_cnoforeignkey(cno)referencesc(cno)--列级显示命名约束定义
);
注:
先执行【4讲】删除并建立数据库jsj建表插入元组【级联】
--修改S表中已被引用记录(允许,且SC表中的相应值同时被修改即级联修改)
usejsj
updatessetsno='98002'wheresno='97002'
--改到原值
usejsj
updatessetsno='97002'wheresno='98002'
--删除s表中已被引用记录(如)
usejsj
deletefromswheresno='97001'--已被引用,级联删除sc中相关记录
问题:
sc表在定义外码时是否可以使用setnull?
8、关系(表)数据结构及形式化定义(是笛卡尔乘积的子集)P42-43
*笛卡尔积举例及定义(P42)(一组域,一组域上的笛卡尔积)
(基数:
关系模式的所有元组数)
*关系定义(P43):
一组域上的笛卡尔积的子集称这组域上的关系
*候选码、主码、主属性、非码属性、全码(P44)
*有三种类型的关系(P44):
基本关系(也称基本表或基表)、查询表、视图表
**基本表是实际存在的表,它是实际存储数据的逻辑表示。
**查询表是查询结果对应的表(给出其关系代数的表达形式)
usejsj
select*fromswheressex='f'
usejsj
selectsno,snamefromswheressex='f'
**视图是由基本表或其它视图表导出的表,是虚表,不对应实际存储的数据(后讲述)
第五、六讲(第六周,周四2节*2,周五2节*2)
*基本关系具有六条性质(见P45):
特别重要的是第六条性质(1NF即第一范式)(P29、P45、P174)。
关系模型要求关系必须是规范化(normalization)的,即要求关系必须满足一定的规范条件。
这些规范条件中的最基本的一条就是第六条性质(P45)。
(问题:
不满足第一范式举例?
)
注意:
实际的关系数据库产品中,基本表并不完全具有6条性质。
例如:
有些数据库产品仍然区分属性和元组顺序;有些允许表中存在完全相同的元组,除非用户定义了相应的约束条件。
如以下语句在SQLServer2008中能成功执行
--建表(未定义实体完整性即主键约束)
usejsj
createtables5(
snochar(8),--未定义primarykey约束
snamechar(10),
ssexchar
(2),
sageint,
sdeptchar(20)
)
--往表中插入两个相同的元组
usejsj
deletefroms5;
insertintos5values(97001,'aa','f',22,'信电系');
insertintos5values(97001,'aa','f',22,'信电系');
insertintos5values(97001,'aa','f',22,'