Fork me on GitHub

数据库基础

数据库的基础学习笔记,跟着哈工大的老师视频学习。从关系代数到SQL语言,以及一些进阶数据库操作的简单学习。

关系模型

  • 关系运算

    • 关系代数

      基于集合的运算

      基于关系代数的数据库语言

    • 关系演算

      • 元组演算

        基于逻辑的运算

      • 域演算

        基于示例的运算

关系

列的取值范围就是域,域有相同的数据类型

笛卡儿积(每一个元素成为n-元组):多个域的排列组合

  • 笛卡儿积中具有某个意义的元组称为关系

    域名和属性名不一样,为每一列起的名字叫属性名,不同列可能来自同一个域。

外码连接两个或者多个关系。

关系代数

是一种抽象的语言

前提:满足并相容性,才能进行运算

  • 基本操作:

    并,差,笛卡儿积,选择(选择行操作),投影(选择列进行操作)

  • 扩展操作

    交,theta-Join(直接使用连接操作比笛卡儿积加一个选择操作快,DBMS可以进行直接操作),等值连接,特殊连接,自然连接

  • 关系代数操作的组合和应用训练

    • 要特别注意语义
  • 关系代数的复杂扩展操作

    • 除运算(包含了全部的,所有的)
    • 外链接:左外连接(不丢失左侧元组数据),右外连接,全外连接

集合操作的特性

  • 关系代数与sql语言的对应关系

    Select From Where

    sql查询语句就是关于代数的组合

    数据库管理系统就是解析这样的组合,拆解开,按照一定的次序分解开,调用基本的操作算法来予以实现。

关系演算

元组演算有难度的位置):一种逻辑表达,以元祖为基本单位循环遍历。与关系代数可以相互转换。

  • 存在量词 对r中的每一个t进行F(t)检验
  • 全称量词

关系域演算:过程性非常差,适合用户使用来表达查询条件

QBE域演算语言

通过填表的方式,高度非过程化的查询语言。

安全性

关系运算不一定是安全的。不产生无穷关系和无穷验证的运算被称为是安全的。

关系运算总结

关系运算有三种:关系代数,关系元组演算,关系域演算,都是抽象的数学关系,体现了三种不同的思维。关系代数是基于集合的操作思维,后两者是基于逻辑的思维。关系代数是安全的。三种关系运算都可以说是非过程性的。

ISBL语言:基于关系代数的数据库语言。

QUEL语言

数据库语言SQL

  1. DDL 定义数据库
  2. DML操纵数据库

Structured Query Language(SQL)

  1. 建立数据库:定义数据库和表,添加元组。

    Create datebase xxx

    Create table Students(Snumber char(8) not null, Sname char(10), Ssex char(2));

  2. 利用数据库进行简单的查询

    Select ... From ... Where...

    1. 结果唯一性问题 DISTINCT

    2. 结果排序问题order by 列名 【asc/desc】

    3. 模糊查询

      Select Sname From Student Where Sname Like '张__';

    • % : 零个或者多个字符
    • _ : 单个字符
    • \: 转义字符
    1. 多表联合查询

      表示笛卡儿积操作。

      Select S1.Snumber From SC S1, SC S2 Where S1.Snumber = S2.Snumber and ...

  3. SQL的更新操作

    1. 增 INSERT
      1. Insert Into Teacher Values ("005","张三");
      2. Insert Into St(S#, Sname) Select S#, Sname From Student Order By Sname;批元组新增
    2. 删 DELETE
      1. Delete From Student Where S# ='100';
      2. Update Teacher Set Salary = Salary * 1.05 Where D# in (...)
    3. 修正与撤销
      1. Alter Table Student Add Saddr char[40],PID char[18];
      2. Alter Table Student Modify Sname char(10);
      3. Alter Table Student Drop Unique(Sname);
      4. Drop Table Student;撤销学生表Student;delete语句知识删除表中的元组,而drop table 的操作撤销包含表格式,表中所有元组,由该白哦导出的视图等所有相关内容。
    4. 指定与关闭命令
      1. Use Student
      2. Close Student
  4. DBMS交换环境简介

利用SQL语言表达复杂查询

  1. 子查询

    1. 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');

      非相关子查询和相关子查询

    2. theta some / theta all类似于全称量词和存在量词

      1. 找出工资最低的教师姓名

        Select Tname From Teacher Where Salary <= all(Select Salary From Teacher);

      2. 找出001号课程成绩不是最高的所有学生的学号

        Select S# From SC Where C# = '001' and Score < some(Select Score From SC Where C# = '001');

      3. 等价性变换需要注意

        1. some 等价于in
        2. not in 等价于 <>all
    3. EXIST

      1. not Exists可以实现很多新功能

      2. 检索学过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号老师讲的课程/ 该同学没学过

      3. 列出没学过李明老师讲授的任何一门课程的所有同学的姓名

        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#)

        不存在/ 学过一门课程

        从肯定过度到否定之否定
      4. 列出至少学过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语言进行计算

  1. 聚集函数 count sum avg max min

    求有差额的任意两位教师的薪水差额

    1
    2
    3
    4
    5
    6
    7
    Select 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#;
  2. 分组聚集计算与分组过滤计算

    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#;
  3. 实现并交差

    UNION/ /INTERSECT/ /EXCEPT

    1
    2
    3
    Select S# From SC Where C#='002'
    INTERSECT
    Select S# From SC Where C# = '003';
  4. 空值

    Select Sname From Student Where Sage is null;

  5. 内连接,外连接

    1. 求所有教师的任课情况并按教师号排序

    Select Teacher.T#, Tname ,Cname From Teacher Inner Join Course On Teacher.T#=Course.T# Order by Teacher.T# ASC;

  6. SQL视图

数据库完整性

完整性约束条件(OPAR)

  • O: 约束的对象
  • P:谓词条件,什么样的约束
  • A:触发条件
  • R:响应动作,不满足时怎么办

约束分类

  1. 静态约束,通过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 (条件)
  1. 动态约束 :从一状态到另一状态时应满足的约束
  • 触发器, Trigger

    • 1
      2
      3
      4
      5
      create trigger delS# after delete on Student referencing old oldi
      for each row
      begin
      delete sc where S# = :oldi.S#
      end;

数据库安全性

SOTP

  1. 自主安全性的实现方式
    1. 存储矩阵
    2. 视图
    3. SQL语言授权和收回授权
      • Grant Select On Employee To UserB WITH GRANT OPTION
    4. 授权过程,注意授权的传播范围(深度,广度)。
  2. 强制安全性

嵌入式SQL

高级语言与SQL语言结合

  1. 变量声明与数据库连接

    • 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;

  2. 数据集和游标

    检索多行结果用到游标,游标定义一次,多次打开,多次执行,多次关闭。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    exec 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
      7
      exec 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;
      }
  1. 异常状态捕获及错误处理机制

    状态是嵌入式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;

    错误捕获语句的作用域

  2. 动态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

  • 系统故障:掉电,非正常关机。会影响到数据库缓存区。通过运行日志的手段。运行日志定期设置和更新检查点(为了判断从哪一点开始恢复)。

  • 介质故障:磁盘坏了,用副本。确定备份时刻,转储点,运行日志至少要包括在转储点之前。



本文标题:数据库基础

文章作者:tsuki

发布时间:2022.03.22 - 21:43

最后更新:2022.03.22 - 21:55

原始链接:https://tsuki419.github.io/数据库.html

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

-------------THE END-------------
0%