数据库复习总结

数据库复习总结

文章目录


前言

本学期对数据库的学习分别有电脑部分和非电脑部分。在电脑部分,我们使用了Microsoft SQL Server Management Studio 18。然后在非电脑部分是对数据库整体的准备与评价方法。

一、下载SQL?

直接到网上搜素SQL与即可下载,这有两个版本,初学者并无区别,要说最大区别就是所占内存不同。然后下载一切默认,选择,如有下载方向上的问题,到网上直接搜索即可。在此我强调一下我自己出现的问题
在这里插入图片描述

大家可以发现,我的服务器名称是空的,这时候你可以填写用名反斜杠前面的内容,或者就是输入一个 “ . ”。
(点击)这是我从网上找到的已经写好的博客,手把手教大家如何安装,有缘人看了这篇文章,就不用去麻烦找了

二、一些基本的概念

实体(Entity)

客观存在并可相互区别的事物称为实体。
可以是具体的人、事、物或抽象的概念。

属性(Attribute)

实体所具有的某一特性称为属性。
一个实体可以由若干个属性来刻画。 (例子:高矮胖瘦)

码(Key)——也称键

唯一标识实体的属性集称为码。注意码不是单个属性,它是多个属性的集合。印象中常用有全码(所有属性都在码里面),主码,外码,候选码,非码(就是不是码)。主码是从多个候选码中选出一个即可。外码是另一个实体的主码但不是本实体的码,用于建立和加强两个表数据之间的链接的一列或多列,一般由某个表承担多个外码,使得不相关的表相关。

主属性与非主属性

候选码的诸属性称为主属性(Prime attribute)
不包含在任何侯选码中的属性称为非主属性( Non-Prime attribute)或非码属性(Non-key attribute)

域(Domain)

是一组具有相同数据类型的值的集合,关系中不同列可以对应相同的域,为了加以区分,必须对每列起一个名字,称为属性,属性的取值范围称为该属性的域。

实体型(Entity Type)

用实体名及其属性名集合来抽象和刻画同类实体称为实体型

实体集(Entity Set)

同一类型实体的集合称为实体集

对实体,实体集,实体型的区分:

对于我们日常说的教师而言,某一个老师是一个实体,多个老师是实体集,实体型就是还多包涵了老师的一些属性,比如:年龄等。

联系(Relationship)

  1. 现实世界中事物内部以及事物之间的联系在信息世界中反映为实体内部的联系和实体之间的联系。
  2. 实体内部的联系通常是指组成实体的各属性之间的联系
  3. 实体之间的联系通常是指不同实体集之间的联系
  4. 联系包含3类:
    一对一联系(1:1) ,一对多联系(1:n),多对多联系(n,n)
    在这里插入图片描述

这就是两个以上实体型间的多对多联系
在这里插入图片描述

ER图

通过上面所用到的联系,把它们整合到一起即可形成在这里插入图片描述

一些基本模型

非关系模型:
1.层次模型
2.网状模型
关系模型:
面向对象模型:
对象关系模型:(也就是我们数据库要用到的啦)

  1. 关系(Relation)
    一个关系对应通常说的一张表
  2. 元组(Tuple)
    表中的一行即为一个元组
  3. 属性(Attribute)
    表中的一列即为一个属性,给每一个属性起一个名称即属性
  4. 主码(Key)
    表中的某个属性组,它可以唯一确定一个元组。
  5. 域(Domain)
    属性的取值范围。
  6. 分量
    元组中的一个属性值。
  7. 关系模式
    对关系的描述:
    关系名(属性1,属性2,…,属性n)
    学生(学号,姓名,年龄,性别,系,年级)
    注意:关系的每一个分量必须是一个不可分的数据项, 不允许表中还有表 。
    在这里插入图片描述

三、关系数据库

三类常用(关系)表

基本关系(基本表或基表)
实际存在的表,是实际存储数据的逻辑表示
查询表
查询结果对应的表(select 选出的)
视图表
由基本表或其他视图表导出的表,是虚表,不对
应实际存储的数据(如果仅想把表中限定条件下的内容做某些改变,可以创建视图存储)

关系操作

常用的关系操作:

  1. 查询:选择、投影、连接、除、并、交、差
  2. 数据更新:插入、删除、修改
  3. 查询的表达能力是其中最主要的部分
  4. 选择、投影、并、差、笛卡尔基是5种基本操作

实体完整性

实体完整性规则的说明
(1) 实体完整性规则是针对基本关系而言的。一个基本表通常对应现 实世界的一个实体集。
(2) 现实世界中的实体是可区分的,即它们具有某种唯一性标识。
(3) 关系模型中以主码作为唯一性标识。
(4) 主码中的属性即主属性不能取空值。
主属性取空值,就说明存在某个不可标识的实体,即存在不可区分的实体,这与第(2)点相矛盾,因此这个规则称为实体完整性

参照完整性规则

