数据库的基础学习笔记,跟着哈工大的老师视频学习。从关系代数到SQL语言,以及一些进阶数据库操作的简单学习。
关系模型
关系运算
关系代数
基于集合的运算
基于关系代数的数据库语言
关系演算
元组演算
基于逻辑的运算
域演算
基于示例的运算
关系
列的取值范围就是域,域有相同的数据类型
笛卡儿积(每一个元素成为n-元组):多个域的排列组合
笛卡儿积中具有某个意义的元组称为关系
域名和属性名不一样,为每一列起的名字叫属性名,不同列可能来自同一个域。
外码连接两个或者多个关系。
关系代数
是一种抽象的语言
前提:满足并相容性,才能进行运算
基本操作:
并,差,笛卡儿积,选择(选择行操作),投影(选择列进行操作)
扩展操作
交,theta-Join(直接使用连接操作比笛卡儿积加一个选择操作快,DBMS可以进行直接操作),等值连接,特殊连接,自然连接
关系代数操作的组合和应用训练
- 要特别注意语义
关系代数的复杂扩展操作
- 除运算(包含了全部的,所有的)
- 外链接:左外连接(不丢失左侧元组数据),右外连接,全外连接
集合操作的特性
关系代数与sql语言的对应关系
Select From Where
sql查询语句就是关于代数的组合
数据库管理系统就是解析这样的组合,拆解开,按照一定的次序分解开,调用基本的操作算法来予以实现。
关系演算
元组演算(有难度的位置):一种逻辑表达,以元祖为基本单位循环遍历。与关系代数可以相互转换。
- 存在量词 对r中的每一个t进行F(t)检验
- 全称量词
关系域演算:过程性非常差,适合用户使用来表达查询条件
QBE域演算语言
通过填表的方式,高度非过程化的查询语言。
安全性
关系运算不一定是安全的。不产生无穷关系和无穷验证的运算被称为是安全的。
关系运算总结
关系运算有三种:关系代数,关系元组演算,关系域演算,都是抽象的数学关系,体现了三种不同的思维。关系代数是基于集合的操作思维,后两者是基于逻辑的思维。关系代数是安全的。三种关系运算都可以说是非过程性的。
ISBL语言:基于关系代数的数据库语言。
QUEL语言
数据库语言SQL
- DDL 定义数据库
- DML操纵数据库
Structured Query Language(SQL)
建立数据库:定义数据库和表,添加元组。
Create datebase xxx
Create table Students(Snumber char(8) not null, Sname char(10), Ssex char(2));
利用数据库进行简单的查询
Select ... From ... Where...
结果唯一性问题 DISTINCT
结果排序问题order by 列名 【asc/desc】
模糊查询
Select Sname From Student Where Sname Like '张__';
- % : 零个或者多个字符
- _ : 单个字符
- \: 转义字符
多表联合查询
表示笛卡儿积操作。
Select S1.Snumber From SC S1, SC S2 Where S1.Snumber = S2.Snumber and ...
SQL的更新操作
- 增 INSERT
Insert Into Teacher Values ("005","张三");
Insert Into St(S#, Sname) Select S#, Sname From Student Order By Sname;
批元组新增
- 删 DELETE
Delete From Student Where S# ='100';
Update Teacher Set Salary = Salary * 1.05 Where D# in (...)
- 修正与撤销
Alter Table Student Add Saddr char[40],PID char[18];
Alter Table Student Modify Sname char(10);
Alter Table Student Drop Unique(Sname);
Drop Table Student;
撤销学生表Student;delete语句知识删除表中的元组,而drop table 的操作撤销包含表格式,表中所有元组,由该白哦导出的视图等所有相关内容。
- 指定与关闭命令
- Use Student
- Close Student
- 增 INSERT
DBMS交换环境简介
利用SQL语言表达复杂查询
子查询
IN 和 NOT IN
列出选修了001号课程的学生的学号和姓名
Select S#, Sname From Student Where S# in (Select S# From SC Where C# = '001');
既学过001号课程又学过002号课程的学生的学号
Select S# From SC Where C# = '001' and S# in(Select S# From SC Where C# = '002');
非相关子查询和相关子查询
theta some / theta all类似于全称量词和存在量词
找出工资最低的教师姓名
Select Tname From Teacher Where Salary <= all(Select Salary From Teacher);
找出001号课程成绩不是最高的所有学生的学号
Select S# From SC Where C# = '001' and Score < some(Select Score From SC Where C# = '001');
等价性变换需要注意
- some 等价于in
- not in 等价于 <>all
EXIST
not Exists可以实现很多新功能
检索学过001号教师主讲的所有课程的所有同学的姓名
Select Sname From Student Where not exists (Select * From Course Where Course.T#='001' and not exists(Select * From SC Where S# = Student.S# and C# = Course.C#));
不存在/ 有一门001号老师讲的课程/ 该同学没学过
列出没学过李明老师讲授的任何一门课程的所有同学的姓名
Select Sname From Student Where not exists(Select * From SC, Course, Teacher Where Tname = 'liming' and Course .T# = Teacher.T# and Course.C# = SC.C# and Student.S# = SC.S#)
不存在/ 学过一门课程
从肯定过度到否定之否定列出至少学过9803号同学学过的所有课程的同学的学号
Select DISTINC S# From SC SC1 Where not exists (Select * From SC SC2 Where S# = '9803' and not exists (Select * From SC Where C# = SC2.C# and S# = SC1.S#))
不存在// 9803的some一门课程 //该同学 没学过
利用SQL语言进行计算
聚集函数 count sum avg max min
求有差额的任意两位教师的薪水差额
1
2
3
4
5
6
7Select T1.Tname as TR1, T2.Tname as TR2,T1.Salary-T2.Salary From Teacher T1, Teacher T2 Where T1.Salary >T2.Salary;
Select S.S#, S.Sname, 2015-S.Sage+1 as Syear From Student S;
Select Sum(Salary) From Teacher;
Select AVG(Score) From Course C, SC Where C.Cname='数据库' and C.C# = SC.C#;分组聚集计算与分组过滤计算
1
2
3
4
5
6
7
8#求每一个学生的平均成绩
Select S#, AVG(Score) From SC Group by S#;
#求每一门的平均成绩
Select C#, AVG(Score) From SC Group by C#;
#求不及格课程超过两门的同学的学号
Select S# From SC Where Score<60 Group by S# Having Count(*)>2;
#求有两门以上不及格课程同学的学号及其平均成绩
Select S#,AVG(Score) From SC Where S# in(Select S# From SC Where Score<60 Group by S# Having Count(*)>2) Group by S#;实现并交差
UNION/ /INTERSECT/ /EXCEPT
1
2
3Select S# From SC Where C#='002'
INTERSECT
Select S# From SC Where C# = '003';空值
Select Sname From Student Where Sage is null;
内连接,外连接
- 求所有教师的任课情况并按教师号排序
Select Teacher.T#, Tname ,Cname From Teacher Inner Join Course On Teacher.T#=Course.T# Order by Teacher.T# ASC;
SQL视图
数据库完整性
完整性约束条件(OPAR)
- O: 约束的对象
- P:谓词条件,什么样的约束
- A:触发条件
- R:响应动作,不满足时怎么办
约束分类
- 静态约束,通过Create语句来完成, 在任一时候均满足的约束
域完整性约束:施加在某一列
举例
1
Create Table Student(S# char(8) not null unique, Sname char(10), Ssex char(2) constraint ctssex check(Ssex='男' or Ssex ='女'), Sage integer check(Sage>=1 and Sage<150),D# char(2) references Dept(D#) on delete cascade, Sclass char(6));
check()加约束条件,同where的使用
on delete cascade,外键,删除关联(查询)
1
Create Table SC(S# char(8) check(S# in (select S# from Student)), C# char(3) check(C# in (select C# from course)), Score float(1) constraint ctscore check (Score >= 0.0 and Score <= 100.0)
关系完整性约束:施加在关系/表上
断言,会影响数据库的效率增加数据库的负担,慎用
Create assertion xxx check (条件)
- 动态约束 :从一状态到另一状态时应满足的约束
触发器, Trigger
1
2
3
4
5create trigger delS# after delete on Student referencing old oldi
for each row
begin
delete sc where S# = :oldi.S#
end;
数据库安全性
SOTP
- 自主安全性的实现方式
- 存储矩阵
- 视图
- SQL语言授权和收回授权
Grant Select On Employee To UserB WITH GRANT OPTION
- 授权过程,注意授权的传播范围(深度,广度)。
- 强制安全性
嵌入式SQL
高级语言与SQL语言结合
变量声明与数据库连接
- exec sql connect to default;
- exec sql disconnect current;
- exec sql commit release;(Oracle)
- exec sql rollback release;(Oracle)
事务:具有ACID特性的若干数据库基本操作的组合体
ACID:原子性,一致性,隔离性,持久性
事物处理是DBMS的核心技术
declare section; SQL错误捕获语句;SQL connect;SQL commit work;SQL rollback and disconnect;
数据集和游标
检索多行结果用到游标,游标定义一次,多次打开,多次执行,多次关闭。
1
2
3
4
5
6
7
8
9
10
11
12exec sql declare cur_student cursor for
select Sno, Sname from Student where Scalss = :vclass
order by Sno
for read only;
exec sql open cur_student;
...
exec sql fetch cur_student into :vSno, :vSname;
...
exec sql close cur_student;
#开关游标
exec sql open cursor_name;
exec sql close cursor_name;可滚动游标:可使指针在数据集之间灵活移动。
数据库的更新与删除:分两种,查找更新与定位更新;查找删除和定位删除
1
2
3
4
5
6
7exec sql declare stud cursor for
select* from student s where s.sclass='000' for update of sclass;
exec sql open stud
While(TRUE){
exec sql fetch stud into :vSno, :vSname;
exec sql update student set sclass='002' where current of stud;
}
异常状态捕获及错误处理机制
状态是嵌入式SQL语句的执行状态,尤其指一些出错状态。状态捕获和处理包括三部分:
- 设置sql通信区:
exec sql include sqlca;
- 设置状态捕获语句:
exec sql whenever sqlerror goto report_error;
- 状态处理语句:
report_error:exec sql rollback;
状态捕获语句可能出现无限循环
handle_error: exec sql whenever sqlerror continue;
错误捕获语句的作用域
- 设置sql通信区:
动态SQL
静态SQL:冒号传递,游标读取。
动态SQL,构造sql的字符串,然后交给DBMS执行。
动态sql语句的执行方式
立即执行(text语句一定是完整的)
延迟执行
数据字典与SQLDA:系统目录,类似于查找索引的东西
ODBC
是一种标准,open database connection
索引
索引文件:索引字段和行指针
创建一个索引: create index idxName on student(sname)
撤销索引:drop index idxName
是否建立:考虑插入时间删除时间访问时间与空间负载的问题。既要改善性能又要控制代价。
稠密索引和稀疏索引
稀疏索引(要求排序存储),稠密索引(候选键属性和非候选键属性)
主索引和辅助索引
主索引通常是聚簇索引(以磁盘块为索引项。
倒排索引
以关键词指向的文档, key {doc1, doc2, doc3…}
多级索引:B+树
查询优化
在连接和乘积运算之前尽早做选择运算
语义优化
语法优化:逻辑查询优化(关系代数操作次序),10个等价性交换定理。
执行优化:物理执行优化–代价估算(准确性有待商量)–算法选择和装配次序
在DML编译器执行
事务处理
并发控制
因为数据共享会有不一致发生
三种典型的不一致现象:丢失修改,不能重复读,脏读
类似于操作系统进程控制
事务: 数据库管理系统提供的控制数据操作的一种手段, ACID
封锁协议要考虑:封锁的类型,封锁的粒度(基本在元组),相容性矩阵(一个事务上锁后其他事务的权限),封锁的时机(分为四个)
故障:故障恢复包括原子性和持久性
故障恢复程序占百分之十。是核心技术。
事务故障: 重做事务Redo和撤销事务Undo
系统故障:掉电,非正常关机。会影响到数据库缓存区。通过运行日志的手段。运行日志定期设置和更新检查点(为了判断从哪一点开始恢复)。
介质故障:磁盘坏了,用副本。确定备份时刻,转储点,运行日志至少要包括在转储点之前。