SQL 数据库——关系代数(⼀)及解题套路
⽂章⽬录
数据库的类型
我们⼀般会把数据库简单区分成关系型数据库(SQL)和⾮关系型数据库(NoSQL)。
关系型数据库:MySQL、MariaDB、PostgreSQL、Oracle、SQL Server。⽐较有意思的是关系型数据库的logo很多都是动物。
⾮关系型数据库:⼀般只需要知道两个——Redis和MongoDB。Redis是键值类型(Key-Value)的数据库,类似JAVA⾥的Collection 类的Map,默认情况下Redis很难进⾏类似SQL⾥的where 和级联select 操作;MongoDB被称作⽂档型数据库,介于SQL和Redis之间,它没有表(Table)的结构,你想怎么插⼊就怎么插⼊,但是可以进⾏级联条件查询等操作。
关系型数据库的关系
记为关系模式,其中 R R R为关系名, A 1 A_1 A1等为组成该关系的属性名集合。
关系模式的详细表⽰为——即为;为中属性来⾃的域;为属性向域的映射集合;为依赖关系,如主键、外键等。但根据考试经验,这玩意⼀般⽤不到。
可以简单把理解成⼀个表,等为属性列的名字。如⼀个学⽣信息表:学⽣信息表(学号,性别,⽣⽇,专业,姓名...)。这样的理解⽅式有助于后⾯对连接操作的理解。
表⾥的每个值被称为元组,即所谓的“⾏”。
关系代数
关系代数是关系型数据库所完备的⼀类数学逻辑。其基本运算符有:
集合/逻辑运算符
含义⽐较运算符
含义 / 并/或⼤于 / 交/与<
⼩于笛卡尔积
⼩等于-
差⼤等于⾮
=
等于
特殊操作还有四个:
运算符
含义运算符含义
R (A ,A ,...)12R (U ,D ,DOM ,F )U A ,A 12D U DOM U D F R A 1∪∨>
∩∧×
≤≥
¬
(读作"“希格玛”")
选择 或 投影 (读作"join")
(⾃然)连接
除
运算符含义运算符
含义涉及到连接,除了⾃然连接,就必须提到⼏种扩展连接⽅式:
运算符
含义
运算符
含义连接(条件连接)
⾃然连接
左外连接
右外连接
这⼏种连接⽅式将在后⾯和笛卡尔积做集中区分。
理解关系代数符号
从⼀道例题出发:
sql中select是什么意思① 投影
要理解 就要先从投影说起。
或 被称为投影操作,但我更偏向于把它称为去冗。
什么是投影?假设我现在有两个表:学⽣信息(学号,姓名,班级)和学⽣成绩(学号,成绩,班级),如果以学号、姓名、班级、成绩为四个轴建⽴坐标系,两个表中同⼀个学⽣的信息会被映射到两个点。举⼀个例值:
(左)学号(左)姓名(左)班级(右)学号(右)成绩(右)班级32
张三
1401032
32
90
1401032
你会发现学号和班级在左右两个表中都重合了,如果我们只看两个表中的学号和班级,那么左右两个表中的这个值都会是⼀样的,也就是被投影到了同⼀个点——
如果每⼀个学⽣都有成绩或每⼀个有成绩的学⽣都登记到学⽣信息表中,那么:
σπ∏
⋈÷
⋈⋈C θ⋈o
⋈
o
L
⋈
o
R
π(σ(R ⋈A ,A 14A <2017∧A =952′′4′′S ))π∏π学⽣信息(学号,姓名,班级)=学号,班级π学⽣成绩(学号,成绩,班级)
学号,班级
之所以说投影就是去冗,我们画个图会更直观点,给出两个关系R(X,Y)——
X的值Y的值12132
2
制图如下:
如果做操作,则前两个点(绿线)则会投影到同⼀个地⽅,也就完成了⼀次“去冗”,丢掉了我们所不关⼼的Y轴信息;如果做操作,则第⼀和第三个点(黄线)也被投影到同⼀个点。⽤SQL语句就是:select distinct X from R 。
当我们通过select操作选择出⼀堆数据时,难免会有不少如点(1,3,...)和点(1,2,...)这样的结果值,我们现在只想知道它们在X轴上等于⼏,则直接对X轴投影,即可只得到⼀个(1)...。
注意,投影会改变数据的维度,⽐如上⾯例⼦中两列的表经过投影只留下了⼀个属性列。
特殊的,有若⼲个表经过复杂的操作(连接、选择等等),可能会产⽣两条⼀摸⼀样的数据,这时候使⽤符号(读作“德尔塔”)表⽰去除R中相同的元组(值、⾏、数据)。
② 选择
和都有特殊记法,如题⽬中的 σ A 1 ( R ) \sigma_{A_1}(R) σA1(R) 指的是选择R关系中的 A 1 A_1 A1属性列,略去属性列名⽽采
⽤列序号表⽰,等价于 σ 1 ( R ) \sigma_1(R) σ1(R)。配合⽐较、集合/逻辑运算符等,则可以进⼀步附加选择时的条件,如: σ A 1> ′ 201 7 ′ ( R ) \sigma_{A_1>'2017'}(R) σA1>′2017′(R)。
选择的SQL语句为:select A1 from R [where ....]。这部分内容⽐较简单,主要需要了解的就是刚刚提到的特殊记法,会在很多题⽬中出现。
③ 连接
连接是⼀个⾮常复杂的问题,主要有四种:⾃然连接、条件连接、左外连接和右外连接。同时还会有⼀个笛卡尔积在其中混淆视听。
1.笛卡尔积
笛卡尔积和连接最⼤的区别在于:不会合并任何⼀个列(属性),⽽是完整地做了⼀次排列组合操作。⽤图来表⽰:(图中A、B、1、2、3均为表的某个值,甲表和⼄表做笛卡尔乘积( )得到丙表,甲表和⼄表有且只有⼀列属性列,以⿊/蓝圆圈表⽰)
σ(R )X σ(R )Y δ(R )σπ×
假如有和,则 等于共列,如果R中有7条数据,S中有8条数据,中会有条数据。
这时候我们反过来想⼀下,如果做,就⼜经过投影得到了甲表。
2.⾃然连接
⾃然连接和笛卡尔积的区别在于,会合并相同的列,并以相同的列的值作为两个表的合并依据。上图中甲表和⼄表由于不存在相同的值和列,因此做⾃然连接会得到⼀个空表。
以学⽣信息(学号,姓名,班级)和学⽣成绩(学号,成绩,班级)这两个表为例,做它们的⾃然连接
:
注意到学⽣信息表中的王五的信息由于没法跟学⽣成绩表中到(学号,班级)的匹配,因此在合成表中
直接被删除了(理解成王五缺考了)。我们把这种不到匹配的值叫做悬浮元组,悬浮元组会在左右外连接中⽤到。
同样,对这个合成后的表做去冗操作,就会得知没有缺考的⼈都是1班的(简化⼀下问题,我们假设已知只有两个班级且有⼀个班级的⼈全部缺考了)。
3.条件连接( 连接)
条件连接是⼀种先经过笛卡尔乘积再进⾏选择的操作,例如上⽂中学⽣信息和学⽣成绩的例⼦(分别记为R和S):(别忘了上⽂中提到的——和都有特殊记法)
显然 ,等值条件连接可以产⽣与⾃然连接相近的结果,但依旧会保留⼀些冗余的列(这也是笛卡尔乘积与⾃然连接最⼤的差距之处);⼤部分情况下,这种冗余⽆法通过 π \pi π消除,详见下图。
我们画个图:
R (A ,A ,A )123S (A ,A ,A )234R ×S R (A ,A ,A ,A ,A ,A )S 12R 3R 2S 3S
43+3=6R S 7×8=56π(R ×⿊圆圈S )⋈π班级θσπR ⋈S ≈σ(R ×1=4∧3=6S )=R ⋈学号与班级相同
C
S
同样,条件可以有很多种,上⾯的例⼦是左右表学号和班级相同,你也可以只单单把条件设为成绩⼤于95,即 ,那么最终结
果就是:(显然这种连接出来的结果并不能反映学⽣成绩的真实意义,除⾮再做⼀次⽐对班级学号的选择)
学号姓名班级学号成绩班级1张三1210012李四1210013
王五
2
2
100
1
等值连接: R ⋈ C 学 号 与 班 级 相 同 S R\Join_{\mathop C \limits_{学号与班级相同}}S R ⋈学号与班级相同C S 就是等值连接,是条件连接的⼀个特例。与⾃然连接不同,虽然都需要寻等值的属性,但不像⾃然连接⼀样只保留⼀个同名属性列。
4.外连接
外连接分为左/右外连接。某种意义上,可以把外连接看成是⾃然连接的⼀种扩充。
上⽂中提到了悬浮元组,还是以学⽣信息和学⽣成绩为例⼦,在⾃然连接中,悬浮元组会被直接丢弃,⽽外连接则会根据左右情况予以保留。
例如:
会发现左表的悬浮元组在左外连接中得以保留,右表由于没有悬浮元组,因此右外连接时和⾃然连接结果相同。其SQL语句⼀般为:select
A1 from R left join S on R.学号=S.学号 and R.班级=S.班级。
除此之外还有全外连接(full join ),即同时保留两边的悬浮元素,在以上例⼦中,全外连接的结果和左外连接相同,符号⼀般为:,不是很重要。
R ⋈成绩>95′′
S θ⋈o
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论