哈工大数据库学习笔记(上)

哈工大数据库笔记(上)

author@ Xidaray

1.初步认识数据库系统

Database:相互之间有关联关系的Table集合
DBMS:数据库管理系统
DBS:数据库系统:
数据库系统的构成包括数据库、数据库管理系统、数据库应用程序、数据库管理员以及计算机与网络基本系统

  • 数据库管理系统是软件产品,而数据库系统不仅仅是软件产品

数据库语言与高级语言的关系:
一条数据库相当于高级语言的一个或者多个循环程序

2.数据库系统的结构抽象与演变

模式(schema)
对数据库中数据所进行的一种结构性的描述
所观察到的数据的结构信息
不是数据表!

数据库系统的三级模式结构:

外模式:子模式或者用户模式,用户看到的东西。
内模式:存储模式,这些东西在电脑里面到底用什么数据结构怎么存储的。
概念模式:Conceptual Schema

逻辑数据独立性:当概念模式发生变化时,可以不改变外部模式(只需要改变E-C Mapping)
物理数据独立性:内模式变化时,可以不改变概念模式

关系模型:表格的形式
关系模式:对表的描述,也就是对关系的描述,就是外教要你写的那东西
仅仅设计型的描述,而不涉及具体的值。
关系模型的数据:表里头填进去的具体值。

3. 关系模型之基本概念

3.1 关系模型

  • 关系模型:形象的说,一个关系就是一个Table

  • 关系模型的三个要素:

    • 基本结构
    • 基本操作
    • 完整性约束:实体完整性,参照完整性
  • 什么是关系?:一个关系通常对应一张表,是几个域笛卡尔积的子集

  • 元组:元组可理解为表中的一行

  • 域:域是一组具有相同数据类型的值的集合

  • 笛卡尔积:见教材

关系模式: R ( A 1 : D 1 , A 2 : D 2 , A 3 : D 3 , . . . , A n : D n ) R(A1:D1,A2:D2,A3:D3,...,An:Dn) R(A1:D1,A2:D2,A3:D3,...,An:Dn)

n n n被称为关系的度数或者目数
元组的数目称为关系的基数(cardinality)

3.2 候选码,主码,外键

  • 候选码(Key):若关系中的一个属性或属性组的值能够唯一地标识一个元组,且它的真子集不能唯一的标识一个元组,则称这个属性或属性组为候选码
    1.所以候选码具有最小性

  • 主码:当有一个候选码时,选定一个为主码(Primary Key)。因为DBMS以主码为主要线索管理关系中的各个元组

  • 外键(Foreign Key):其它关系的候选键,可以是R中的主属性或非主属性

    • 也可以说是关系R的一个属性组,不是R的候选码,但是他与S的候选码相对应, 则称这个属性组为R的外码或者外键。两个关系通常由外码连接起来
  • 关系模型的完整性:

    • 实体完整性:关系的主码中的属性值不能为空值(NULL或者N/A)
    • 参照完整性:针对外码而言,是指表的外键必须是另一个表主键的有效值,或者是空值。
    • 用户自定义完整性:用户针对具体的应用环境所定义的约束条件

4 关系代数(Relational aelgbra)

4.1 关系代数概述

关系代数是一种抽象的查询语言,用对关系的运算来表达查询,作为研究关系数据语言的数学工具。关系代数的运算对象是关系(集合),运算结果亦为关系(集合)

分为两类,一类是集合操作,从关系的水平,即对行进行操作,第二类是纯关系操作,不仅涉及行,而且涉及列
关系代数是可以组合使用的

4.2 并相容性的概念

并相容性:并,交,差需要满足“并相容性”
当且仅当两个关系属性数目必须相同,并且对于任意i,关系R的第i个属性的域必须和关系S的第i个属性的域相同

4.3 并运算(Union)

定义见王珊书P48
符号: ∪ \cup
记得要去掉重复的元组
并运算后关系目数是不变的!所以不能说两个关系并完以后成了一个更大的关系
汉语中的或者…或者…通常是并运算的要求
就是OR

4.4 差运算(Except)

记作R-S
定义见王珊书P48
R-S就是在R中将属于S的元组删去,保留只属于R不属于S的元组

4.5 广义笛卡尔积操作(Catesian product)

记作RxS
就是将关系R中的元组与关系S的元组进行所有可能的拼接
定义见王珊书P48
RxS=SxR

4.6 交运算(Intersection)

定义见王珊书P48
就是AND操作符
符号: ∩ \cap
运算结果由既属于R也属于S的元组组成

