数据库复习.docx
《数据库复习.docx》由会员分享,可在线阅读,更多相关《数据库复习.docx(12页珍藏版)》请在冰豆网上搜索。
数据库复习
数据库系统(DBS)是指在计算机系统中引入数据库后的系统构成。
在不引起混淆的情况下常常把数据库系统简称为数据库。
组成:
数据库、操作系统、数据库管理系统、开发工具、数据库管理员、用户、OS
数据(Date)
数据是描述现实世界的符号记录,是用物理符号记录的可以鉴别的信息.物理符号有多种表现形式,包括数字文字图形图像声音及其他特殊符号。
数据的各种表现形式都可以通过数字化存入计算机
数据库系统(DBS)
数据库(DB)是存储在计算机内、有组织的、可共享的数据集合
数据库系统在整个计算机系统中的地位如图所示
DBMS在操作系统支持下工作,应用程序在DBMS支持下才能使用数据库
数据库管理系统(DBMS)
数据库管理系统(DBMS)是位于用户与操作系统之间的一层数据管理软件。
1.关系模型的数据结构和基本术语
属性(Attribute)和域(Domain)二维表中的列(字段)称为属性,属性值的取值范围称为域。
元组(Tuple)二维表中的一行称为一个元组
分量(Component)元组中的一个属性值。
候选码(CandidateKey)或候选键存在一个属性(或一组属性)的值,能唯一标识关系的一个元组。
主码(PrimaryKey)或主键在候选码中指定一个主码。
主属性(PrimaryAttribute)和非主属性(NonprimaryAttribute)包含在任何一个候选码中的属性称为主属性。
外码(ForeignKey)或外键关系中的某个属性不是主码(或只是主码的一部分)却是另一个关系的主码。
聚集索引:
索引与表中的数据物理顺序相同。
非聚集索引:
用于指定数据逻辑顺序,表中的数据没有按索引键值指定顺序排列而仍然按照插入记录时的顺序存放
表的数据类型:
字符型:
char--------sgenderchar
(2)
nchar-------
varchar--------snovarchar(10)、snamevarchar(20)、sdeptvarchar(20)
数值型:
int---------sageint
bigint----------比int存储范围更大
聚集函数:
count----个数【count(*)不需要任何参数且不能与distinct连用】
sum----和
avg----平均值
max----最大值
min----最小值
注意:
被参照关系的主码和参照关系的外码必须定义在同一个域上
参照关系(ReferencingRelation)与被参照关系
系统数据库:
master数据库、model数据库、tempdb数据库、madb数据库
数据库文件:
主数据文件(有且只有一个)、次数据文件(0-17个)、事务日志文件(至少有一个)。
数据库的三种恢复模式:
简单恢复模式、完整恢复模式、大容量日志恢复模式。
数据库备份的类型:
完整备份、差异备份、事务日志备份、文件及文件组备份。
数据库的安全验证模式:
Windows身份验证模式、混合验证模式。
关系代数的五种操作
并、差、笛卡尔积、选择、投影
1.实体完整性规则
若属性(或属性组)A是基本关系R的主属性,则A不能取空值。
主关系键的值不能为空或部分为空
学生关系中的主关系键“学号”不能为空
选课关系中的主关系键“学号+课程号”不能部分为空,
即“学号”和“课程号”两个属性都不能为空
2.参照完整性规则
如果关系R2的外键X与关系R1的主键相符,则X的每个值或者等于R1中主键的某一个值,或者取空值
1.函数依赖
定义:
设R(U)是一个属性集U上的关系模式,X,Y是U的子集。
若对于R(U)的任意一个可能的关系r,r中不可能存在两个元组在X上的属性值相等,而在Y上的属性值不等,则称“X函数确定Y”或“Y函数依赖于X”,记作X→Y。
非平凡的函数依赖
如果X→Y,但Y不是X的子集,则称X→Y,是非平凡的函数依赖。
2.平凡的函数依赖
如果X→Y,但Y是X的子集,则称X→Y,是平凡的函数依赖。
在关系模式SC中,因为(Sno,Cname)→Grade,是非平凡的函数依赖,而(Sno,Cname)→Sno和(Sno,Cname)→Cname则是平凡的函数依赖
3.决定因素(决定属性集)
如果X→Y,则X称为这个函数依赖的决定因素。
4.X↔Y:
若X→Y,Y→X,则记作X↔Y。
5.XY:
若Y不函数依赖于X,则记作XY。
6.完全函数依赖
如果X→Y,并且对于X的任何一个真子集X′,都有X′Y,则称Y对X完全函数依赖,记作X→Y。
7.部分函数依赖
如果X→Y,但Y不完全函数依赖于X,则称Y对X部分函数依赖,记作X→Y。
8.传递函数依赖
若X→Y,但YX,而Y→Z,则称Z对X传递函数依赖,记作:
X→Z。
第一范式
定义:
如果一个关系模式R的每一个属性都是不可分的数据项,则称R符合第一范式,记作R∈1NF
1NF是关系模式应具备的最起码的条件。
第一范式可能具有大量的数据冗余,具有插入异常、删除异常和更新异常等弊端。
如关系模式SCD属于1NF,它既存在完全函数依赖,又存在部分函数依赖和传递函数依赖。
克服这些弊端的方法是用投影运算将关系分解,去掉过于复杂的函数依赖关系,向更高一级的范式进行转换。
第二范式
定义:
若关系模式R∈1NF,并且每一个非主属性都完全函数依赖于R的码,则称R符合第二范式,记作R∈2NF。
{从1NF关系中消除非主属性对主属性的部分函数依赖,则可得到2NF]
2NF规范化是指把1NF关系模式通过投影分解,转换成2NF关系模式的集合。
第三范式
定义:
如果关系模式R∈2NF,且每个非主属性都不传递函数依赖于R的码,则称R符合第三范式,记作R∈3NF。
存储过程
定义:
独立存在于表多的数据库对象
类型:
系统存储、扩展存储、本地存储、临时存储、远程存储。
BC范式:
任何满足BCNF的关系都必然属于3NF
第一范式定义:
在关系模式R的每个关系r中,如果每个属性都是不可再分的基本数据项,则称R为第一范式,简称IEN,,记作RϾINF
第二范式:
消除非主属性对码的部分函数依赖
第三范式:
消除非主属性对码的传递函数依赖
BCNF:
消除主属性对码的部分和传递函数依赖
视图的概念视图是虚表,其数据不进行存储,其记录来自基本表,只在数据库中存储其定义。
逻辑机构,无存储数据,只有定义
局部变量:
类型为float和char局部变量其中,名字分别为f和cn并且char类型的长度为8。
Declare@ffloat,@cnchar(8).
运算符优先级
第三、四讲
课本3、6、7、8章
•1、基本表的创建与维护
•在SQL语言中,使用语句CREATETABLE创建数据表,其基本语法格式为:
•CREATETABLE<表名>(<列名><数据类型>[列级完整性约束]
•[,<列名><数据类型>[列级完整性约束]],……
•[表级完整性约束])
•说明:
•1)<表名>:
所要定义的基本表的名字。
2)<列名>:
表由一个或多个属性(列)组成,建表同时通常需要定义列信息及每列所使用的数据类型,列名在表内必须是唯一的。
3)<数据类型>:
定义表的各个列(属性)时需指明其数据类型和长度,不同的数据库系统支持的数据类型不完全相同,应根据实际使用的DBMS来确定。
4)<列级完整性约束条件>:
只应用到一个列的完整性约束条件。
5)<表级完整性约束条件>:
应用到多个列的完整性约束条件。
•常用完整性约束
主码约束:
PRIMARYKEY(约束主码唯一性与非空性)
唯一性约束:
UNIQUE(属性取值唯一,不重复)或(元组分量唯一,不重复)
非空值约束:
NOTNULL
参照完整性约束(外码—主码对应,外码不多于主码)
2删除表
DROPTABLE<表名>
基本表删除:
数据、表上的索引都删除,表上的视图往往仍然保留,但无法引用。
[例]删除Student表
DROPTABLE Student
2、建立索引
•语句格式
•CREATE[UNIQUE][CLUSTER]INDEX<索引名>ON<表名>(<列名>[<次序>][,<列名>[<次序>]]…);
用<表名>指定要建索引的基本表名字
索引可以建立在该表的一列或多列上,各列名之间用逗号分隔
用<次序>指定索引值的排列次序,升序:
ASC,降序:
DESC。
缺省值:
ASC
UNIQUE表明此索引的每一个索引值只对应唯一的数据记录
CLUSTER表示要建立的索引是聚簇索引。
•唯一值索引
–对于已含重复值的属性列不能建UNIQUE索引
–对某个列建立UNIQUE索引后,插入新记录时DBMS会自动检查新记录在该列上是否取了重复值。
这相当于增加了一个UNIQUE约束
•删除索引
DROPINDEX<索引名>;
删除索引时,系统会从数据字典中删去有关该索引的描述。
[例]删除Student表的Stusname索引。
DROPINDEXStusname
3、数据更新
1)插入数据
(插入一个元组)
•插入单个元组
语句格式
INSERT
INTO<表名>[(<属性列1>[,<属性列2>…)]
VALUES(<常量1>[,<常量2>]…)
功能--将新元组插入指定表中。
•INTO子句
–指定要插入数据的表名及属性列,属性列的顺序可与表定义中的顺序不一致
–没有指定属性列:
表示要插入的是一条完整的元组,且属性列属性与表定义中的顺序一致
–指定部分属性列:
插入的元组在其余属性列上取空值
•VALUES子句
–提供的值必须与INTO子句匹配
>值的个数
>值的类型
2)修改数据
UPDATE<表名>
SET<列名>=<表达式>[,<列名>=<表达式>……]
[WHERE<条件>]
(1)按指定条件修改元组
将表studentinfo中“200302303055”号学生的姓名改为:
“孙明洁”。
UPDATEStudentInfoSETStuName=‘孙明洁’
WHEREStuNo=’200302303055’
(2)修改表中所有元组的值
将所有学生的平均成绩OrdinarySc加1。
UPDATESCSETOrdinarySc=OrdinarySc+1
3)删除数据
DELETE<表名>
[WHERE<条件>]
(1)按指定条件删除一个或多个元组
[例]删除“03123803”号课程的选课信息。
DELETESC
WHERECNO=’03123803’
(2)删除表中所有元组
[例]删除成绩表中的所有记录。
DELETESC
4视图
(1) 定义视图
CREATEVIEW<视图名>[(<视图列表>)]
AS<子查询>
[WITHCHECKOPTION]
[例]建立2004级英语成绩在85分以上的学生的视图。
CREATEVIEWEnggrade
AS
SELECTSno,Sname,Grade
FROMStu2004grade
WhereCourse=‘英语’ANDGrade>85
2) 删除视图
用SQL命令删除视图
DROPVIEW<视图名>
例如:
DROPVIEWStu2004grade
视图删除后,只会删除该视图在数据字典中的定义,
而与该视图有关的基本表中的数据不会受任何影响
(3)查询视图
视图定义后,对视图的查询操作如同对基本表的查询操作一样。
在2004级学生的视图中找出1986年以前出生的学生。
SELECTStuName,Birth
FROMStu2004
WHEREBirth<‘1986-1-1‘
{SELECTStuName,Birth
FROMStudentInfo
WHEREEnterdate=2004
ANDBirth<‘1986-1-1‘}
视图的建立简化了查询操作
4) 更新视图
由于视图是一张虚表,所以对视图的更新,最终转换成对基本表的更新。
其语法格式如同对基本表的更新操作一样。
插入--INSERT
更新--UPDATE
删除--DELETE
单表查询语句基本格式:
[use数据库名称]
select目标列表达式[,…….n]
from表名
where条件(表达式)
[ORDERBY排序条件]
内连接查询
例:
在course表与sc表中查询cno是“1”的课程对应的“学号”“课程名称”“学分数”
USE学生课程数据库
selectsc.sno,cname,ccredit
fromcourseinnerjoinsc
ono=o(innerjoinstudenton…)
whereo=‘1’
汇总查询
聚合函数
groupby子句
having子句
(compute子句)
(computeby子句)
例:
根据课程分组,统计cgrade的总分与平均分,显示平均成绩大于90分的查询信息。
use学生课程数据库
selectcname,sum(cgrade)as'总分',avg(cgrade)as'平均分'
fromscinnerjoincourseono=course.con
groupbycname
havingavg(cgrade)>=90
注意:
select子句涉及显示的列名必须包含在聚合函数或groupby子句中
存储过程
1创建、修改与执行存储过程
语法格式
CREATEPROC[EDURE]procedure_name[{@parameterdata_type}[=default][OUTPUT]]
ASsql_statement[…n]
修改:
create改为:
alter
执行:
EXEC存储过程名[参数值]
例:
创建存储过程,完成功能:
执行后可查询任意学生的系别信息。
use学生课程数据库
go
createproceduredemo1
@stunumbvarchar(10)=null
as
selectsname,sdept
fromstudent
wheresno=@stunumb
执行:
execdemo1‘1’
DML触发器的创建和应用
使用CREATETRIGGER命令创建DML触发器的语法形式如下:
CREATETRIGGERtrigger_name
ON{table|view}
[WITH[ENCRYPTION]
{FOR|AFTER|INSTEADOF}{[INSERT][,][UPDATE][,][DELETE]}
AS
{sql_statement[;][...n]}
for或after规定触发动作完成后执行触发器;
Insteadof规定触发器动作代替触发动作执行
例 创建一个触发器,在course表上插入、更新数据时触发,触发后输出course表的所有信息。
程序如下:
CREATETRIGGERtr_c
ONcourse
InsteadofINSERT,UPDATE
AS
BEGIN
select*
fromcourse
END
2、DDL触发器的创建和应用
使用CREATETRIGGER命令创建DDL触发器的语法形式如下:
CREATETRIGGERtrigger_name
ON{ALLSERVER|DATABASE}
{FOR|AFTER}{create_table|alter_table|drop_table}
AS{sql_statement[;][...n}
例:
使用DDL触发器来防止在数据库中创建表。
程序如下:
CREATETRIGGERsafety
ONDATABASE
FORCREATE_TABLE
AS
PRINT'CREATETABLEFailed!
!
!
'
ROLLBACK