若属性(或属性组)F是基本关系R的外码它与基本关系S的主码Ks相对应(基本关系R和S不一定是不同的关系),则对于R中每个元组在F上的值必须为:
1.或者取空值(F的每个属性值均为空值)
2.或者等于S中某个元组的主码值

专门的关系运算(关系代数)

在这里插入图片描述

  1. 选择又称为限制(Restriction)。 选择运算符的含义:在关系R中选择满足给定条件的诸元组 σF® = {t|tR∧F(t)= ‘真’}
    F:选择条件,是一个逻辑表达式,基本形式为:X1θY1
    选择运算是从关系R中选取使逻辑表达式F为真的元组,是从行的角度进行的运算
  2. 投影运算符的含义:从R中选择出若干属性列组成新的关系 :
    πA® = { t[A] | t R }(A:R中的属性列)
    投影操作主要是从列的角度进行运算(但投影之后不仅取消了原关系中的某些列,而且还可能取消某些元组(避免重复行))
  3. 连接也称为θ连接,
    连接运算的含义:从两个关系的笛卡尔积中选取属性间满足一定条件的元组
    在这里插入图片描述
    A和B:分别为R和S上度数相等且可比的属性组
    θ:比较运算符
    连接运算从R和S的广义笛卡尔积R×S中选取(R关系)在A属性组上的值与(S关系)在B属性组上值满足比较关系θ的元组
    两类常用的连接:
    在这里插入图片描述
    自然连接是一种特殊的等值连接
    两个关系中进行比较的分量必须是相同的属性组
    在结果中把重复的属性列去掉(连接的表会含有R.b与S.b列,只有自然连接会输出b列)
    自然连接的含义:R和S具有相同的属性组B
    在这里插入图片描述
  4. 除。给定关系R (X,Y) 和S (Y,Z),其中X,Y,Z为属性组。
    R中的Y与S中的Y可以有不同的属性名,但必须出自相同的域集。
    R与S的除运算得到一个新的关系P(X),
    P是R中满足下列条件的元组在 X 属性列上的投影:
    元组在X上分量值x的象集Yx包含S在Y上投影的集合,记作:
    R÷S = {tr [X] | tr  R∧πY (S)  Yx }
    Yx:x在R中的象集,x = tr[X]
    在这里插入图片描述

四、T-SQL代码使用

数据库

创建库

如下引用一个作业的例子来帮助理解:
CREATE DATABASE SPJ
ON PRIMARY /* 主文件组 /
(NAME=‘SPJ_data’, /
主数据文件逻辑名 */
FILENAME=‘d:\201900800139\SPJ.mdf’,
SIZE=10MB,
FILEGROWTH=10%)
FILEGROUP Grp2 /定义在次文件组Grp2上的文件/
( NAME = Grp2_file1,
FILENAME=’ C:\Program Files\Microsoft SQL Server\MSSQL.1 \MSSQL\Data \ Grp2_file1.ndf ',
SIZE=10,MAXSIZE=50,FILEGROWTH=5)
LOG ON /事务日志文件/
(NAME=‘SPJ_log’,
FILENAME=‘d:\201900800139\SpJ.ldf’,
SIZE=1MB,
MAXSIZE=10MB,
FILEGROWTH=1MB)

修改数据库

ALTER DATABASE database_name
{ADD FILE [,…n]
[TO FILEGROUP filegroup_name]
|ADD LOG FILE < filespec >[,…n]
|REMOVE FILE logical_file_name
|ADD FILEGROUP filegroup_name
|REMOVE FILEGROUP filegroup_name
|MODIFY FILE < filespec >
|MODIFY NAME=new_database_name
|MODIFYFILEGROUP filegroup_name{filegroup_property|NAME=new_filegroup_name}
}

删除数据库

DROP DATABASE 学生管理数据库(名字)

创建表

CREATE TABLE kc
(
课程号 char(4) not null PRIMARY KEY,
课程名 char(16) not null,
学分 smallint,
学时数 smallint
)

修改表

