【MYSQL学习】关系模式与关系规范化

1. 关系中的基本术语

(1)元组:也叫做记录,就是一行
(2)属性:就是列
(3)候选码:能唯一标识元组的属性
(4)主码: 候选码种的一个
(5)主属性与非主属性:候选码中的属性称为主属性

2. 关系的完整性

(1)实体完整性:若属性A是基本关系R的主属性,属性A不能取空值
(2)参照完整性:若属性F是基本关系R的歪吗,他与基本关系S的主码KS相对应,则对于每隔元组F上的
值必须为以下值:
空值
S某元组的主码值

3. 用户定义的完整性

4. 关系代数

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

    并、交、差

删除部分关系的运算

    选择、投影

合并两个关系元组的运算

    连接、积

改名运算
关系代数
并Union (∪)

    R和S的并,R∪S,是在R或S或两者中的元素的集合
    一个元素在并集中只出现一次
    R和S必须同类型(属性集相同、次序相同,但属性名可以不同)

交Intersect (∩)

    R和S的交,R∩S,是在R和S中都存在的元素的集合
    一个元素在交集中只出现一次
    R和S必须同类型(属性集相同、次序相同,但属性名可以不同)

差Minus (-)

    R和S的差,R-S,是在R中而不在S中的元素的集合
    R和S必须同类型(属性集相同、次序相同,但属性名可以不同)

投影Projection(π)

    从关系R中选择若干属性组成新的关系
    πA1,A2,…,An(R),表示从R中选择属性集A1,A2,…,An组成新的关系
    列的运算
    投影运算的结果中,也要去除可能的重复元组

广义笛卡儿积(×)

    关系R、S的广义笛卡儿积是两个关系的元组对的集合所组成的新关系
    R×S:
        属性是R和S的组合(有重复)
        元组是R和S所有元组的可能组合
        是R、S的无条件连接,使任意两个关系的信息能组合在一起

选择Selection(σ)

    从关系R中选择符合条件的元组构成新的关系
    σC(R),表示从R中选择满足条件(使逻辑表达式C为真)的元组
    行的运算

条件连接(θ)

    从R×S的结果集中,选取在指定的属性集上满足AθB条件的元组,组成新的关系
    θ是一个关于属性集的比较运算符
    θ为“=”的连接运算称为等值连接。

自然连接

    从R×S的结果集中,选取在某些公共属性上具有相同值的元组,组成新的关系
    R、S的公共属性
        属性集的交集(名称及类型相同)
    公共属性在结果中只出现一次
    等值连接

关系代数—除( ÷ )

    给定关系R(X,Y)和S(Y,Z),其中X, Y, Z为属性组。R中的Y与S中的Y可以有不同的属性名,但必须出自相同的域集。R与S的除运算得到一个新的关系P(X),P是R中满足下列条件的元组在X属性列上的投影:元组在X上分量值x的象集Yx包含S在Y上投影的集合。
    R÷S = {tr[X]| tr∈R∧πy (S)Yx}
    其中Yx为x在R中的象集,x=tr[X]。

5. 几种连接

原文地址:https://blog.csdn.net/qq_44756792/article/details/95503303
多表查询经常用到连接,各种连接之间的区别应该注意总结。
首先大概认识各种连接的关系和由来:

表之间的连接常有以下两种:
一、在SELECT语句的WHERE子句中使用比较运算符给出连接条件,对表进行连接,将这种表示形式称为连接谓词表示形式。连接谓词中的比较符可以是<、<=、=、>、>=、!=、<>、!< 和 !>,当比较符为“=”时,就是等值连接,等值连接的结果中有重复列,在目标列中去除相同的字段名就是自然连接。
二、.以JOIN关键字指定的连接,T-SQL扩展了以JOIN关键字指定连接的表示方式,使表的连接运算能力有所增强,以JOIN关键字指定的连接有三种类型:内连接、外连接、交叉连接(笛卡尔积)。
下面详细分析各种连接方式的特点:

1.等值连接(相等连接)

USE PXSCJ
GO
SELECT XSB.* , CJB.*
FROM XSB , CJB
WHERE XSB.学号 = CJB.学号

使用”=”关系将表连接起来的查询,其查询结果中列出被连接表中的所有列,包括其中的重复列。

2.自然连接:

数据库应用中最常用的是“自然连接”,它在目标列中去除相同的字段名。

SELECT XSB.* , CJB.课程号, CJB.成绩
FROM XSB , CJB
WHERE XSB.学号= CJB.学号

进行自然连接运算要求两个表有共同属性(列),自然连接运算的结果表是在参与操作的两个表的共同属性上进行等值连接后,再去除重复的属性后所得的新表。
等值连接和自然连接的区别:

1)等值连接中不要求相等属性值的属性名相同,而自然连接要求相等属性值的属性名必须相同,即两关系只有在同名属性才能进行自然连接。
2)等值连接不将重复属性去掉,而自然连接去掉重复属性,也可以说,自然连接是去掉重复列的等值连接。

3.内连接

指定了INNER关键字的连接是内连接,内连接按照ON所指定的连接条件合并两个表,返回满足条件的行。内连接是系统默认的,可以省略INNER关键字。使用内连接后仍可使用WHERE子句指定条件。

例1 SELECT *
FROM XSB INNER JOIN CJB
ON XSB.学号 =CJB.学号

例2 SELECT 姓名, 成绩
FROM XSB JOIN CJB
ON XSB.学号 = CJB.学号
WHERE 课程号 = ‘206’ AND 成绩>=80