4.7 选择(Select)运算

定义:见王珊书P50
符号: σ \sigma σ
选择运算实际上是从关系R中选取使逻辑表达式F为真的元组重新组成关系。这是从行的角度进行的运算。
相当于WHERE条件子句

4.8 投影操作(Projection)

定义见王珊书P52
符号: π \pi π
投影操作从给定关系中选出某些列组成新的关系,这是从列的角度进行的运算
如果投影后有重复元组,则应去掉这些重复元组
相当于SQL中的SELECT子句

4.9 θ \theta θ-连接运算

定义见王珊书P52
它是从两个关系的笛卡儿积中选取属性满足一定条件的元组。
就是为了后面的连表查询

  • 等值连接(Equi-join):当 θ \theta θ-连接运算符为 = = =号时,就是等值连接,等值连接是θ-连接的一个特例,见书P53
  • 自然连接:一种特殊的等值连接,要求两个关系中进行比较的分量必须是同名的属性组,并且在结果中把重复的属性列去掉。

4.10 除(division)操作

重在理解
除法操作经常用来求解“查询…全部的,所有的…”
定义和理解见王珊书p54
R÷S其实就是判断关系R中X各个值的象集Y是否包含关系S中属性Y的所有值

4.11 外连接操作(Outer Join)

定义:两个关系R与S进行连接时,如果关系R中的元组在S中找不到相对应的元组,则为了避免该元组(悬浮元组)信息丢失,从而将该元组与S中假定存在的全为空值的元组形成连接,放置在结果关系中,这种连接称为外连接
详细定义见王珊书p54

4.12 书写关系代数的思维

关系代数的基本书写思路:

  • 选出将用到的关系/表
  • 做”积“运算
  • 做选择运算保留所需的行
  • 做投影运算保留所需的列、属性
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BnQ78DMu-1626620285704)(…/picture/书写关系代数的思维.png)]
    在关系代数运算中,五种基本运算为并、差、选择、投影、乘积

5 关系演算(Reational Calculus)

5.1 关系元组演算

它是以元组为对象单位的演算
关系元组演算的基本形式为:
{ t ∣ P ( t ) } \{t|P(t)\} {tP(t)}
上式表示:所有使谓词 P P P为真的元组变量 t t t的集合

P(t)可以是以下三种原子公式的组合:

  • t ∈ R t\in R tR
  • s [ A ]   θ   c s[A]\ \theta\ c s[A] θ c:元组分量与常量c间满足比较关系
  • s [ A ]   θ   u [ [ B ] s[A]\ \theta\ u[[B] s[A] θ u[[B]:两个元组分量作比较

要注意运算符的优先次序
用递归定义公式,组合,递归地构造公式
一种用逻辑表达查询的思维
以元组为基本单位进行循环,先找到元组,再找到元组分量,进行谓词判断
元组演算与关系代数可以相互转换

5.2 关系元组演算之应用训练

四个例子

  • 1.“全都学过”:
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sOBhjkUm-1626620285706)(…/picture/例子1:全都学过.png)]
    问题:这里最后的C#为啥要对上呢

    1. “全没学过”
      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tMH6gM0g-1626620285707)(…/picture/例子2.png)]
  • 3.“学过至少一门”
    比较简单,就不贴图了

  • 4.“至少有一门没有学过”
    做个转换,去掉所有学过的学生姓名
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XoM4Zr0t-1626620285708)(…/picture/例子4.png)]

5.3 *关系域演算

关系域演算的基本形式:
{ ⟨ x 1 , x 2 , . . . , x n ⟩ ∣ P ( x 1 , x 2 , . . . , x n ) } \{\langle x1,x2,...,x_{n}\rangle|P(x1,x2,...,x_{n})\} {x1,x2,...,xnP(x1,x2,...,xn)}

三种形式的原子公式
⟨ x 1 , x 2 , . . . , x n ⟩ ∈ R \langle x1,x2,...,x_{n}\rangle\in R x1,x2,...,xnR
x   θ   c x\ \theta\ c x θ c:c为常量
x   θ   y x\ \theta\ y x θ y:和域变量作比较

6.SQL语言概述

结构化查询语言(Structured Query Language)
DDL: 数据定义语言:CREATE,DROP,ALTER
DML:数据操控语言:INSERT,UPDATE,DELETE
DCL:数据控制语言:GRANT,REVOKE
DQL:数据查询语言:SELECT

6.1 建立数据库

很简单,看MySQL笔记