ALTER TABLE xs
ADD 电话 CHAR(8)NULL /*增加列

通过在ALTER TABLE 语句中使用ALTER COLUMN 子句,可以修改列的数据类型、长度等属性。其语法格式如下:
ALTER TABLE 表名
ALTER COLUMN <列名>新数据类型[(长度)][NULL|NOT NULL] 新列属性

ALTER TABLE 表名 DROP COLUMN 列名 /*删除列

EXEC sp_rename 原对象名, 新对象名 /*sp_rename存储过程对表和表中的列进行重命名

DROP TABLE 表名[,…n] /*删除数据表,n代表用逗号隔开删除多个表

INSERT [INTO] 表名 [(列名l, 列名2,…)] /*添加数据
VALUES (表达式1, 表达式2,…)
INSERT INTO Dept_age(Sdept,Avg_age)
SELECT Sdept,AVG(Sage)
FROM Student
GROUP BY Sdept;

UPDATE 表名
SET
{
列名 = { 表达式 | DEFAULT | NULL }[ ,…n ]}
[FROM 另一表名 [ ,…n ]]
[WHERE <条件表达式> ]

DELETE [FROM] 表名
[WHERE {<条件表达式>}]

表的管理

使用存储过程查看表结构信息:
[EXECUTE] sp_help [表名]

索引

建立索引

CREATE [UNIQUE] [CLUSTER] INDEX <索引名>
ON <表名>(<列名>[<次序>][,<列名>[<次序>] ]…);
在最经常查询的列上建立聚簇索引以提高查询效率 一个基本表上最多只能建立一个聚簇索引经常更新的列不宜建立聚簇索引

删除索引

DROP INDEX <索引名>;

视图

虚表,是从一个或几个基本表(或视图)导出的表只存放视图的定义,不存放视图对应的数据基表中的数据发生变化,从视图中查询出的数据也随之改变

创建视图

组成视图的属性列名:全部省略或全部指定。子查询不允许含有ORDER BY子句和DISTINCT短语
CREATE VIEW <视图名> [(<列名> [,<列名>]…)]
AS <子查询>
[WITH CHECK OPTION];

删除视图

语句的格式:
DROP VIEW <视图名>;
该语句从数据字典中删除指定的视图定义
如果该视图上还导出了其他视图,使用CASCADE级联删除语句,把该视图和由它导出的所有视图一起删除
删除基表时,由该基表导出的所有视图定义都必须显式地使用DROP VIEW语句删除

查询视图

SELECT Sno,Sage
FROM IS_Student
WHERE Sage<20;

更新视图(和表一样的操作)

UPDATE IS_Student
SET Sname= ‘刘辰’
WHERE Sno= ’ 200215122

INSERT
INTO IS_Student
VALUES(‘95029’,‘赵新’,20)

DELETE
FROM IS_Student
WHERE Sno= ’ 200215129 ’

视图的作用

  1. 视图能够简化用户的操作
  2. 视图使用户能以多种角度看待同一数据
  3. 视图对重构数据库提供了一定程度的逻辑独立性
  4. 视图能够对机密数据提供安全保护
  5. 适当的利用视图可以更清晰的表达查询

数据查询

查询格式

SELECT [ALL|DISTINCT] <目标列表达式> [,<目标列表达式>] …
/*需要的输出,all为默认,distint去掉表中重复的行
FROM <表名或视图名>[, <表名或视图名> ] … /*数据来源
[ WHERE <条件表达式> ] /*条件限制
[ GROUP BY <列名1> [ HAVING <条件表达式> ] ]
/*一般用来分组,相同属性值的为一组;having是条件限制
[ ORDER BY <列名2> [ ASC|DESC ] ]; /*排序,asc是升序,就是由小到大,默认的

使用列别名改变查询结果的列标题:
SELECT Sname NAME,'Year of Birth: ’ BIRTH
2000-Sage BIRTHDAY,LOWER(Sdept) DEPARTMENT
FROM Student;

常用查询的条件(where中使用)

在这里插入图片描述

聚集函数

计数,统计行数
COUNT([DISTINCT|ALL] *)
COUNT([DISTINCT|ALL] <列名>)
计算总和
SUM([DISTINCT|ALL] <列名>)
计算平均值
AVG([DISTINCT|ALL] <列名>)
最大最小值
MAX([DISTINCT|ALL] <列名>)
MIN([DISTINCT|ALL] <列名>)

连接查询

等值连接

连接运算符为=
查询每个学生及其选修课程的情况
SELECT Student.,SC.
FROM Student,SC
WHERE Student.Sno = SC.Sno;

自身连接

一个表与其自己进行连接
需要给表起别名以示区别
由于所有属性名都是同名属性,因此必须使用别名前缀

查询每一门课的间接先修课(即先修课的先修课)
SELECT FIRST.Cno,SECOND.Cpno
FROM Course FIRST,Course SECOND
WHERE FIRST.Cpno = SECOND.Cno;

外连接

普通连接操作只输出满足连接条件的元组
外连接操作以指定表为连接主体,将主体表中不满足连接条件的元组一并输出
SELECT Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade
FROM Student LEFT(RIGHT) OUT JOIN SC ON (Student.Sno=SC.Sno);

复合条件连接

复合条件连接:WHERE子句中含多个连接条件

查询选修2号课程且成绩在90分以上的所有学生
SELECT Student.Sno, Sname
FROM Student, SC
WHERE Student.Sno = SC.Sno AND /* 连接谓词*/
SC.Cno= ‘2’ AND SC.Grade > 90; /* 其他限定条件 */

嵌套查询