4.自连接

自连接作为一种特例,可以将一个表与它自身进行连接,称为自连接。若要在一个表中查找具有相同列值的行,则可以使用自连接。使用自连接时需为表指定两个别名,且对所有列的引用均要用别名限定。

SELECT a.学号, a.课程号, b.课程号, a.成绩
FROM CJB a JOIN CJB b
ON a.成绩=b.成绩 AND a.学号=b.学号 AND a.课程号!=b.课程号

结果
5.外连接(左外连接,右外连接、全外连接)

指定了OUTER关键字的为外连接,外连接的结果表不但包含满足连接条件的行,还包括相应表中的所有行。外连接包括以下三种:

左外连接(LEFT OUTER JOIN):结果表中除了包括满足连接条件的行外,还包括左表的所有行。
【例】 查找所有学生情况,以及他们选修的课程号,若学生未选修任何课,也要包括其情况

SELECT XSB.* , 课程号
FROM XSB LEFT OUTER JOIN CJB
ON XSB.学号 = CJB.学号

本例执行时,若有学生未选任何课程,则结果表中相应行的课程号字段值为NULL。

右外连接(RIGHT OUTER JOIN):结果表中除了包括满足连接条件的行外,还包括右表的所有行。

完全外连接(FULL OUTER JOIN):结果表中除了包括满足连接条件的行外,还包括两个表的所有行。
其中的OUTER关键字均可省略**

6.交叉连接(又名笛卡尔积)

首先,先简单解释一下笛卡尔积。
有两个集合A和B,A = {0,1} B = {2,3,4}
集合 A×B 和 B×A的结果集就可以分别表示为以下这种形式:

A×B = {(0,2),(1,2),(0,3),(1,3),(0,4),(1,4)};
B×A = {(2,0),(2,1),(3,0),(3,1),(4,0),(4,1)};

以上A×B和B×A的结果就可以叫做两个集合相乘的‘笛卡尔积’。
从以上的数据分析我们可以得出以下两点结论:
1,两个集合相乘,不满足交换率,既 A×B ≠ B×A;
2,A集合和B集合相乘,包含了集合A中元素和集合B中元素相结合的所有的可能性,即两个集合相乘得到的新集合的元素个数是 A集合的元素个数 × B集合的元素个数。

交叉连接: SELECT * from 表1 JOIN 表2;

交叉连接实际上是将两个表进行笛卡尔积运算,结果表是由第一个表的每一行与第二个表的每一行拼接后形成的表,称为‘笛卡尔积表’,结果表的行数等于两个表的行数之积。

如果两张表的数据量都比较大的话,那样就会占用很大的内存空间这显然是不合理的。所以,我们在进行表连接查询的时候一般都会使用JOIN xxx ON xxx的语法,ON语句的执行是在JOIN语句之前的,也就是说两张表数据行之间进行匹配的时候,会先判断数据行是否符合ON语句后面的条件,再决定是否JOIN。

因此,有一个显而易见的SQL优化的方案是,当两张表的数据量比较大,又需要连接查询时,应该使用 FROM table1 JOIN table2 ON xxx的语法,避免使用 FROM table1,table2 WHERE xxx 的语法,因为后者会在内存中先生成一张数据量比较大的笛卡尔积表,增加了内存的开销。

6. 关系模式规范化

第一范式(1NF):字段具有原子性,不可再分。所有关系型数据库系统都满足第一范式。数据库表中的字段都是单一属性的,不可再分。例如,姓名字段,其中姓和名必须作为一个整体,无法区分哪部分是姓,哪部分是名,如果要区分出姓和名,必须设计成两个独立的字段。

第二范式(2NF):是在(1NF)的基础上建立起来的,即满足(2NF)必须先满足(1NF)。要求数据库表中的每个实例或行必须可以配唯一地区分。通常需要为表中加上一个列,以存储各个实例的唯一标识。这个属性列配称为主关键字或主键。(2NF)要求实体的属性完全依赖于主关键字。所谓完全依赖是指不能存在仅依赖主关键字一部分的属性,如果存在,那么这个属性和主关键字的这一部分应该分离出来形成一个新的实体,新实体于原实体之间是一对多的关系,为实现区分通常需要为表加上一个列,以存储各个实例的唯一标识。简而言之,第二范式就是非主属性非部分依赖于主关键字。
也就是说,函数依赖关系中的任意一个主属性被删除后非主属性都应该无法再被确定,否则不满足第二范式

第三范式(3NF): 满足(3NF)必须先满足(2NF)。简而言之,(3NF)要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。

就是关系模式中不应该再存在传递函数依赖,就是说非主属性需要有码直接确定,
也就是说一个非主属性既可以由主属性确定又可以由一个非主属性唯一确定时,不满足第三范式

第三范式的特征:

1,每一列只有一个值

2,每一行都能区分

3,每一个表都不包含其他表已经包含的非主关键字信息。

例如,帖子表中只能出现发帖人的id,而不能出现发帖人的id,还同时出现发帖人的姓名,否则,只要出现同一发帖人id的所有记录,他们中的姓名部分都必须严格保持一致,这就是数据冗余;

修正第三范式:
主属性对于码也不能产生部分依赖或者函数依赖,就是说每一张表都只允许存在一个候选键。

关于范式依旧是难以理解,这里从网上找了一篇实例,讲的非常清楚
范式实例

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

与光同程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值