PRIMARY KEY:主键约束。每个表只能有一个主键,在候选键中选出一个
UNIQUE:就是候选键,唯一性约束。可以有多个UNIQUE

6.2 SQL进行简单查询

一样,看MySQL笔记补充内容

SELECT 列名
FROM 表名
WHERE 检索条件
--其实WHERE在英文中就有在...的情况下

7 SQL复杂查询

7.1 子查询

出现在WHERE子句中的SELECT语句被称为子查询(Subquery),子查询返回的是一个集合。

  • 1.(NOT) IN 子查询
    语义:判断某一表达式的值是否在子查询的结果中
--列出选修了001号课程的学生的学号和姓名
SELECT S# ,Sname
FROM Student
WHERE S# 
IN (SELECT S# FROM SC WHERE C# ='001');
  • 2. θ \theta θ Some与 θ \theta θ All子查询
    见王珊书P105
    基本语法:
    表达式 θ \theta θ Some(子查询)
    表达式 θ \theta θ All(子查询):相当于任意量词
    语义:将表达式的值和子查询的结果进行比较。
--找出001号课成绩不是最高的所有学生的学号
SELECT S# FROM SC 
WHERE C#="001" AND
SCORE< SOME(SELECT SCORE FROM SC WHERE C#="001");
--找出张三成绩最低的课程号
SELECT C# FROM SC,Student S
WHERE Sname="张三" AND S.S#=SC.S# AND 
Score<=ALL(SELECT Score FROM SC WHERE S#=S.S#;--注意自联结
  • 3.(NOT) EXISTS 子查询(重在理解!)

位置:王珊书P107
集合基数的测试
基本语法:
(NOT) EXISTS(子查询)
EXISTS相当于存在量词 ∃ \exists ,而带EXISTS的子查询不返回任何数据,只产生逻辑真或者逻辑假。
语义:子查询结果中有无元组存在,如果子查询包含任何行,则EXISTS运算符返回true,否则它返回false。NOT EXISTS运算符与之相反,如果子查询不包含任何行返回True

--查询所有选修了1号课程的学生姓名
SELECT Sname
FROM Student
WHERE EXISTS
(
SELECT *
  FROM SC
  WHERE SC.sno=student.sno AND cno='1;
)

上述查询涉及表student和sc表。我们可以这样理解上面的SQL语句:
1.首先执行外查询SELECT sname FROM student,取出Student表中第一行元组,将第一行的sno传递给内查询,此时我们假设Sno为1。
2.内查询SELECT * FROM SC WHERE SC.sno=student.sno AND cno='1根据外查询传递的sno值来检索SC表中所有元组,此时相当于SELECT * FROM SC WHERE SC.sno='1' AND cno='1
3.若内查询查询到结果,返回True,则该行数据保留,作为结果显示;反之返回false,不做显示。
4.依次对Student表逐行查询、比较、看内查询结果是否保留;类似for循环一样
原文传送门:
https://blog.csdn.net/qq_19782019/article/details/78730882

--检索学过001号教师主讲的所有课程的所有同学的姓名
SELECT Sname FROM Student 
WHERE NOT EXISTS   --不存在
(SELECT * FROM Course  --有一门001教师主讲的课程
WHERE Course.Tno='001' AND NOT EXISTS --该同学没学过
  (SELECT *FROM SC
  WHERE Sno=Student.Sno AND Cno=Course.Cno));--这一层查的是该学生没学过的课程
上述语句意思:不存在有一门001号教师主讲的课程该同学没学过

理解:对于子查询:可以理解为对于一个特定的学生,比如苏小成,检索所有课程号,如果出现他没有学过的课程,那么NOT EXISTS子查询就会为空,返回TRUE,如果这个课程恰好又是001号教师教授的课程,就满足了第一层EXISTS查询条件。

7.2 结果计算与聚集计算

1.结果计算
--依据学生年龄求学生的出生年份,当前是2021年
SELECT S.S#,S.Sname,2021-S.Sage+1 AS Syear--最后求出的是Syear
FROM Student S;
2.聚集函数

五个聚集函数:COUNT,SUM,AVG,MAX,MIN
注意:WHERE子句中是不能用聚集函数的,因为WHERE是对每一个元组的判断。聚集函数只能用于SELECT子句和HAVING子句。
见王珊书P95,96

7.3 分组聚集计算和分组过滤

分组:SQL可以将检索到的元组按照某一条件进行分类,具有相同条件值的元组划到一个组或者一个集合中。

分组过滤:

  • 对分组进行条件过滤,满足的留下,不满足条件的集合丢弃。
  • Having子句,又称分组过滤子句,是对分组进行检查。需要有GROUP BY子句支持
GROUP BY 分组条件[HAVING 过滤条件]

7.4 用SQL实现关系代数操作

并运算:UNION [ALL]
交运算:INTERSECT [ALL]
差运算:EXCEPT [ALL]

通常情况下自动删除重复元组:不带ALL(集合运算),若需要保留重复的元组,则要带ALL。(包运算)
有了这些操作,只是让SQL更容易表达一些。

7.5 用SQL表达连接和外连接操作

  • 外连接
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lId5o9cZ-1626620285709)(…/picture/内外连接.png)]
    从书P97开始看

7.6 视图

见王珊书P119
视图就是个基本表投射出来的虚表,就像一个窗口。
视图一经定义就可以被查询,被删除。

语法:

CREATE VIEW<视图名>[列名,列名,列名]
AS 子查询 --可以是任意的SELECT语句
[with check option] --对视图进行操作时要满足更新,插入,或删除的行满足视图中的谓词条件(就是子查询中的条件表达式)

8 数据库完整性

8.1 数据库完整性的概念

什么是数据库完整性?
广义完整性:并发控制,安全控制
狭义完整性:专指语义完整性

完整性约束条件的一般形式:
I n t e r g r i t y C o n s t r a i n t = ( O , P , A , R ) Intergrity Constraint =(O,P,A,R) IntergrityConstraint=(O,P,A,R)
O:数据集合,约束的对象
P:谓词条件:什么样的约束
A:触发条件:什么时候检查
R:相应动作:不满足时怎么办?
表达对O这个对象,在A这个条件下,触发P约束,判断进不进行R这个动作。

8.2 数据库完整性的分类

  • 按约束对象分类

    • 域完整性约束条件:施加于某一列上
    • 关系完整性约束条件:施加于关系上,是对关系的多列或者元组进行约束。
  • 按约束来源分类

    • 结构约束:来自于模型的约束,例如主键约束,函数依赖约束,外键约束。
    • 内容约束:来自于用户的约束
  • 按约束状态分类

    • 静态约束:要求在DB任一时候满足的约束,比如人的年龄。
    • 动态约束:对于状态转变的约束
ALTER TABLE sc
ADD CONSTRAINT cscore CHECK(条件) --见书P165

8.3 SQL断言(ASSERTION)

一个断言就是一个谓词表达式,表达了希望数据库总能满足的条件
表约束和列约束就是一些特殊的断言
断言就是对于数据库的约束,小心使用复杂的断言,会增加数据库的负担
语法:

CREATE ASSERTION <断言名> CHECK 子句

例子:

限制每门课最多60名学生选修
CREATE ASSERTION ASSE_SC_CNUM1
CHECK(60>ALL(SELECT count(*) FROM SC GROUP BY cno));

8.4 触发器(trigger)

触发器是与表有关的数据库对象,在满足定义条件时触发,并执行触发器中定义的语句集合。触发器的这种特性可以协助应用在数据库端确保数据的完整性。

  • 举个例子,比如你现在有两个表【用户表】和【日志表】,当一个用户被创建的时候,就需要在日志表中插入创建的log日志,如果在不使用触发器的情况下,你需要编写程序语言逻辑才能实现,但是如果你定义了一个触发器,触发器的作用就是当你在用户表中插入一条数据的之后帮你在日志表中插入一条日志信息
    是一种过程完整性约束,是一段程序。

语法:

CREATE TRIGGER<触发器名>
{BEFORE|AFTER}<触发事件>ON<表名>

见王珊书P168
触发器又叫做事件-条件-动作规则

0>ALL(SELECT count(*) FROM SC GROUP BY cno));


### 8.4 触发器(trigger)

触发器是与表有关的数据库对象,在满足定义条件时触发,并执行触发器中定义的语句集合。触发器的这种特性可以协助应用在数据库端确保数据的完整性。

* 举个例子,比如你现在有两个表【用户表】和【日志表】,当一个用户被创建的时候,就需要在日志表中插入创建的log日志,如果在不使用触发器的情况下,你需要编写程序语言逻辑才能实现,但是如果你定义了一个触发器,触发器的作用就是当你在用户表中插入一条数据的之后帮你在日志表中插入一条日志信息
是一种过程完整性约束,是一段程序。

语法:

```sql
CREATE TRIGGER<触发器名>
{BEFORE|AFTER}<触发事件>ON<表名>

见王珊书P168
触发器又叫做事件-条件-动作规则

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值