第一章绪论
1.数据库系统概述
1.数据库四个基本概念
-
数据
定义:描述事物的符号记录
特点:数据与其语义是不可分的
结构:记录是计算机存储数据的一种格式或一种方法。
-
数据库
定义:是长期存储在计算机内、有组织的、可共享的大量数据的集合
基本特征:数据按一定的数据模型组织、描述和储存
可为各种用户共享、冗余度较小、易扩展
数据独立性较高
-
数据库管理系统
用途:科学地组织和存储数据、高效地获取和维护数据
功能:数据定义功能
数据组织、存储和管理
数据操纵功能
数据库的事务管理和运行管理
数据库的建立和维护功能
-
数据库系统
2.数据管理技术的产生和发展
-
数据管理技术的发展过程:(共享程度;独立性;结构化;控制能力)
人工管理阶段:无共享,冗余度极大;
不独立,完全依赖于程序;
无结构;
应用程序自己控制
文件系统阶段:共享性差,冗余度大;
独立性差;
记录内有结构,整体无结构;
应用程序自己控制
数据库系统阶段:共享性高,冗余度小;
具有高度的物理独立性和一定的逻辑独立性;
整体结构化,用数据模型描述;
由DBMS提供数据安全性、完整性、并发控制和恢复能力
2.数据模型
1.两类数据模型
- 概念模型,也称信息模型
- 逻辑模型和物理模型
2.概念模型
1.E-R图
-
概念
实体型 (矩形)
属性 (椭圆形)
联系 (菱形)
-
关系
实体集和属性之间的关系
联系和属性之间的关系
实体集和联系之间的关系
3.数据模型组成要素
数据结构、数据操作和完整性约束
4.层次模型
树形结构来表示各类实体以及实体间的联系
特点:
-
结点的双亲是唯一的
-
只能直接处理一对多的实体联系
-
每个记录类型可以定义一个排序字段,也称为码字段。
-
任何记录值只有按其路径查看时,才能显出它的全部意义。
-
没有一个子女记录值能够脱离双亲记录值而独立存在。
数据操作:查询、插入、删除、更新
5.网状模型
网状数据库系统采用网状结构来表示各类实体以及实体间的联系。
特点:
- 允许多个结点没有双亲结点
- 允许一个结点有多个双亲结点
- 允许两个结点之间有多种联系
- 要为每个联系命名,并指出与该联系有关的双亲记录和子女记录
3.数据库系统的结构
数据库系统的三级模式结构:模式、外模式、内模式
-
模式:
-
数据库中全体数据的逻辑结构和特征的描述
-
模式的地位:是数据库系统模式结构的中间层
-
-
外模式
-
数据库用户使用的局部数据的逻辑结构和特征的描述
数据库用户的数据视图,是与某一应用有关的数据的逻辑表示
-
外模式的用途:
保证数据库安全性的一个有力措施
每个用户只能看见和访问所对应的外模式中的数据
外模式描述的是数据的局部逻辑结构
-
-
内模式
-
是数据物理结构和存储方式的描述
是数据在数据库内部的表示方式 -
用途
记录的存储方式(顺序存储,按照B树结构存储,按hash方法存储)
索引的组织方式
数据是否压缩存储
数据是否加密
数据存储记录结构的规定
-
4.小结
-
数据库系统概述
数据库的基本概念
数据管理的发展过程
数据库系统的特点
-
数据模型
数据模型的三要素
三种主要数据库模型
数据库系统内部的系统结构
-
数据库系统内部的系统结构
数据库系统三级模式结构
数据库系统两层映像系统结构
-
数据库系统的组成
第二章 关系数据库
1.关系数据结构及形式化定义
1.关系
-
单一的数据结构——关系
-
逻辑结构——二维表
-
域:域是一组具有相同数据类型的值的集合
-
笛卡尔积:笛卡尔积是域上面的一种集合运算。笛卡尔积可表示为一个二维表,表中每行对应一个元组,表中每一列的值来自一个域
-
关系
候选码:关系中的某一属性组的值能唯一地标识一个元组
主码:一个关系有多个候选码,则选定其中一个为主码
全码:若所有的属性组是候选码,那么称之为全码
主属性:候选码的属性称为主属性,不包含在任何候选码的属性叫做非主属性或非码属性
2.关系模式
关系模式是型(静态),关系是值(动态)
关系模式是对关系的描述:
- 元组集合的结构
- 完整性约束条件
关系模式形式化表示:R(U,D,DOM,F)
3.关系数据库
-
关系数据库:在一个给定的应用领域中,所有关系的集合构成一
个关系数据库
-
关系数据库的型: 关系数据库模式,是对关系数据
库的描述
-
关系数据库的值**😗* 关系模式在某一时刻对应的关系
的集合,通常称为关系数据库
4.关系模型的存储结构
2.关系操作
-
常用的关系操作:
查询操作:选择,投影,连接,除,并,差,交,笛卡尔积
数据更新:插入,删除,修改
-
关系操作的特点:
操作的对象和结果都是集合,一次一集合的方式
3.关系的完整性
-
实体完整性:
若属性A是基本关系R的主属性,则属性A不能取空值
-
参照完整性
若属性F是基本关系R的外码它与基本关系S的主码Ks相对应(基本关系R和S不一定是不同的关系),则对于R中每个元组在F上的值必须为:或者取空值(F的每个属性值均为空值)或者等于S中某个元组的主码值
4.关系代数
1.传统的集合运算
并、差、交、笛卡儿积、
2.专门的关系运算
象集:行
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0SwhTggI-1653455468294)(C:\Users\86151\AppData\Roaming\Typora\typora-user-images\image-20220320115241290.png)]
1.选择:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZQYrIILX-1653455468295)(C:\Users\86151\AppData\Roaming\Typora\typora-user-images\image-20220320112726704.png)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KtECsA2l-1653455468296)(C:\Users\86151\AppData\Roaming\Typora\typora-user-images\image-20220320112857181.png)]
F:选择条件,逻辑表达式
R:关系R,全局
2.投影(列):[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3PuflzMg-1653455468298)(C:\Users\86151\AppData\Roaming\Typora\typora-user-images\image-20220320113107803.png)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KpaUxGOq-1653455468302)(C:\Users\86151\AppData\Roaming\Typora\typora-user-images\image-20220320113245679.png)]
A:R中的属性列
3.连接:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tLIRN7LZ-1653455468303)(C:\Users\86151\AppData\Roaming\Typora\typora-user-images\image-20220320113845157.png)]
其实就是根据 某个值将两个表连接在一起
悬浮元组:两个表中没有公共属性未被连接的元组称为悬浮元组
外连接:把悬浮原则也保存在结果关系中,将没有的属性值填(Null)
左(右)外连接:只保留左(右)边关系R中的悬浮元组
4.除运算:R➗S
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pDLBeAf7-1653455468304)(C:\Users\86151\AppData\Roaming\Typora\typora-user-images\image-20220320115041102.png)]
第三章SQL语言
1.数据定义
1.基本表定义、删除、修改
- 定义基本表:create table<表名>
- 查询基本表:select * from<表名>
- 修改基本表:alter table<表名>
- 删除基本表:drop table<表名>
2.索引的建立与删除
- 建立索引:create unique index <索引名> on <表名>(<列名>[<次序>])
- 删除索引:drop index<表名字>.<索引名>
2.数据查询
1.单表查询
-
选择表中若干列:
select语句中的目标列不仅可以为表中的属性列,也可以是表达式
-
选择表中的若干元组:
-
比较大小:<,>,=,!=等
-
确定范围:between and
-
确定集合:in
-
字符匹配:like、通配符(%–表示任意长度字符串 、 _—表示单个字符)、转义(\)
-
空值查询:is null
-
多重条件查询:and、or
-
-
ORDER BY子句:
升序(空值最后显示):asc;降序(空值最先显示):desc;
-
聚集函数:
- 统计元组个数:count(*)
- 统计一列中值的个数:count(distinct |all <列名>)
- 平均值:avg(<列名>)
- 最大小值:max(<列名>)、min(<列名>)
-
GROUPBY子句:
使用group by子句后,select子句的列名列表中只能出现分组属性和集函数。
where子句中不能用聚集函数作为条件表达式,要用having
having和where区别:
where作用于基本表或试图、having作用于组
例:
-
求各个课程号及相应的选课人数
select cno,count(sno) from sc group by cno
-
查询选修2门以上课程的学生学号
select sno from sc group by sno having count(cno)>2
-
查询平均成绩大于等于80分的学生学号和平均成绩
select sno avg(grade) from sc group by sno having avg(grade)>80
-
2.连接查询
-
等值与非等值连接查询
等值连接:连接运算符为=
select student.*,sc.* from student,sc where student.sno=sc.sno
-
自身连接
需要给表起别名以示区别
由于重名,需要别名前缀
select c1.cno,c2.cpno from course c1,course c2 where c1.cpno=c2.cno
-
外连接
左外连接:left outer join<表名>on
select student.sno,sname,ssex,sage,sdept,cno,grade from student left outer join sc on (student.sno=sc.sno)
-
多表连接
两个以上的表进行连接
select student.sno,sname,cname,grade from student,sc,course where student.sno=sc.sno and sc.sno=course.cno
3.嵌套查询
-
带有谓词in的子查询
select * from student where sdept in (select sdept from student where sname='刘晨')
-
带有比较运算符的子查询
select sno,cno from sc x where grade >= (select avg(grade) from sc y where y.sno=x.sno)
-
带有any(some)或all谓词的子查询
select sname,sage from student where sage<any (select sage from student where sdept='cs')and sdept!='cs'
-
带有exists谓词的子查询
4.集合查询
-
union:将多个查询结果合并起来,系统自动去掉重复元组
select sno from sc where cno='1' union select sno from sc where cno ='2'
-
union all:将多个查询结果合并起来,保留重复元组
3.数据更新
1.插入数据
-
插入元组
insert into<表名>[(<属性列>) ]values(<常量1>)
指定属性列:与指定属性列一致,
insert into student (sno,sname,ssex,sdept,sage) values('201215128','陈东','男','IS',18)
不指定属性列:与表顺序一致,
insert into student values('201215128','陈东','男',18,'IS')
空值情况:空值
select * from sc insert into sc values('201215128','1',null)
-
插入子查询结果
2.修改数据
update<表名> set<列名>=<表达式> where<条件>
-
修改某一个元组的值
update student set sage=22 where sno='201215128'
-
修改多个元组的值
update student set sage=sage+1
-
带有子查询
select * from sc update sc set grade='0' where sno in (select sno from student where sdept='cs')
3. 删除数据
delete from <表名> where <条件>
-
删除某一个元组的值
delete from student where sno='201215128'
-
删除多个元组的值
delete from student where sno='201215128'
-
删除带有子查询
delete from sc where sno in (select sno from student where sdept='cs')
4.空值的处理
1. 空值的产生
写了的属性:null,没写的:默认mull
不知道,不存在的值
5.视图
1.建立视图
create view<视图名> as<子查询>
-
基于单表
/*建立信息系学生的视图*/ create view stu as select * from student where sdept='is'
-
基于多表
/*基于多个基表的视图*/ create view is_stu_c1(sno,sname,grade) as select student.sno,sname,grade from student,sc where sdept='is'and student.sno=sc.sno and sc.cno='1'
-
基于视图的视图
/*建立信息系选修了1号课程且成绩在90分以上的学生的视图*/ create view is_cl_grade as select sno,sname,grade from is_stu_c1 where grade>=90
-
带表达式的视图
/*定义一个反应学生出生年份的视图*/ create view stu_birth(sno,sname,sbirth) as select sno,sname,2022-sage from student
-
分组视图
/*将学生的学号和平均成绩定义为一个视图*/ create view stu_avgGrade(sno,avg_grade) as select sno,avg(grade) from sc group by sno
2.删除视图
drop view <视图名>
3.查询视图
select
4.更新视图
与数据更新基本一致,但是一些视图是不能更新的
第四章数据库完整性
数据的正确性、数据的相容性
1.实体完整性
1. 实体完整性定义
-
create table中用primary key定义
-
注意,单/多属性构成的码的说明方法
(单)列级约束条件
(单)表级约束条件(多,只能用表约束)
2.实体完整性检查和违约处理
- 检查主码值是否唯一
- 检查主码的各个属性是否为空
2.参照完整性
1.参照完整性定义
- create table中用foreign key定义
2.参照完整性检查和违约处理
3.用户定义的完整性
4.完整性约束命令字句
第五章SQL Server编程结构
-
变量
-
局部变量:
格式:declare @变量名 变量类型[, …n ]
DECLARE @myc1 INT
赋值:select @局部变量=变量值
set @局部变量=变量值
SET @myc1=“abc” SELECT @myc1=123
-
全局变量:以@@开头
-
begin–end语句块:允许嵌套使用,begin end成对出现
格式:begin
< SQL语句| SQL语句块>
end
-
if — else条件语句
格式:if<条件>
< SQL语句| SQL语句块>
[else
< SQL语句| SQL语句块>]、
-
case语句
格式:case <运算式>
when <运算式> then<运算式>
when <运算式> then<运算式>
[else<运算式> ]
end
USE student-course GO UPDATE sc SET Grade= CASE WHEN cno=‘001’ THEN grade*1.1 WHEN cno=‘002’ THEN grade*1.05 WHEN cno=‘003’ THEN grade*1.1 END GO
-
循环语句
格式:while <条件>
< SQL语句| SQL语句块>
[break]
[continue]
-
转移语句
格式:GOTO <标号>
--例:求解5! DECLARE @s INT, @t INT SET @s=1 SET @t=1 REPEAT: SET @s=@s*@t SET @t=@t+1 IF @t<=5 GOTO REPEAT PRINT ‘5的阶乘=’+STR(@s)
-
输出语句
SELECT <表达式|变量>
PRINT <表达式|变量>
-
第六章 存储过程
1.创建和执行存储过程:
create procedure 存储过程名
[ {@参数1 数据类型} [= 默认值] [OUTPUT],
…… ,
{@参数n 数据类型} [= 默认值] [OUTPUT]
]
as
sql语句
1.无参数
/*创建*/
create procedure p1
as
select * from sc where grade>=90
/*执行*/
exec p1
2.带参数
/*创建*/
create procedure p2(@cj int)
as
select * from sc where grade>=@cj
/*执行*/
exec p2 90
3.默认值
/*创建*/
create procedure p3(@cj int=90)
as
select * from sc where grade>=@cj
/*执行默认*/
exec p3
/*执行输入*/
exec p3 80
4.通配符
/*创建*/
create procedure p4(@name char(10)='%李勇')
as
select * from student where sname like @name
/*执行默认*/
exec p4
/*执行输入*/
exec p4 's%'
2.修改存储过程
alter procedure 存储过程名
[ {@参数1 数据类型} [= 默认值] [OUTPUT],
…… ,
{@参数n 数据类型} [= 默认值] [OUTPUT] ]
as
SQL语句
alter procedure select_students
as select * from student
where sdept ='sc'
3.删除存储过程
drop procedure select_students
4.触发器
不允许使用参数,没有返回值。
不允许用户调用,当对表进行插入、删除、修改操作时由系统自动调用并执行(相当于事件方法)。
1. 创建触发器
create trigger 触发器名
on { 表名|视图名 }
{for|after|instead of}[insert,update,delete]
as
SQL语句系列
注意:
1. CREATE TRIGGER语句必须是一个批处理的第一条语句。
2. 创建触发器的权限默认属于表的所有者,且不能授权给其他人。
3. 触发器不能在临时表或系统表上创建,后触发也不能创建在视图上。
4. 一个触发器只能创建在一个表上;
5. 一个表可以有一个替代触发器和多个后触发器(可以是同一种操作类型,可同时触发)。
/*创建一个表table1,其中只有一列a。在表上创建一个触发器,每次插入操作时,将变量@str的值设为“TRIGGER IS WORKING”并显示。
*/
create table table1(a int)
go
/*创建触发器*/
create trigger table_insert
on table1
after insert
as
begin
declare @str char(50)
set @str = 'TRIGGER IS WORKING'
print @str
end
go
/*验证*/
insert into table1
value(11)
2. 查看触发器的定义和相关性
1、查看触发器基本信息
语法格式:sp_help 触发器名
2、查看触发器定义
语法格式:sp_helptext 触发器名
3、查看触发器的依赖关系(相关性
语法格式:sp_depends 触发器名
3.触发器的修改和删除
-
修改触发器
alter tigger 触发器名
on 表名
for { [delete],[ update] ,[ insert] }
[not for replication]
as
SQL语句
-
重命名触发器
sp_rename 原触发器名,新触发器名
-
删除触发器
drop trigger 触发器名