【接地气】数据库学习笔记 持续更新
1、 前言 <( ̄︶ ̄)>
这里所做的笔记是笔者在校学习《数据库应用技术》的过程中,为了加深印象而做的,可能有些地方不太严谨,欢迎各位看官批评指正
在开始之前,我想说一点关于学习的个人见解,我觉得无论是什么样的学科,一定存在特别难的东西,这些东西很难用我们平时的语言去解释,只能用抽象的东西来描述,比如一些高深的数学。但是也一定存在东西,看似很难,但是却完完全全可以凭借朴实无华的语言去描述,虽然会牺牲一些严谨性,但是却不影响大体。
我希望能够通过个人的钻研,把复杂的东西,应该说能够被简化的复杂的东西,以平易近人的语言来描述。 (๑•̀ㅂ•́)و✧
2、关系数据库结构
2.1基本结构
基本结构其实是围绕表来展开的,应为关系数据库说白了就是一张一张表。下图就是张表:
属性
这张表的表头,即姓名、任届、年龄 被称为属性
每一个属性都有对应的值,如姓名属性下面Joe Biden 等等等等,和美国历届总统的姓名都是 “姓名” 这个属性的 “域”
元组
表中除了表头外,每一行被称为一个元组
关系
一个表就是一个关系
元组变量
元组变量是什么,我们拿函数来类比以下。
函数中变量就是x,x是一个变化的数字,那它能取什么数字嘞,它能去定义域里面的数,所以说变量就是一个不确定的数,他只能在一个池子里找(定义域),
元组变量也一样,它是一个变化的元组(一行数据),它能取得值是从一个池子里取的,这个池子就是除表头外所有的元组(行)。
2.2、数据库模式
关系模式
理解这个概念我们还要从关系入手
首先我们知道,关系就是一张表
下图两张表都是关系,但它们有什么不一样吗?
第二个关系比第一个关系少了一个元组
虽然只是少了一个元组,但是它们已经不是同一个关系
那么问题就来了,
如果在一个大型数据库中,一个关系的元组有许多,那么随便删减一个元组,或修改一个元组里某个属性,就变成另个一关系了,
这样下来我们每天都要修改出成千上万个新关系,我们查询一个关系的时候怎么确定是哪一个关系呢,毕竟可能一秒钟就有十几次的修改。
这就引入了关系模式这个概念,我们不难看出,这成千上万个关系都有一个共同点特征,那就是它们的表头没有变化。
所以我们定义,凡是用一个表头的关系都是同一个关系模式。
2.3、主关键字,候选关键字,外关键字,码(键),超码
上面我们讨论了一个关系(表)的基本构造,总结就是讨论了一个关系的行和列
那么接下来我们要探讨属性,以及有些处在特殊地位的属性的命名问题,就比如说,身份证为什么叫身份证呢,因为其上的身份证号能唯一识别一个人,所以给它起个名字叫身份证,
这几个概念其实不难解释,我们只需要例子就可以,学习它们不需要定义,所以这里我也没有放完整严格的定义,大部分只是记忆加口述的定义
主关键字(主码、主键):
它是一个这样的属性,或属性集合(该集合去掉任意一个属性都不能完成以下任务),它(它们)能够唯一确定一个元组(表中一行是一个元组)。所以主关键字不能有重复或空缺
如:身份证号就唯一代表一个人,身份证号就是主关键字
候选关键字(候选码)
能唯一确定一个元组的属性或集合(该集合去掉任意一个都不行)。这个定义好像和主关键字差不多,其实主关键字=候选关键字,主关键字只不过是我们从这一堆候选关键字中拉出来一个长得好看的,给它一个这么一个称呼。
外关键字(外码、外键)
外关键字其实不叫外关键字,它真名叫 “别人的主关键字”,或者是“外人的主关键字”(狗头保命)。怎么回事呢?
其实外人的关键字就是另外一张表的关键字,而且你想,既然是另外一张表的主关键字了,那它肯定是不能空缺,也不能重复的,
那也一定是自己表的候选关键字喽。这样想在99%的情况下是正确的,但是请看下面两张表
职工表中部门号是职工表的外键,对应的就是部门表的主键部门号,但是部门号却不是职工表的主键,因为有空缺,这种工况代表4号职工刚拿到offer,还没安排部门嘞。
所以说,外键可以不是候选键,也可以不是主键,
但是候选码必须是另一个关系表的主键。
码(键)
能唯一确定一个元组的属性或集合。
对你没看错,前面这句话就是我复制候选关键字定义粘贴的,但是少了括号里面的东西,相信你能够知道区别是什么。
づ ̄3 ̄)づ╭❤~
超码
超码是这样一个东西:
学生是一个实体,则学生的集合是一个实体集,而超码是用来在学生的集合中区分不同的学生。假设学生(实体)具有多个属性:学号,身份证号,姓名,性别。
因为通过学号可以找到唯一一个学生,所以{学号}是一个超码,同理{学号,身份证号}、{学号,身份证号,姓名}、{学号,身份证号,姓名,性别}、{身份证号}、{身份证号,姓名}、{身份证号,姓名、性别}也是超码.在这里,因为不同的学生可能拥有相同的姓名,所以姓名不可以区别一个学生,既{姓名}不是一个超码,{性别}、{姓名、性别}也不是。
虽然超码可以唯一标识一个实体,但是可能大多数超码中含有多余的属性。
所以我们需要候选码。
以上引自百度知道(我实在不想打字了 ╯﹏╰)https://zhidao.baidu.com/question/386698463.html
2.4、查询语言
查询语言顾名思义是用户,用来,向数据库,获取信息的,语言
完整的查询语言包括:增、删、查、改四种功能
2.4.1、关系代数的基本运算
我们要实现增、删、查、改需要借助查询语言,而查询语言需要依靠数学运算来执行我们的命令。这其中的数学运算不同于加减乘除,而是被特殊定义的运算,接下来我们将依次介绍。
选择运算
选择最简单,就是选出符合条件的元组(行)
我们写做:
σ
A
1
=
1
(
A
)
\sigma_{A_{1}}=_{1}(A)
σA1=1(A)
意为找出表
A
A
A中属性
A
1
A_{1}
A1等于1的元组,如图蓝色部分:
投影运算
投影运算是选择符合条件的属性和它的域(列),把其单独拿出来形成一个关系
我们写作:
π A 1 ( A ) \pi_{A_{1}}(A) πA1(A)
意为从表
A
A
A中取出属性是
A
1
A_1
A1的列,如下蓝色部分:
笛卡尔积运算
笛卡尔积符号:×
笛卡尔积需要重点说明
首先我们有以下两张表:
表和表的笛卡尔积写作:
A
×
B
A×B
A×B
得到如下表:
笛卡尔积运算用语言描述就是:表1的第1个元组分别和表2的所有元组挨个相组合,得到n条元组(假设表1有m条元组,表2有n条),加上表1的第2个元组分别和表2的所有元组挨个相组合得到的n条元组,再加上表1的第3个元组分别和表2的所有元组挨个相组合得到的n条元组,再加上·······,一直加到表1的第m个元组分别和表2的所有元组挨个相组合得到的n条元组,
所以表1 × 表2 一共有mn条元组
更名运算
行不更名,坐不改姓,为什么要由更名?
其实,这个运算名字起的不是特别恰当,应该叫起名运算,
因为它是为了解决没有名字的关系无法引用这个问题诞生的
说白了就是当你使用其他的关系运算时,你得到的时一个新关系,这个新关系是没有名字的
你下次想对他进行再次运算时如果没有名字就会很麻烦,例如下面这样:
π
a
b
c
.
n
a
m
e
(
π
d
f
e
.
n
a
m
e
(
σ
a
c
c
.
a
g
e
(
a
c
c
o
u
n
t
)
×
π
s
d
(
a
c
c
o
u
n
t
)
)
)
)
\pi_{abc.name}(\pi_{dfe.name}(\sigma_{acc.age}(account)×\pi_{sd}(account))))
πabc.name(πdfe.name(σacc.age(account)×πsd(account))))
但是如果有了更名运算,你只需要更名就ok了, 如下:
ρ
x
(
π
d
f
e
.
n
a
m
e
(
σ
a
c
c
.
a
g
e
(
a
c
c
o
u
n
t
)
×
π
s
d
(
a
c
c
o
u
n
t
)
)
)
)
\rho_{x}(\pi_{dfe.name}(\sigma_{acc.age}(account)×\pi_{sd}(account))))
ρx(πdfe.name(σacc.age(account)×πsd(account))))
然后最开头的一长串就可以写成:
π
a
b
c
.
n
a
m
e
(
x
)
\pi_{abc.name}(x)
πabc.name(x)
我想你应该懂了什么叫更名运算了,我把中间一长串命名为了x
赋值运算
把关系表达式用一个符号表示
赋值运算符号 ← \leftarrow ←
写作: t e m p ← π R ( r ) temp \leftarrow \pi_{R}(r) temp←πR(r)
意为将r关系中R属性的投影这个操作赋值给temp,下次想用这个操作时直需要些temp就可以
练习环节 ┑( ̄Д  ̄)┍
题目:《舔🐕》,描述如下:
现在银行数据库给你提供了1张关系表account,它们就放在你的办公桌上,
)
老板的任务是找出银行存款最多的大佬,我们年终要好好给它表示一下。(好好舔)🙃
你如何使用上述讲过的(投影,选择,笛卡尔积,并,差)知识完成任务???????
答案请移步此处链接: link.
并运算
找出两个关系中所有的对象,就说白了就是并集的意思
π
姓
名
(
在
职
教
师
登
记
表
)
∩
π
姓
名
(
在
职
警
察
登
记
表
)
\pi_{姓名}(在职教师登记表) \cap\pi_{姓名}(在职警察登记表)
π姓名(在职教师登记表)∩π姓名(在职警察登记表)
上面的关系找出了一堆名字,这些人要么是警察,要么是教师。
差运算
差运算,在一个关系而不在另一个。
π 名 字 ( 存 款 人 信 息 表 ) − π 名 字 ( 贷 款 人 信 息 表 ) \pi_{名字}(存款人信息表)-\pi_{名字}(贷款人信息表) π名字(存款人信息表)−π名字(贷款人信息表)
上面的得到的表是一串人名,这些人是有存款而无贷款的。
交运算
这个运算和并运算时差不多的,不多解释
π
名
字
(
存
款
人
信
息
表
)
−
π
名
字
(
贷
款
人
信
息
表
)
\pi_{名字}(存款人信息表)-\pi_{名字}(贷款人信息表)
π名字(存款人信息表)−π名字(贷款人信息表)
上面是有贷款也有存款的人的名字
注意:以上交、差、并运算必须是具有相同关系模式的两张表之间才能进行。
自然连接运算
自然连接两个表,首先形成两个表的笛卡尔积,然后基于两个关系模式中都
有的属性的相等性进行选择运算,然后除去重复的属性,
自然连接符号 ⋈ \bowtie ⋈
例如对下面两个表做自然连接
A ⋈ B A\bowtie B A⋈B
得到下面表:
它是在 A × B A×B A×B的基础上,去出ID不相等的元组和重复的一行ID属性得到的(灰色部分):
除运算
设关系R除以关系S的结果为关系T,则T包含所有在R但不在S中的属性及其值,
T的元组与S的元组的所有组合都在R中
写作:
S
÷
R
S ÷ R
S÷R
结果是:
什么时候会用到除法呢,就比如说上面的例子,
S
÷
R
S ÷ R
S÷R,
用这个式子为了解决什么问题呢:
其实是为了找出几个A-3属性的元组,
这些元组的A-2 和A-1 属性要满足
A-1是1,且A-2是a或b
左外连接
取出左侧关系中所有与右侧关系的任意元组都不匹配的元组,用空值填充来自右侧
所有来自右侧关系的属性,再把生产出的元组加到自然连接的结果上
概念很恶心,我们直接上图,(我向来认为许多概念是人们后来总结的,人们总是先发现创造一个现
象或例子,然后再根据它定义概念,所以诸君不理解概念也不必妄自菲薄,我们直接用例子学就行了。)
如下两个关系A和B:
对它们进行左外连接得:
这里就能看出规则了,如果是自然连接,显然无论是A关系中第5个元组还是B关系
中得第5个元组都会被去掉,但左连接就保留了A关系中第五个元组,而且它得B2属性是null
右外连接
同左外连接一样,只不过换了个方向,不再赘述了哈
全外连接
既进行左外连接,由进行右外连接,
还是这两个关系A和B:
得到结果如下:
空值
在上面的运算中出现了null,对于这个空值,我们也有必要提一提
①任何包含空值的算术运算(加减乘除)应该返回一个null
②任何包含空值的比较运算(> < = >= <= 不等于)应该返回一个特殊值 unknown(注意和null不一样)
③任何包含空值的布尔运算(or and not)我们做如下定义
(true and unknown)= unknown
(false and unknown) = false
(unknown and unknown)
(true or unknown) = true
(false or unknown) = false
(unknown or unknown) = unknown
(not unknown) = nuknown
2.4.2、数据库的修改
上文我们主要讲的运算是为了从数据库中获取信息,接下来我们要介绍一些运算,来修改数据库
中的信息
删除
删除只能整行整行的删除,不能只删除一条元组里面的某个属性值。
写作 r ← r − E r \leftarrow r-E r←r−E
意为把关系r中的E删除
例如对下表进行如下删除操作:
A
←
A
−
π
A
2
(
A
)
A \leftarrow A - \pi_{A2}(A)
A←A−πA2(A)
结果为:
插入运算
顾名思义,就是插入一条元组
写作: r ← r ∪ E r \leftarrow r \cup E r←r∪E
例如:对关系A插入一个元组(99 1000)
A
←
A
∪
{
(
99
,
1000
)
}
A \leftarrow A \cup \{ (99,1000)\}
A←A∪{(99,1000)}
结果为:
更行运算
更新运算我们可以通过投影来进行
如果我们想对表r某个属性下的值全部进行更新
写作: r ← π F 1 , F 2 ⋅ ⋅ ⋅ ⋅ ⋅ F n ( r ) r \leftarrow \pi_{F_{1},F_{2}·····F_{n}}(r) r←πF1,F2⋅⋅⋅⋅⋅Fn(r)
其中,当第i个属性不必修改时, F i F_{i} Fi就是第i个属性,
如果我们只想对r中一部分元组进行修改,其他的不变,那么写作:
r ← π F 1 , F 2 ⋅ ⋅ ⋅ ⋅ ⋅ F n ( σ ( r ) ) ∪ ( r − σ p ( r ) ) r \leftarrow \pi_{F_{1},F_{2}·····F_{n}}(\sigma(r)) \cup (r - \sigma_{p}(r)) r←πF1,F2⋅⋅⋅⋅⋅Fn(σ(r))∪(r−σp(r))
p代表用于选择需要修改元组的条件
上面看不懂也没关系,下面学例子就行了)
例如: 我想对关系A中所有元组A2属性加1,
写作:
A
←
π
A
1
,
A
2
+
1
(
A
)
A \leftarrow \pi_{A1 , A2+1}(A)
A←πA1,A2+1(A)
结果为:
例如:我想把关系A中第一个元组的A2属性改为999,写作:
A ← π A 1 , A 2 + 990 ( σ A 1 = 1 ( A ) ) ∪ π A 1 , A 2 ( σ A 1 ≠ 1 ( A ) ) A \leftarrow \pi_{A1, A2+990}(\sigma _{A1=1}(A)) \cup \pi_{A1, A2}(\sigma _{A1 \neq 1}(A)) A←πA1,A2+990(σA1=1(A))∪πA1,A2(σA1=1(A))
结果为:
3、数据库设计和E-R模型
就笔者的个人体悟而言,想要设计一个好的数据库,我们所需要的知识不在数据库这本书中, 更多
的是在具体 的场景中,你是为了谁设计的数据库,目的是什么,设计数据库之前,脑子里存在的许
许多多和数据库不相关但和你要设计的行业或领域有关的知识。
所以在这里我们并不能教给谁如何设计好的数据库,我们只能把最基本的方法呈现出来,这些方
法只是基石,没有它们你可能无法设计出一个数据库,但时有了它们你也不一定能够设计出。
====
未完待续