第一篇:数据库原理-理论教学-SQLServer数据完整性
SQL Server数据完整性
一、完整性的概念
之所以要引入数据完整性是为了在数据的添加、删除、修改等操作中不出现数据的破坏或多个表数据不一致
数据完整性是指存储在数据库中的数据正确无误并且相关数据具有一致性
二、完整性的类型 1)实体完整性
实体:表中的记录,一个实体就是指表中的一条记录。实体完整性:在表中不能存在完全相同的记录,且每条记录都要具有一个非空且不重复的主键值。
实现实体完整性的方法:设置主键、惟一索引、惟一约束 2)域完整性
域完整性:向表中添加的数据必须与数据类型、格式及有效的数据长度相匹配。
实现域完整性的方法:CHECK约束、外键约束、默认约束、非空定义、规则以及在建表时设置的数据类型
3)参照完整性 参照完整性:又称为引用完整性。是指通过主键与外键相联系的两个表或两个以上的表,相关字段的值要保持一致。
实现实体完整性的方法:外键约束 4)用户定义的完整性 用户定义的完整性:是根据具体的应用领域所要遵循的约束条件由用户自己定义的特定的规则。
三、约束的类型
约束:SQL Server提供的自动强制数据完整性的一种方法。它通过定义列的取值规则来维护数据的完整性。
常用约束:NOT NULL,CHECK、UNIQUE、PRIMARY KEY、FOREIGN KEY、DEFAULT 1)主键约束:在表中定义一个主键来惟一标识表中的每行记录
特点:每个表中只能有一个主键,主键可是一列,也可是多列;主键不能为空;主键值不能重复
2)UNIQUE约束:它主要用来限制表的非主键列中的值不能重复。特点:一个表中可以定义多个惟一约束
3)NOT NULL约束:它用来设定某列值不能为空。
特点:如果设定某列为NOT NULL,则在添加记录时,则此列必须插入数据。4)CHECK约束:它使用逻辑表达式来限制表中的列可以接受哪些数据值。
例如:成绩值应该在0-100之间,则可以为成绩字段创建CHECK约束,使取值在正常范围内。
5)DEFAULT约束:它为表中某列建立一个默认值,当为表中添加记录时,如果没有提供输入值,则自动以默认值赋给该列。
特点:默认值可以为常量、函数或表达式。使用默认值可以提高数据输入的速度。6)FOREIGN KEY约束
外键:是指一个表中的一列或列组合,它虽不是该表的主键,但是另一个表的主键。特点:实现两表之间相关数据的一致性。
第二篇:SQLserver教学
1.Sql2000 安装和卸载要解决挂起的问题 2.TL_SQL带有条件、循环的语言 3.数据库是如何存储数据的
字段 记录 表 约束(主键 外键 唯一键 非空 check default)4.数据库是如何操作数据
Insert update delete T-SQL 存储过程 函数 触发器 5.数据库是如何显示数据的
6.主键:唯一标识事物;外键:来连接另外相关联的表(来自);对多一(外键存放“多”表)其值不能随便设置;一条记录—元组,列叫字段,属性; 外键表(外键存在的表),主键表(被视为是主键的表)建立外键dept_id int constraint fk_dept_id_hehe foreign key references
dept(dept_id)id int constraint pk_emp_lion primary key,主键
7.主键约束:不允许重复元素,避免了数据的冗余 外键约束:通过外键约束从语法上本事物关联的其他事物一定是存在的(事物与事物之间的关系)
Check约束:sex char(2)check(sex in('男','女'))保证事物在某个取值范围内 Default约束:设定为默认的值
Unique约束:不能插入重复的值,能为空,主键不能为空;unique和not null 可以组合使用;不允许多列为空;orcal中运行多列为空
8.主键的选择:最好用没有业务逻辑的唯一的主键,方便检索; 9.关系:
一对一的关系:可以把表A的主键充当表B的外键,也可反之; 一对多的关系:表A
(一)的主键成为表B(多)的外键;
多对多的关系:班级——老师——学生,单独一张表去实现关系,第三张表的主键设置 外键与外键的组合;外键来自两张表的主键;
10.查询(最重要、难度最大)distinct 会过滤掉重复的deptno的值;distinct 两个属性列可以对他们组成的组合进行过滤;先取表—在过滤条件; Null 不参与逻辑运算,is null,null不能有值的进行运算;
解决办法:sal*12+isnull(comm,0):如果其值为空,返回‘0’,不为空 返回本值 11.Order by(以某个字段排序):不是组合排序,先按照第一个属性排序,相同的再按第二个属性排序;
12.聚合函数 count(deptno)统计返回的不为空的记录
Count(distinct 字段)返回字段不重复的记录数
13.Group by之后select 中只能出现分组后的整体信息,不能显示单独的信息;
先按A分组,如果A相同,在按B分组,如果B分组相同,再按C分组,最总统计的是最小分组的信息;
14.Having 对分组之后的信息进行过滤;
select deptno,avg(sal)from emp group by deptno having avg(sal)>=202_ where对原始的记录进行过滤,group by 是对分组之后的记录过滤; 同:都是对数据进行过滤,保留有效数据
15.连接查询:将两个表或者两个以上的表以一定的连接条件连接起来,从中检索出满足条件的数据; 内连接:select ….from a join b on 条件;select * from a,b对表A、表B 进行笛卡尔积 用where 会对a表进行过滤; On后面为连接条件;jion为连接;
select * from emp,dept where emp.deptno=dept.deptno与内链接结果相同 推荐使用jion on 对连接结果再进行where过滤 3张表进行连接:
select a.ename,a.deptno,b.dname,c.grade from emp a join dept b on a.deptno = b.deptno join salgrade c on a.sal between losal and hisal 外连接:不但返回满足条件的所有几率,而且会返回部分不满足的条件的记录; 完全连接:两个表中匹配的所有行的记录,左边匹配右边,右边匹配左边; 交叉连接:产生一个笛卡尔积 等价于select * from emp,dept 自连接:一张表和自己连接起来查询数据。例子:不准用聚合函数,求薪水最高的员工的信息;
联合的用法:表和表之间的数据以纵向的方式连接在一起; 必须满足两个条件:这select子句必须满足列的属性相同;
注意:我们之前讲的所有的连接是以横向的连接方式去连接在一起的;
16.Identity 主键自动增长,自动增长后删除,不会自动过滤删除过的记录;主键不会自动增长;主键是否连续增长不是十分重要;可以为identity主键赋值;
17.学习的步骤:为什么需要A,什么是A,怎么使用A,使用A时的注意问题,A的应用领域,A的优缺点; 18.视图
1.为什么需要视图;2.什么是视图;3.视图的格式;4.视图的优点、缺点;5.注意的问题;
1).简化查询:避免了代码的冗余,大量重复的SQL语句;从代码上看是一个select语句 从逻辑上看是一个虚拟表看待 视图的格式:
2).Create view 视图的名字
3).用视图去查询数据;4).增加了数据库的维护的成本; As Select 语句
不用添加begin 和end 创建视图的select 语句必须为所有的计算列(非原始的)指定别名;不建议对基表进行操作; 19.事务:保证避免数据处于以后总不合理的中间状态
要么成功,要么失败;
事务也是通过锁来解决很多问题的;线程同步就是通过锁来解决的;
第三篇:SQLServer数据库入门学习总结
SQL Server数据库入门学习总结
经过一段时间的学习,也对数据库有了一些认识。
数据库基本是由表,关系,操作组成;对于初学者首先要学的:
1.数据库是如何存储数据的表,约束,触发器
2.数据库是如何操作数据的
insert,update,delete T-sql 函数 存储过程 触发器
3.数据库是如何显示数据的select
SQLServer数据库学习总结
1.SQL基础
SQL Server2000安装、配置,服务器启动、停止,企业管理器、查询分析器
第一代数据库--网状数据库和层次数据库;第二代数据库--关系数据库
数据库(DB);数据库管理系统(DBMS);数据库系统(DBS)
SQL Server 202_ 提供了不同版本:企业版、标准版、个人版、开发版
SQL Server中的数据类型:整数:int,smallint,tinyint,bigint;浮点数:real,float,decimal;二进制:binary,varbinary;逻辑:bit;字符:char,nchar,varchar,nvarchar;文本和图形:text,ntext,image;日期和时间:datetime,smalldatetime;货币:money,smallmoney
数据库的创建和删除;数据库表的创建、修改和删除
数据完整性:实体完整性:Primary Key,Unique Key,Unique Index,Identity Column;域完整性:Default,Check,Foreign Key,Data type,Rule;参照完整性:Foreign Key,Check,Triggers,Procedure;用户定义完整性:Rule,Triggers,Procedure;Create Table中得全部列级和表级约束
SQL Server中有5种约束:主键约束(Primary Key Constraint)、默认约束(Default Constraint)、检查约束(Check Constraint)、唯一性约束(Unique Constraint)、外键约束(Foreign Key Constraint).关系图
数据库设计的步骤:需求分析、概念结构设计、逻辑结构设计、数据库物理设计、数据库实施、数据库运行和维护
两个实体之间的联系:一对一(1:1)、一对多(1:n)、多对多(m:n)
实体关系模型--E-R图
数据库规范化:将数据库的结构精简为最简单的形式;从表中删除冗余列;标识所有依赖于其他数据库的数据。
数据库三范式:第一范式就是无重复的列;第二范式就是非主属性非部分依赖于主关键字;第三范式就是属性不依赖于其他非主属性
2.SQL语句
SQL全称是“结构化查询语言(Structured Query Language)”
SQL的4个部分:
数据定义语言DDL(Data Definition Language)用来定义数据的结构:create、alter、drop。
数据控制语言DCL(Data Control Language)用来控制数据库组件的存取许可、存取权限等得命令:grant、revoke。
数据操纵语言DML(Data Manipulation Language)用来操纵数据库中得数据的命令:insert、update、delete。
数据查询语言DQL(Data Query Language)用来查询数据库中得数据的命令:select。
SQL中得运算符
:算术运算符、位运算符、比较运算符、逻辑运算符、通配运算符、字符串连接符、赋值运算符
3.查询
简单查询,使用TOP子句
查询结果排序order by
带条件的查询where,使用算术表达式,使用逻辑表达式,使用between关键字,使用in关键字,模糊查询like
在查询中使用聚合函数:sum(x),avg(x),min(x),max(x),count(x),count(*)使用分组查询group by,having子句
distinct关键字
列别名
select top 6 * from sales order by qty desc select au_id,au_fname,au_lname
from
authors
where
state in('ks','ca','mi')
select au_fname,au_lname,phone from authors where au_id like '72[234]-%' select
简单子查询:嵌套子查询、相关子查询;子查询的select语句中不能使用order by子句,roder by子句只能对最终查询结果排序。type,sum(price),avg(price),count(*)
from
titles
group
by
type
having
type in('business','psycheology')嵌套子查询:执行过程,先执行子查询,子查询得到的结果不被显示,而是传给外层查询,作为外层查询的条件,然后执行外层查询,并显示结果。
嵌套子查询的执行不依赖于外层查询,子查询只执行一次。
带有比较运算符的子查询,带有in和not in的子查询,带有any或all的子查询
相关子查询:子查询为外层查询的每一行执行一次,外层查询将子查询引用的列的值传给了子查询。
相关子查询的执行依赖于外层查询,子查询需要重复的执行。
带有exists和not exists的相关子查询。
多表联接查询:内联接(inner join)、外联接((left、right、full)outer join)、自联接(self join)和交叉联接(cross join)
在查询上创建新表:select into语句首先创建一个新表,然后用查询的结果填充新表。
表别名
select coursename from course where courseid in(select distinct courseid from grade where grade>10)
select studname from student where sudbirthday > any(select studbirthday from student where class = '信息系')and class<>'信息系'
select studname from student where exists(select * from grade where studid = student.studid and courseid = '01')
select stud1.* from student as stud1 join student as stud2 on stud2.studname = 'mm' and stud1.studsex = stud2.studsex
select * into girls from student where studsex='m'
4.视图、索引和事务
视图是由一个或多个数据表(基本表)导出的虚拟表或者查询表,是关系数据库系统提供给用户以多种角度观察数据库中数据的重要机制。
视图的好处:能够简化用户的操作;视图能够对机密数据提供安全保护。
创建视图时,视图的名称存在sysobjects表中。有关视图中所定义列的信息添加到syscolumns表中,而有关视图相关性的信息添加到sysdepends表中。另外,create view语句的文本添加到syscomments表中。
在通过视图向表中插入数据时,如果insert语句列表中包含有视图中没有选择的列和不允许为空值的列,这种操作是不允许的。
创建视图:create view view_employee as select emp_id,fname,lname from employee 使用视图:select * from view_employee
修改视图:alter view view_employee as select emp_id,fname,job_id from employee where job_id>10
删除视图:drop veiw view_employee 查看视图结构:exec sp_help view_employee
查看视图定义信息:exec sp_helptext 'view_employee'
索引提供了一种基于一列或多列的值对表的数据行进行快速访问的方法。索引提供的是表中得逻辑顺序。
聚集索引基于数据行的键值在表内排序和存储这些数据行。当数据表以某列为关键字建立聚集索引时,表中得数据行就以该列(聚集索引键)的排序次序进行存储。每个表只能有一个聚集索引。
非聚集索引具有完全独立于数据行的结构,一个表可以建立多个非聚集索引。
创建聚集索引:create clustered index studid_ind on stud(studid)
创建非聚集索引:create unique index studfullname_ind on stud(fname desc,lname)删除索引:drop index stud.studid_ind 查看stud表上得索引:exec sp_helpindex stud
事务是一种机制,是一个操作序列,它包含了一组数据库操作命令,并且所有的命令作为一个整体一起向系统提交或撤销操作请求。
事务的特性:原子性(Atomicity)、一致性(Consistenty)、隔离性(Isolation)、永久性(Durability)。事务分类:显示事务、隐性事务、自动提交事务。
视图、索引和事务的创建、使用、修改和删除
5.Transact—SQL编程
全局变量:由系统定义和维护,其名称以@@字符开头
局部变量:由用户定义和赋值,其名称以@字符开头
输出语句:print
逻辑控制语句:begin...end;break;case;continue;goto;if...else;return;while 常用函数:行集函数,聚合函数,标量函数
转换函数:convert(dt,e,s),cast()
数学函数:绝对值abs(n),向上取整ceiling(n),向下取整floor(n),指定次幂power(n,y),四舍五入round(n,length),求符号sign(n),平方根sqrt(n)日期
和
时
间
函
数
:dateadd(datepart,num,date),datediff(datepart,date1,date2),datename(datepart,date),datepart(datepart,date),getdate(),year(date),month(date),day(date)
字符串函数:lower(e),upper(e),left(e,i),right(e,i),replace(s1,s2,s3)用3替换1中的2,replicate(e,i)重复指定次数,stuff(s1,start,length,s2)用2替换1中指定位置,substring(expression,start,length)元数
据
函
数
:db_id('database_name'),db_name(datebase_id),object_id('obj_name'),object_name(obj_id),col_length('table','column'),col_name(table_id,col_id)聚合函数:avg(expr),count(expr),count(*),max(expr),min(expr),sum(expr)select au_lname,au_fname,contory = case state when 'u
t' then 'utah' when 'ca' then 'california' else 'world'
end,city from authors order by state desc
while(select avg(price)from titles)<30 begin
update titles set price = price * 2
if(select max(price)from titles)>50 break else continue end
print '价格太高'
begin
insert into jobs values('a',80,234)if @@error<>0 print '数据插入失败' else goto M end
M:print '数据插入成功'
6.游标
游标是一种能从包含多条数据记录的结果集中每次提取一条记录的机制。将批操作变成行操作,对结果集中得某行进行操作。
declare author_csr cursor read_only for--定义只读游标
select au_fname,au_lname from authors where state = 'ca' order by au_fname,au_lname declare @lname varchar(20),@fname varchar(20)--定义变量
open author_csr--打开游标
fetch next from author_csr into @lname,@fname--执行一次数据读取操作
while @@fetch_status=0--循环游标读取数据
begin
print 'author name:'+@lname+''+@fname fetch next from author_csr into @lname,@fname end
close author_csr--关闭游标
deallocate author_csr--释放游标
7.存储过程
存储过程(stored procedure)类似c语言中的函数,是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中。用户通过指定存储过程的名字饼给出参数来执行它。
常用的系
统
存
储
过
程
:sp_database,sp_helpdb,sp_renamedb,sp_tables,sp_column,sp_help,sp_helpconstraint,sp_helpindex,sp_stored_procedure,sp_password 创建存储过程:
create as
select @total=count(jy.askbookid)from book,jyls jy where bookname like @book_name and book.isbn=jy.isbn and jy.starttime>=@starttime and endtime<=@endtime procedure book_num
(@book_name
varchar(26),@starttime
datetime,@endtime datetime,@total int output)使用存储过程:
declare @book_name char(26),@total int
set @book_name='面向对象分析和设计'
exec book_num @book_name,'202_-01-01','202_-11-01',@total output select @book_name as bookname,@total as num
8.触发器
触发器是一种特殊类型的存储过程,主要是通过实践进行触发而被执行。
触发器的主要作用就是能够实现由主键和外键所不能保证的复杂的参照完整性和数据的一致性。其他功能:强化约束,跟踪变化,级联运行,存储过程调用。
SQL Server 202_支持两种类型触发器:
after触发器:要求只有执行某一操作之后,触发器才被执行,且只能在表上定义。
instead of触发器:表示并不执行其所定义的操作,而仅是执行触发器本身。既可以在表上定义,也可以在视图上定义,但对同一操作只能定义一个instead of触发器。
工作原理:
当触发insert触发器时,新的数据行就会被插入到触发器表和inserted表中。触发器通过检查inserted表来确定是否执行触发器动作或如何执行。
当在定义有触
发器的表上执行update语句时,原始行被移入到deleted表,更新行被移入inserted表。触发器检查deleted表和inserted表以及被更新的表,来确定是否更新了多行以及如何执行触发器动作。
当触发deleted触发器后,从受影响的表中删除的行将被放置到一个特殊的deleted表中。
create trigger update_smoke_t_sale on smoke_t_sale for update as
declare @newsalenum int,@smokeproductname varchar(40)select @newsalenum= salenum from inserted
select @smokeproductname=smokeproductname from inserted if update(salenum)--判断是否更新
begin update smoke_t_sale
set
saletotalprice=@newsalenum
*
saleprice
where smokeproductname=@smokeproductname
insert into smoke_log(logContent)values('更新成功')end else
print '未更新'
9.数据库高级管理
SQL Server安全体系结构,4个等级:客户机操作系统的安全性,SQL Server的登录安全性,数据库的使用安全性,数据对象的使用安全性 SQL Server验证模式:windows身份验证模式和混合模式(windows身份验证和SQL Server身份验证)
登录账户:用户登录(连接)SQL Server服务器的账户和密码。
角色管理:服务器角色(负责管理和维护SQL Server的组);数据库角色(是对某个数据库具有相同访问权限的用户账户和组的集合)
数据库用户:对于每个要求访问数据库的登录账户,必须在要访问的数据库中建立该数据库的访问账户,且与其登录账户链接关联,才可进入该数据库访问。
权限管理:是指用户是否能进行访问数据库资源的相应操作。权限包括:语句权限、对象权限和暗示权限。
授予权限:
grant 语句 [...] to 安全账户[...]
grant 权限 [...] on 表或视图[(列[,...])]|on 存储过程|on用户自定义函数 to 安全账户[,...] 拒绝权限:
deny 语句 [...] to 安全账户[...]
deny 权限 [...] on 表或视图[(列[,...])]|on 存储过程|on用户自定义函数 to 安全账户[,...] 撤销权限:
revoke 语句 [...] from 安全账户[...]
revoke 权限 [...] on 表或视图[(列[,...])]|on 存储过程|on用户自定义函数 from 安全账户[,...]
备份和恢复:
数据库备份设备,在进行数据库备份之前,首先要创建备份设备。包括:磁盘、磁带和命名管道
SQL Server 备份策略:只备份数据库、备份数据库和事务日志、差异备份。
backup database medicaldb to disk='medical_bk1' with name='medicaldb backup' description='medicaldb fullbackup' init restore database medicaldb from medical_bk1
导入导出:
DTS(Data Transformation Service)是SQL Server提供的数据传输服务。使用户可以将来自完全不同数据源的数据析取、转换并合并到单个或多个目的。
分离与附加:创建可移动的数据库。
第四篇:数据库原理复习
1.请写出SQL Server 202_中的六种约束。
主键约束,唯一键约束,检查约束,默认值约束,外键约束,级联参照完整性约束
2.在关系模型中,有哪三类完整性约束?
实体完整性:体现在实体的唯一性上,在一个关系R中,设属性A是它的主
关键字的组成部分,则属性A不能取空值;
参照完整性:本关系的某一个非主属性值,必须等于另一个关系的关键
字的值;
用户定义的完整性:针对某一具体数据库的约束条件,由应用环境决定,它反映某一具体应用所涉及的数据必须满足的语义要求。
3.数据模型由哪三部分组成?
数据结构,数据操作,完整性约束
1.创建一个名为“产品”的数据库,其包含一个主文件和一个事务日志文件。主文件的逻辑名为“产品销售_data”,物理文件名为“C:产品销售_data.mdf”,初始容量为10MB,最大容量是20MB,每次的增量是10%。事务日志文件的逻辑名为“产品销售_log”,物理文件名为“C:产品销售_log.ldf”,初始容量是2MB,最大容量不受限制,每次的增量是2MB。
CREATE DATABASE产品
ON
PRIMARY
(NAME=产品销售_data,FILENAME='C:产品销售_data.mdf',SIZE=10MB,MAXSIZE=20MB,FILEGROWTH=10%)
LOG ON
(NAME=产品销售_log,FILENAME='C: 产品销售_log.ldf',SIZE=2MB,MAXSIZE=UNLIMITED,FILEGROWTH=2MB)
2、打开“产品”的数据库。
USE产品
3、将“产品”的数据库改名为“产品销售”的数据库
EXEC sp_renamedb产品, 产品销售
4、删除“产品销售”的数据库
DROP DATABASE产品销售5、2)、产品编号、销售商编号都是外键,其中产品编号参照表“产品信息”的产品编号属性,销售商编号参照表“销售商信息”的销售商编号属性。
CREATE TABLE 销售
(产品编号 CHAR(6)references 产品信息(产品编号),销售商编号 CHAR(6)references销售商信息(销售商编号),销售时间DatetimeNOT NULL,数量Int NOT NULL,PRIMARY KEY(产品编号,销售商编号)
6、已知有学生信息表:STUDENT;课程表:COURSE;成绩表:SC
1)、向SC表中添加一条记录(’ 9309119’,‘EE-201’,90.5);
INSERTSC
VALUES('9309119','EE-201',90.5)
2)、删除SC表中学号为9309120的记录;
DELETE SC
WHERE SNO='9309120'
3)、把所有课程的学分都改为4分;
UPDATE COURSE
SET CREDIT =
44)、把学号为9104421的学生的身高改为1.83;
UPDATE STUDENT
SET high=1.8
3WHERE SNO='9104421'
5)、查询COURSE表中每门课程的课程名称、学分;
SELECTcname,creditFROMCOURSE
ORDER BYCREDITDESC
6)、查询所有男同学的学号和姓名;
SELECT sno,sname
FROM student
WHERE sex='男'
7)、查询成绩在90分以上的学生的学号、课程号、成绩。
SELECT sno,cno,grade
FROM sc
WHERE grade>90
8)、查询至少有一门课的成绩在80分以上的男同学的学号;
SELECT sno
FROM student A
WHERE exists(SELECT *
FROM scB
WHERE A.sno=B.sno AND grade>80)
9)、求各门课程的最高分、最低分、平均分;
SELECT sno,max(grade),min(grade), avg(grade)
FROM sc
GROUP BY sno
10)、查询欧阳美龄选修的课程名称和成绩,结果按成绩降序排列;
SELECTcname,grade
FROM student A,course B,sc C
WHERE sname='欧阳美龄' AND A.sno=C.sno AND B.cno=C.cno
11)、查询身高大于李惟德身高的学生的姓名。
SELECTsname
FROM student
WHEREhigh>(SELECT high
FROM student
WHERE sname='李惟德'
12)、求选修了全部课程的学生学号、姓名
SELECT sno
FROM student
WHERE(select distinct cno
FROM sc B
WHERE A.sno=B.sno)
=(SELECT COUNT(*)FROMcourse)
1.实体间的联系可分为三类1:1(或一对一),1:N(或一对多),M:N(或多对多)
2.E-R模型的组成要素包括: 实体,属性,联系。
3.唯一标识实体的属性或属性组称为: 主键
4.关系模型要求关系必须规范化也就是要求关系必须满足一定的条件,这些规范条件中最基本的一条就是,关系的每一个分量必须是: 不可再分的数据项。
5.四种专门的关系操作是:选择、投影、连接、除。
第五篇:数据库原理总结
1关系的范式及规范化
范式是衡量关系模式优劣的标准。范式级别越高,其数据冗余和操作异常现象就越少。第一范式:如果一个关系模式R的所有属性都是不可分的基本数据项,则这个关系属于第一范式。第二范式:若关系模式R属于第一范式,且每个非主属性都完全函数依赖于主键,则R属于第二范式。第三范式:若关系模式R属于第一范式,且每个非主属性都不传递依赖于主关键字,则R属于第三范式。BC范式:若关系模式R属于第一范式,且每个属性都不传递依赖于主关键字,则R属于BC范式。
2对模式的分解显然不是随意的,主要涉及以下两个原则:无损联结:当对关系模式R进行分解时,R的元组将分别在相应属性集进行投影而产生新的关系。如果对新的关系进行自然联接得到的元组的集合与原关系完全一致,则称为无损联结。保持依赖:当对关系模式R进行分解时,R的函数依赖集也将按相应的模式进行分解。如果分解后总的函数依赖集与原函数依赖集保持一致,则称为保持依赖。
3事务的定义:事务是数据库的逻辑工作单位,由用户定义的一组操作序列组成,序列中的操作要么全做要么全不做。
4简述事务所具有的ACID(原子性,一致性,隔离性,持续性)特性:事务的ACID特性是: 原子性:事务是一个不可分割的单位。一致性:事务对数据库操作的结果是将数据库从一个一致性状态变为另一个一致性状态。隔离性:多个事务的并发执行不互相干扰。持续性:事务一旦提交,它对数据库中数据的改变就是永久性的。5事务的调度:事务的执行次序称为调度。若多个事务是按照某一次序串行地执行,则称事务的调度是串行调度。若多个事务同时交叉地并行执行,则称事务的调度为并发调度。
6事务并发执行产生的不一致情况及避免:并发操作可能会产生丢失修改,不能重复读和读”脏”数据这三种不一致情况,采用封锁机制来进行并发控制,可避各种不一致情况。一级封锁协议可以避免丢失修改,二级封锁协议可以避免丢失修改和读”脏”数据,三级封锁协议可以避免丢失修改、不能重复读和读”脏”数据。
7事务的COMMIT语句和ROLLBACK语句的功能是什么?答:COMMIT语句表示事务执行成功地接结束(提交),此时告诉系统,DB要进入一个新的正确状态,该事务对DB的所有更新都已交付实施(写入磁盘)。ROLLBACK语句表示事务执行不成功地结束(应该“回退”)此时告诉系统,已发生错误,DB可能处在不正确的状态,该事务对DB的所有更新必须被撤消,DB应恢复该事务到初始状态。
8活锁和死锁:活锁:在多个事务并发执行的过程中,可能会存在某个总有机会获得锁的事务却永远也没得到锁的现象,可以通过“先来先服务”的策略预防活锁的发生。死锁:在多个事务并发执行过程中,多个并发事务处于相互等待的状态的现象。
9死锁的预防:数据库当中预防死锁的方法有两种。第一种方法是要求每个事务必须一次性地将所有要使用的数据加锁或必须按照一个预定的加锁顺序对使用到的数据加锁。第二种方法是每当处于等待状态的事务由可能导致死锁时,就不再等待下去,强行回滚该事务。
10完整性约束的定义:关系数据库提供的三类完整性约束:实体完整性、参照完整性和用户自定义完整性。实体完整性:实体完整性约束是指任何基本表(关系)的主键(主关键字)中的每一个属性列都不能取空值,即基本表中的每一个元组在主键上的分量都有值。参照完整性:根据参照完整性原则,用户只要定义了某一个关系(基本表)的外键(外部关键字),系统就会控制外键的值要么为空,要么等于被参照关系中某一个主键的值,这就是系统对外键的一种约束。用户定义完整性:用户定义完整性约束条件的作用对象可以是属性列、元组或关系(基本表),其中对属性列的约束可以规定属性列的数据类型、取值范围等;对元组的约束可以规定元组中各属性间的相互关系;而对关系的约束则可以规定各元组间或关系间的相互联系。
11故障恢复的原则:对数据库的影响有两种可能性:一是数据库本身被破坏;二是数据库没有被破坏,但数据可能不正确,这是因为事务的运行被非正常终止造成的。12恢复算法一般由两部分组成:在正常事务处理时采取措施,保证有足够的冗余信息可用于故障恢复。故障发生后采取措施,将数据库内容恢复到某个保证数据库一致性、事务原子性及持久性的状态。
13数据库在运行过程中可能产生的故障有哪几类? 答:1)事务故障:事务在运行过程中由于种种原因,如输入数据的错误,运算溢出,违反了某些完整性限制,某些应用程序的错误,以及并行事务发生死锁等,使事务未能运行到正常中指点之前就被撤消了,这种情况称为“事务故障”。2)系统故障:系统故障是指系统在运行过程中,由于某些原因,如OS和DBMS代码错误,操作员操作事物。特定类型的硬件错误(CPU故障),突然停电等造成系统停止运行,致使事物在执行过程中以非控方式中指。这时。内存中的信息丢失,而存储在外存储上的数据未受影响,这种情况称为“系统故障”。3)介质故障:系统在运行过程中,由于某种硬件故障,如磁盘损坏,磁头碰撞,或由于OS的某种潜在的错误。瞬间强磁场干扰,使存储在外存的数据部分损失或全部损失,称之为“介质故障”。14故障恢复技术:数据转储、日志文件、检查点方法、数据库镜像
15关系的完整性约束:域完整性约束:关系中属性的值应是域中的值,并由语义决定其能否为空值。实体完整性约束:关系中的主键不能为空值。参照完整性约束:关系的外键必须是另一个关系主键的有效值或者是空值。用户自定义完整性约束:正对某一具体数据的约束条件,由应用环境决定。
16故障恢复原理是冗余可分为副本和日志。恢复算法:在正常事物处理时采取措施,保证有足够的冗余信息可用于故障恢复、故障发生后采取措施,将数据库内容恢复到某个保证数据库一致性、事物原子性及持久性的状态。
17事务故障的恢复:事务故障是指事务在运行至正常终止点前被中止,这时恢复子系统应利用日志文件撤消(UNDO)此事务已对数据库进行的修改。事务故障的恢复是由系统自动完成的,对用户是透明的,系统的恢复步骤是:⑴ 反向扫描文件日志(即从最后向前扫描日志文件),查找该事务的更新操作。⑵ 对该事务的更新操作执行逆操作。即将日志记录中“更新前的值”写入数据库。这样,如果记录中是插入操作,则相当于做删除操作(因此时“更新前的值”为空)。若记录中是删除操作,则做插入操作,若是修改操作,则相当于用修改前值代替修改后值。⑶ 继续反向扫描日志文件,查找该事务的其他更新操作,并做同样处理。⑷ 如此处理下去,直至读到此事务的开始标记,事务故障恢复就完成了。
18系统故障的恢复:系统故障造成数据库不一致状态的原因有两个,一是未完成事务对数据库的更新可能已写入数据库,二是已提交事务对数据库的更新可能还留在缓冲区没来得及写入数据库。因此,恢复操作就是要撤销故障发生时未完成的事务,重做已完成的事务。系统恢复步骤如下:正向扫描日志文件,即从头扫描日志文件,找出在故障发证前已经提交的事务,将其事务标示记入重做队列,同时找出故障发证时尚未完成的事务,将其事务标识计入撤销队列、对撤销队列中的各个事务进行撤销处理、对重做队列中的各个事务进行重做扫描
19日志文件作用及建立原因:答:日志文件是用来记录事务对数据库的更新操作的文件。目的是进行事物故障恢复;进行系统故障恢复;协助后备副本进行介质故障恢复。
20三级模式:三级模式结构:数据库的三级模式由外模式、概念模式和内模式三级模式构成。概念模式:简称模式,又称数据库模式、逻辑模式。一个数据库只有一个概念模式,它是数据库系统三级模式结构的中间层,概念模式是数据库中全体数据的逻辑描述,而不是数据库本身,它是装配数据的一个结构框架。外模式:外模式简称子模式,又称用户模式,是数据库用户能够看见和使用的局部数据的逻辑结构和特征的描述,是数据库用户的数据视图,是用户与数据库系统之间的接口。一个数据库可以有多个外模式,设置外模式的优点如下:方便用户使用,简化用户接口、保证数据的独立性、有利于数据共享、有利于数据安全和保密。内模式:内模式也称存储模式。是对数据库中数据物理结构和存储方式的描述,是数据在数据库内部的表示形式。一个数据库只能有一个内模式。21两级映像:外模式/概念模式映像:外模式/概念模式映像定义了各个外模式与概念模式间的映像关系。概念模式/内模式映像:概念模式/内模式映像定义了数据库全局逻辑结构与存储结构之间的对应关系。
22两极结构的独立性:物理数据独立性:如果数据库内模式要修改,即数据库的物理结构有所变化,那么只要对概念模式/内模式做相应的修改即可。概念模式/内模式提供了数据的物理数据独立性。逻辑数据独立性:如果概念模式要修改,例如增加记录类型或增加数据项,那么只要对外模式/概念模式映像做相应的修改,就可以使外模式和应用程序尽可能保持不变。这样,就称数据库打到了逻辑数据独立性。外模式/概念模式映像提供了数据的逻辑独立性。
23数据库技术的发展阶段:工管理阶段(数据部保存、没有对数据进行管理的软件系统、没有文件的概念、一组数据对应于一个程序,数据时面向应用的)、文件系统阶段(数据需要长期保存在外存上供反复使用、程序和数据之间有了一定得独立性、文件的形式已经多样化、数据的存取基本以记录为单位)、数据库系统阶段(数据结构化、数据共享、减少数据冗余、具有较高的数据独立性、方便用户接口、统一的数据管理与控制功能)
某校与教学管理相关的3个关系模式的结构如下: 学生(学号、姓名、年龄、性别、所在系)课程(课程号、课程名、开课系、任课教师)学习(学号、课程号、成绩)试进行如下操作:
1.创建“教学”数据库,在“教学”数据库中创建“学生”、“课程”、“学习”这3个基本表,并说明主键和外键。2.使用SQL的查询语句表达下列查询(1)查询刘老师所授课程的课程号和课程名(2)查询年龄大于23岁的男学生的学号和姓名
(3)查询至少修读刘老师所授课程中一门课程的女学生和姓名(4)查询王乐同学不学的课程的课程号(5)查询至少修读两门课程的学生学号
(6)查询全部学生都修读的课程的课程号与课程名(7)查询修读课程中包含刘老师所授课程的学生学号
3)SELECT 姓名 FROM 学生 WHERE 性别=‘女’ AND EXISTS(SELECT * FROM 学习WHERE 学习.学号=学生.学号 AND 课程号 IN(SELECT 课程号 FROM 课程 WHERE 任课教师 LIKE ‘刘%’))4)SELECT 课程号 FROM 课程 WHERE NOT EXISTS(SELECT * FROM 学习WHERE 学习.课程号=课程.课程号 AND 学号 IN(SELECT 学号 FROM 学生 WHERE 姓名=‘王乐’))5)SELECT 学号 FROM 学生 GROUP BY 学号 HAVING COUNT(*)>=2 6)SELECT 课程号,课程名 FROM 课程 WHERE NOT EXISTS(SELECT * FROM 学生 WHERE NOT EXISTS(SELECT * 学号 FROM 学习WHERE 学习.课程号=课程.课程号 AND 学习.学号=学生.学号))7)SELECT 学号 FROM 学习WHERE EXISTS(SELECT * FROM 学习WHERE 课程号 IN(SELECT * FROM 课程号 FROM 课程 WHERE 任课教师 LIKE ‘刘%’))试用SQL查询语句表达下列对教学数据库中3个基本表“学生”、“课程”、“学习”的查询(1)统计有学生修读的课程门数(2)求修读C4课程的学生的平均年龄
(3)求刘老师所授课程的每门课程的学生平均成绩
(4)统计每门课程学生的修读人数(超过10人的课程才统计),要求输出课程号和修读人数,查询结果按人数降序排列,若人数相同,按课程号升序排列(5)查询学号比王乐同学大,而年龄比他小的学生姓名(6)查询姓名以王打头的所有学生的姓名和年龄(7)在“学习”表中检索成绩为空值的学生学号和课程号(8)求年龄大于女同学平均年龄的男学生姓名和年龄(9)求年龄大于所有女同学年龄的男学生姓名和年龄 SELECT COUNT(DISTINCT 课程号)FROM 学习
SELECT AVG(年龄)FROM 学生 WHERE EXISTS(SELECT * FROM 学习WHERE学生.学号=学习.学号 AND 课程号=’C4’)SELECT AVG(成绩)FROM 学习WHERE GROUP BY 课程号 HAVING 课程号 IN(SELECT 课程号 FROM 课程 WHERE 任课教师 LIKE ‘刘%’)SELECT 课程号,COUNT(*)AS C_COUNT FROM 学习HAVING C_COUNT>10 ORDER BY C_COUNT DESC,课程号
SELECT 姓名 FROM 学生 WHERE 学号>ALL(SELECT 学号FROM 学生WHERE 姓名=’王乐’)AND 年龄(SELECT AVG(年龄)FROM 学生 WHERE 性别=’女’)SELECT 姓名, 年龄 FROM 学生WHERE 性别=’男’ AND年龄>(SELECT MAX(年龄)FROM 学生 WHERE 性别=’女’)试用SQL更新语句表达对“教学”数据库中3个基本表“学生”、“课程”和“学习”的各个更新操作(1)向基本表“学生”中插入一个学生组(‘S009’,‘吴’,18)
(2)在基本表“学生”中查询每一门课程成绩都大于等于80分的学生学号、姓名和性别,并把查询到的值送往另一个已存在的基本表“结果”(学号,姓名,性别)中(3)在基本表“学习”中删除尚无成绩的元组
(4)把王乐同学在“学习”基本表中的课程和成绩全部删除(5)把修读Java课程不及格的成绩全改为空值(6)把低于总平均成绩的女同学成绩提高5%(7)在基本表“学习”中修改C4课程的成绩,若成绩小于等于75分时提高5%,若成绩大于75分时提高4%(用两个UPDATE语句实现)INSERT INTO 学生 VALUES(‘S009’,’吴’,18)INSERT INTO 结果(学号,姓名,性别)SELECT学号,姓名,性别 FROM 学生 WHERE NOT EXISTS(SELECT * FROM 学习WHERE 学生.学号=学习.学号 AND 成绩<80)DELETE FROM 学习WHERE 成绩 IS NULL DELETE FROM 学习WHERE 学号 IN(SELECT 学号 FROM 学生 WHERE 姓名=’王乐’)UPDATE 学习SET成绩=NULL WHERE 成绩<60 AND 课程号 IN(SELECT 课程号 FROM 课程 WHERE 课程名=’JAVA’)UPDATE 学习SET 成绩=成绩*1.05 WHERE 成绩<(SELECT AVG(成绩)FROM 学生)UPDATE 学习SET 成绩=成绩*1.04 WHERE 成绩>75 AND 课程号=’C4’ UPDATE 学习SET 成绩=成绩*1.05 WHERE 成绩<=75 AND 课程号=’C4’