SELECT Sname /外层查询/父查询/
FROM Student
WHERE Sno IN /*ANY:任意一个值,ALL:所有值
(SELECT Sno /内层查询/子查询/
FROM SC /*不能使用ORDER BY子句
WHERE Cno= ’ 2 ');

带有EXISTS谓词的子查询

由EXISTS引出的子查询,其目标列表达式通常都用* ,因为带EXISTS的子查询只返回真值或假值,给出列名无实际意义
查询至少选修了学生200215122选修的全部课程的学生号码。
SELECT DISTINCT Sno
FROM SC SCX
WHERE NOT EXISTS
(SELECT *
FROM SC SCY
WHERE SCY.Sno = ’ 200215122 ’ AND
NOT EXISTS
(SELECT *
FROM SC SCZ
WHERE SCZ.Sno=SCX.Sno AND
SCZ.Cno=SCY.Cno));

集合查询

查询计算机科学系的学生及年龄不大于19岁的学生。
SELECT *
FROM Student
WHERE Sdept= ‘CS’
UNION
SELECT *
FROM Student
WHERE Sage<=19;
UNION:将多个查询结果合并起来时,系统自动去掉重复元组。
UNION ALL:将多个查询结果合并起来时,保留重复元组
交操作INTERSECT
差操作EXCEPT

数据库安全性

自主存取控制(授权与回收)

GRANT语句的一般格式:
GRANT <权限>[,<权限>]…
[ON <对象类型> <对象名>]
TO <用户>[,<用户>]…
[WITH GRANT OPTION];
WITH GRANT OPTION子句:
指定:可以再授予。没有指定:不能传播
不允许循环授权,即A->B;B->C;C->A;
GRANT SELECT /update(可指定列)/insert
ON TABLE Student
TO U1;(用户U1)
GRANT ALL PRIVILIGES(全部权限)


REVOKE语句的一般格式为:
REVOKE <权限>[,<权限>]…
[ON <对象类型> <对象名>]
FROM <用户>[,<用户>]…;


创建数据库模式的权限:
CREATE USER
[WITH][DBA | RESOURCE | CONNECT]
在这里插入图片描述

数据库角色

数据库角色:被命名的一组与数据库操作相关的权限
角色是权限的集合
可以为一组具有相同权限的用户创建一个角色
简化授权的过程
一、角色的创建
CREATE ROLE <角色名>

二、给角色授权
GRANT <权限>[,<权限>]…
ON <对象类型>对象名
TO <角色>[,<角色>]…

三、将一个角色授予其他的角色或用户
GRANT <角色1>[,<角色2>]…
TO <角色3>[,<用户1>]…
[WITH ADMIN OPTION]

四、角色权限的收回
REVOKE <权限>[,<权限>]…
ON <对象类型> <对象名>
FROM <角色>[,<角色>]…

视图机制

把要保密的数据对无权存取这些数据的用户隐藏起来,对数据提供一定程度的安全保护 。
主要功能是提供数据独立性,无法完全满足要求。间接实现了支持存取谓词的用户权限定义
CREATE VIEW CS_Student
AS
SELECT *
FROM Student
WHERE Sdept=‘CS’;
视图可以显示创建视图的人想让你看见的内容而不暴露原始表的信息。他所有操作接近表。

审计

审计分为:

  1. 用户级审计
    针对自己创建的数据库表或视图进行审计
    记录所有用户对这些表或视图的一切成功和(或)不成功的访问要求以及各种类型的SQL操作
  2. 系统级审计
    DBA设置
    监测成功或失败的登录要求
    监测GRANT和REVOKE操作以及其他数据库级权限下的操作

对修改SC表结构或更新SC表数据的操作进行审计
AUDIT ALTER,UPDATE
ON SC;

取消对SC表的一切审计
NOAUDIT ALTER,UPDATE
ON SC;

数据库的完整性

数据的完整性和安全性是两个不同概念
数据的完整性
防止数据库中存在不符合语义的数据,也就是防止数据库中存在不正确的数据
防范对象:不合语义的、不正确的数据
数据的安全性
保护数据库防止恶意的破坏和非法的存取
防范对象:非法用户和非法操作

实体完整性

关系模型的实体完整性
CREATE TABLE中用PRIMARY KEY定义
单属性构成的码有两种说明方法
定义为列级约束条件
定义为表级约束条件
对多个属性构成的码只有一种说明方法
定义为表级约束条件
在列级定义主码:
CREATE TABLE Student
(Sno CHAR(9) PRIMARY KEY,
Sname CHAR(20) NOT NULL,
Ssex CHAR(2) ,
Sage SMALLINT,
Sdept CHAR(20));
在表级定义主码:
CREATE TABLE Student
(Sno CHAR(9),
Sname CHAR(20) NOT NULL,
Ssex CHAR(2) ,
Sage SMALLINT,
Sdept CHAR(20),
PRIMARY KEY (Sno)
);

参照完整性

定义SC中的参照完整性
CREATE TABLE SC
(Sno CHAR(9) NOT NULL,
Cno CHAR(4) NOT NULL,
Grade SMALLINT,
PRIMARY KEY (Sno, Cno), /在表级定义实体完整性/
FOREIGN KEY (Sno) REFERENCES Student(Sno),
/在表级定义参照完整性/
FOREIGN KEY (Cno) REFERENCES Course(Cno)
/在表级定义参照完整性/
);

属性上的约束条件的定义

CREATE TABLE时定义
列值非空(NOT NULL)
列值唯一(UNIQUE)
检查列值是否满足一个布尔表达式(CHECK)

元组上的约束条件的定义

在CREATE TABLE时可以用CHECK短语定义元组上的约束条件,即元组级的限制
同属性值限制相比,元组级的限制可以设置不同属性之间的取值的相互约束条件
CREATE TABLE Student
(Sno CHAR(9),
Sname CHAR(8) NOT NULL,
Ssex CHAR(2),
Sage SMALLINT,
Sdept CHAR(20),
PRIMARY KEY (Sno),
CHECK (Ssex=‘女’ OR Sname NOT LIKE ‘Ms.%’)
/定义了元组中Sname和 Ssex两个属性值之间的约束条件/
);

完整性约束命名子句

CONSTRAINT 约束
CONSTRAINT <完整性约束条件名>
[PRIMARY KEY短语
|FOREIGN KEY短语
|CHECK短语]

修改:
ALTER TABLE Student
DROP CONSTRAINT C1;
————————————————————
CREATE TABLE Student
(Sno NUMERIC(6)
CONSTRAINT C1 CHECK (Sno BETWEEN 90000 AND 99999),
Sname CHAR(20)
CONSTRAINT C2 NOT NULL,
Sage NUMERIC(3)
CONSTRAINT C3 CHECK (Sage < 30),
Ssex CHAR(2)
CONSTRAINT C4 CHECK (Ssex IN ( ‘男’,‘女’)),
CONSTRAINT StudentKey PRIMARY KEY(Sno)
);

批处理

建立批处理如同编写SQL语句,区别在于它是多条语句同时执行的,用GO语句作为一个批处理的结束。
注意:GO语句行必须单独存在,不能含有其他的SQL语句,也不可以有注释。

局部变量的定义

语法形式如下:
DECLARE {@变量名 数据类型}[,…N]
(2)局部变量的赋值方法
其语法形式为:
SET {@变量名=表达式}
或者
SELECT{@变量名=表达式}[,…N]
set是一个一个,select是多个

语句块与循环和条件一起

在条件语句和循环语句等控制流程语句中,当符合特定条件需要执行两个或者多个语句时,就应该使用BEGIN…END语句将这些语句组合在一起

IF EXISTS(SELECT 课程号 FROM cj WHERE 课程号=‘J005’)
BEGIN
DECLARE @AVG FLOAT
SET @AVG=(SELECT AVG(成绩) FROM cj
WHERE 课程号=‘J005’)
SELECT ‘已开过"数据库SQL Server"课。’,@AVG AS 平均分
END
ELSE
PRINT ‘没有开过"数据库SQL Server"课。’

case when

SELECT 学号,
课程名=CASE 课程号(简单表达式)
WHEN ‘J001’ THEN ‘计算机基础’
WHEN ‘J002’ THEN ‘数据结构’
WHEN ‘J003’ THEN ‘操作系统’
WHEN ‘J005’ THEN ‘数据库SQL Server’
WHEN ‘A001’ THEN ‘英语’
WHEN ‘A002’ THEN ‘数学’
WHEN ‘A005’ THEN ‘体育’
END
, 成绩=CASE(搜索表达式)
WHEN 成绩>=90 THEN ‘优’
WHEN 成绩>=80 THEN ‘良’
WHEN 成绩>=70 THEN ‘中’
WHEN 成绩>=60 THEN ‘及格’
ELSE ‘不及格’
END
FROM cj

goto语句

GOTO语句可以使程序直接跳到指定的标识符位置处继续执行,而位于GOTO语句和标识符之间的程序将不会被执行。标识符后面加冒号(:)。GOTO语句可以用在语句块、批处理和存储过程中。GOTO语句也可以嵌套使用。

DECLARE @I INT,@T INT
SET @I=1
SET @T=1
LABEL:
SET @T=@T*@I
SET @I=@I+1
IF @I<=5
GOTO LABEL
SELECT @T

函数

创建标量用户定义函数

CREAT FUNCTION[所有者名称.]函数名称
[({@参数名称[AS]标量数据类型=[默认值]}[…n])]
RETURNS 标量数据类型
[AS]
BEGIN
函数体
RETURN 标量表达式
END

创建内嵌表值函数

用内嵌表值函数实现:查询某个专业所有学生所选的每门课的平均成绩;调用该函数求出计算机系的所有课程的平均成绩。
create function dbo.practice2(@zy as char(10))
returns table
as
return(SELECT C.课程名,avg(成绩)平均成绩
FROM xs A INNER JOIN cj B ON A.学号=B.学号
INNER JOIN kc C ON B.课程号=C.课程号
where 专业=@zy
group by C.课程名
)
SELECT * FROM dbo.practice2(‘计算机’)

创建多语句表值函数

通过学号作为实参调用该函数,可显示该学生的姓名以及各门课的成绩和学分,调用该函数求出“200515002”的各门课成绩和学分。
create function dbo.practice3(@xh as char(10)
returns @xhkm table(
姓名 char(6),
课程名 char(10),
成绩 int,
学分 int)
as
begin
declare @ks table(
学号 char(10),
姓名 char(6)
)
insert @ks
select 学号,姓名 from xs where xs.学号=@xh
insert @xhkm
select 姓名,课程名,成绩,学分 FROM @ks B LEFT JOIN cj A
ON A.学号=B.学号 left join kc on kc.课程号=A.课程号
return
End
SELECT * FROM dbo.practice3(‘2006030103’)

触发器

USE xsgl
GO
CREATE TRIGGER check_trig
ON cj
FOR INSERT
AS
IF EXISTS(SELECT * FROM INSERTED a
WHERE a.学号 NOT IN (SELECT b.学号 FROM xs b)
OR a.课程号 NOT IN(SELECT c.课程号 FROM kc c))
BEGIN
RAISERROR(‘违背数据的一致性’,16,1)
ROLLBACK TRANSACTION
END
GO ————————————————————
删除触发器的SQL语法:
DROP TRIGGER <触发器名> ON <表名>;

游标

声明游标:


DECLARE <游标名> [INSENSITIVE] [SCROLL] CURSOR FOR
[LOCAL|GLOBAL]
[FORWARD_ONLY|SCROLL]
[STATIC|KEYSET|DYNAMIC|FAST_FORWARD]
[READ_ONLY|SCROLL_LOCKS|OPTIMISTIC]
[TYPE_VARNING]
FOR SELECT 语句
[FOR UPDATE[OF 列名[,…n]]]

参数说明:
INSENSITIVE:对基本表的修改并不影响游标提取的数据,即游标不会随着基本表内容的改变而改变,同时也无法通过游标来更新基本表。

SCROLL:表明所有的提取操作(如FIRST、 LAST、 PRIOR、 NEXT、 RELATIVE、 ABSOLUTE)都可用。如果不使用该保留字,那么只能进行NEXT 提取操作。

cursor_name:游标名称。
Local:作用域为局部,只在定义它的批处理,存储过程或触发器中有效。
Global:作用域为全局,由连接执行的任何存储过程或批处理中,都可以引用该游标。
[Local | Global]:默认为local。
Forward_Only:指定游标智能从第一行滚到最后一行。Fetch Next是唯一支持的提取选项。如果在指定Forward_Only是不指定Static、KeySet、Dynamic关键字,默认为Dynamic游标。如果Forward_Only和Scroll没有指定,Static、KeySet、Dynamic游标默认为Scroll,Fast_Forward默认为Forward_Only
Static:静态游标
KeySet:键集游标
Dynamic:动态游标,不支持Absolute提取选项
Fast_Forward:指定启用了性能优化的Forward_Only、Read_Only游标。如果指定啦Scroll或For_Update,就不能指定他啦。
Read_Only:不能通过游标对数据进行删改。
Scroll_Locks:将行读入游标是,锁定这些行,确保删除或更新一定会成功。如果指定啦Fast_Forward或Static,就不能指定他啦。
Optimistic:指定如果行自读入游标以来已得到更新,则通过游标进行的定位更新或定位删除不成功。当将行读入游标时,sqlserver不锁定行,它改用timestamp列值的比较结果来确定行读入游标后是否发生了修改,如果表不行timestamp列,它改用校验和值进行确定。如果已修改改行,则尝试进行的定位更新或删除将失败。如果指定啦Fast_Forward,则不能指定他。
Type_Warning:指定将游标从所请求的类型隐式转换为另一种类型时向客户端发送警告信息。
For Update[of column_name ,…] :定义游标中可更新的列。

获取数据

FETCH [NEXT|PRIOR|FIRST|LAST|ABSOLUTE{n|@nvar}|
RELATIVE{n|@nvar}]
FROM [GLOBAL]游标名称
[INTO@变量名[,…n]]

修改和删除数据

FETCH NEXT FROM xgzy
UPDATE xs1 SET 专业=‘网络工程’ WHERE CURRENT OF xgzy
DELETE FROM xs1 WHERE CURRENT OF scxf

存储过程

创建存储过程:
CREATE PROCEDURE 存储过程名
[WITH ENCRYPTION]
[WITH RECOMPILE]
AS
SQL 语句
[WITH ENCRYPTION]:对存储过程进行加密。
[WITH RECOMPILE]:对存储过程重新编译。
调用存储过程:
EXECUTE stu_cj



也可以有带输入参数的存储过程
CREATE PROCEDURE 存储过程名
@参数名 数据类型[=默认值] [,…n]
如果定义时@xx=某某,则调用不赋值的话就会默认


调用:EXECUTE stu_cj1 ‘王丹’,‘计算机基础’


如果我们需要从存储过程中返回一个或多个值,可以通过在创建存储过程的语句中定义输出参数来实现,为了使用输出参数,需要在创建存储过程的命令中使用OUTPUT关键字。
@name char(10),@total int OUTPUT
前者时传入,后者是输出

关系数据理论

规范化

函数依赖

平凡函数依赖

若对于R(U)的任意一个可能的关系r,r中不可能存在两个元组在X上的属性值相等, 而在Y上的属性值不等, 则称 “X函数确定Y” 或 “Y函数依赖于X”,记作X→Y。

如果X→Y,但Y  X,则称X→Y是非平凡的函数依赖
若X→Y,但Y  X, 则称X→Y是平凡的函数依赖
例:在关系SC(Sno, Cno, Grade)中,
非平凡函数依赖: (Sno, Cno) → Grade
平凡函数依赖: (Sno, Cno) → Sno
(Sno, Cno) → Cno

完全函数依赖

如果X→Y,并且对于X的任何一个真子集X’,都有X’ Y, 则称Y对X完全函数依赖,记作: X F Y。
若X→Y,但Y不完全函数依赖于X,则称Y对X部分函数依赖,记作:X P Y。

传递函数依赖

在关系Std(Sno, Sdept, Mname)中,有:
Sno → Sdept,Sdept → Mname
Mname传递函数依赖于Sno

设K为R<U,F>中的属性或属性组合。若K U, 则K称为R的侯选码(Candidate Key)。也就是K能够推出全部的属性。
若候选码多于一个,则选定其中的一个做为主码

主属性

主属性与非主属性
包含在任何一个候选码中的属性 ,称为主属性(Prime attribute)
不包含在任何码中的属性称为非主属性(Nonprime attribute)或非码属性(Non-key attribute)

全码

整个属性组是码,称为全码

外码

关系模式 R 中属性或属性组X 并非 R的码,但 X 是另一个关系模式的码,则称 X 是R 的外部码

范式

1NF

如果一个关系模式R的所有属性都是不可分的基本数据项,则R∈1NF

2NF

若R∈1NF,且每一个非主属性完全函数依赖于码,则R∈2NF。
采用投影分解法将一个1NF的关系分解为多个2NF的关系,可以在一定程度上减轻原1NF关系中存在的插入异常、删除异常、数据冗余度大、修改复杂等问题。

3NF

若R∈3NF,则每一个非主属性既不部分依赖于码也不传递依赖于码。
例:2NF关系模式S-L(Sno, Sdept, Sloc)中
传递函数依赖:
Sno→Sdept
Sdept → Sno(不成立)
Sdept→Sloc
解决方法
采用投影分解法,把S-L分解为两个关系模式,以消除传递函数依赖:
S-D(Sno, Sdept)
D-L(Sdept,Sloc)
S-D的码为Sno, D-L的码为Sdept。

BC范式

每一个决定属性因素都包含码
所有非主属性对每一个码都是完全函数依赖
所有的主属性对每一个不包含它的码,也是完全函数依赖
没有任何属性完全函数依赖于非码的任何一组属性

4NF

如果R ∈ 4NF, 则R ∈ BCNF
不允许有非平凡且非函数依赖的多值依赖
允许的非平凡多值依赖是函数依赖

小结

在这里插入图片描述

数据依赖的公理系统

关系模式R <U,F >来说有以下的推理规则:

A1.自反律(Reflexivity):若Y  X  U,则X →Y为F所蕴含。
A2.增广律(Augmentation):若X→Y为F所蕴含,且Z  U,则XZ→YZ为F所蕴含。
A3.传递律(Transitivity):若X→Y及Y→Z为F所蕴含,则X→Z为F所蕴含。

拓展规则

合并规则:由X→Y,X→Z,有X→YZ。
(A2, A3)
伪传递规则:由X→Y,WY→Z,有XW→Z。
(A2, A3)
分解规则:由X→Y及 ZY,有X→Z。
(A1, A3)

函数的闭包

在关系模式R<U,F>中为F所逻辑蕴含的函数依赖的全体叫作 F的闭包,记为F+。
在这里插入图片描述

函数闭包的求法

最小依赖集

(1) F中任一函数依赖的右部仅含有一个属性。
(2) F中不存在这样的函数依赖X→A,使得F与F-{X→A}等价。
(3) F中不存在这样的函数依赖X→A, X有真子集Z使得F-{X→A}∪{Z→A}与F等价。
也就是说:去掉一个函数依赖没有办法保证原函数依赖的完整。在这里插入图片描述
没了Sno->Mname我们依然可以用Sno->Sdept与Sdept->Mname依靠传递性得到。所以可以丢弃,这也是极小化的过程。
F的最小依赖集Fm不唯一
极小化过程( 定理6.3的证明 )也是检验F是否为极小依赖集的一个算法

模式的分解

关系模式分解的标准

⒈ 分解具有无损连接性
⒉ 分解要保持函数依赖
⒊ 分解既要保持函数依赖,又要具有无损连接性

分解具有无损连接性和分解保持函数依赖是两个互相独立的标准。具有无损连接性的分解不一定能够保持函数依赖;同样,保持函数依赖的分解也不一定具有无损连接性。

达到3NF保持函数依赖的分解算法

设关系模式R<U,F>
1.将F化为最小函数依赖集,令F=Fmin
2.把在F中不出现的属性从U中去掉,单独构成一个关系模式,剩余属性集合仍然为U。
3.若有X->A属于F,且XA=U,则R即为所求。
4.否则,对照F中的函数依赖集,将所有函数依赖左端相同的划为一组,相应的右端以及函数依赖均归入该组。
5.这些分组就是分解后的模式组成。
6.这种分解方法得到的就是达到3NF且保持函数依赖的分解。

达到3NF既有无损连接性又保持函数依赖的分解算法

设关系模式R<U,F>
1.先按上述方法1将R分解为R1,R2,……Rn。
2.选取R的码,将码与函数依赖(如果有)相关的属性组成一个关系Rn+1
3.如果Rn+1就是R1,R2,……Rn中的一个,就将它们合并,否则加入到分解系列中。
4.这个分解系列就是既有无损连接性又保持函数依赖的分解。
例如,上述例题,R3就是包含码CE的模式,所以分解既具有无损连接性又保持函数依赖

候选码的求解:

所谓候选码即能决定整个关系的,我们通过找未出现在依赖右边的和两侧均未出现的元素即可求得,

转换为BCNF的无损连接分解算法

第一部当然是求最小依赖集
在这里插入图片描述

并发处理

事务并发执行带来的问题

会产生多个事务同时存取同一数据的情况 。可能会存取和存储不正确的数据,破坏事务一致性和数据库的一致性
丢失修改(Lost Update)
不可重复读(Non-repeatable Read)
读“脏”数据(Dirty Read)

并发控制的主要技术

有封锁(Locking)
时间戳(Timestamp)
乐观控制法

基本封锁类型

排它锁(Exclusive Locks,简记为X锁)

若事务T对数据对象A加上X锁,则只允许T读取和修改A,其它任何事务都不能再对A加任何类型的锁,直到T释放A上的锁
保证其他事务在T释放A上的锁之前不能再读取和修改A

共享锁(Share Locks,简记为S锁)

若事务T对数据对象A加上S锁,则其它事务只能再对A加S锁,而不能加X锁,直到T释放A上的S锁
保证其他事务可以读A,但在T释放A上的S锁之前不能对A做任何修改
在这里插入图片描述

活锁

事务T1封锁了数据R
事务T2又请求封锁R,于是T2等待。
T3也请求封锁R,当T1释放了R上的封锁之后系统首先批准了T3的请求,T2仍然等待。
T4又请求封锁R,当T3释放了R上的封锁之后系统又批准了T4的请求……

死锁

事务T1封锁了数据R1
T2封锁了数据R2
T1又请求封锁R2,因T2已封锁了R2,于是T1等待T2释放R2上的锁
接着T2又申请封锁R1,因T1已封锁了R1,T2也只能等待T1释放R1上的锁
这样T1在等待T2,而T2又在等待T1,T1和T2两个事务永远不能结束,形成死锁

预防死锁的方法
一次封锁法
顺序封锁法

死锁的诊断
超时法
事务等待图法

可串行化的调度

可串行化(Serializable)调度
多个事务的并发执行是正确的,当且仅当其结果与按某一次序串行地执行这些事务时的结果相同
可串行性(Serializability)
是并发事务正确调度的准则
一个给定的并发调度,当且仅当它是可串行化的,才认为是正确调度

冲突操作

冲突操作是指不同的事务对同一个数据的读写操作和写写操作
Ri (x)与Wj(x) /* 事务Ti读x,Tj写x*/
Wi(x)与Wj(x) /* 事务Ti写x,Tj写x*/
其他操作是不冲突操作
不同事务的冲突操作和同一事务的两个操作不能交换

判断是否冲突可串行化

在这里插入图片描述

两段锁协议

事务Ti遵守两段锁协议,其封锁序列是 :
Slock A Slock B Xlock C Unlock B Unlock A Unlock C;
|← 扩展阶段 →| |← 收缩阶段 →|
事务Tj不遵守两段锁协议,其封锁序列是:
Slock A Unlock A Slock B Xlock C Unlock C Unlock B;

封锁粒度

封锁对象的大小称为封锁粒度
在这里插入图片描述
在多粒度封锁中一个数据对象可能以两种方式封锁:
显式封锁: 直接加到数据对象上的封锁
隐式封锁: 该数据对象没有独立加锁,是由于其上级结点加锁而使该数据对象加上了锁
显式封锁和隐式封锁的效果是一样的

引进意向锁(intention lock)

目的:
提高对某个数据对象加锁时系统的检查效率
如果对一个结点加意向锁,则说明该结点的下层结点正在被加锁
对任一结点加基本锁,必须先对它的上层结点加意向锁
例如,对任一元组加锁时,必须先对它所在的数据库和关系加意向锁
种类:
意向共享锁(Intent Share Lock,简称IS锁)
意向排它锁(Intent Exclusive Lock,简称IX锁)
共享意向排它锁(Share Intent Exclusive Lock,简称SIX锁)
对某个表加SIX锁,则表示该事务要读整个表(所以要对该表加S锁),同时会更新个别元组(所以要对该表加IX锁)。

总结

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值