数据库范式及其几种表连接方式

96 阅读3分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

在这里插入图片描述

  • 内连接(Inner Join):仅将两个表中满足连接条件的行组合起来作为结果集

    • 自然连接:只考虑属性相同的元组对;
    • 等值连接:给定条件进行查询
    • 不允许null值
  • 外连接(Outer Join)

    • 左连接:左边表的所有数据都有显示出来,右边的表数据只显示共同有的那部分,没有对应的部分补NULL;
    • 右连接:和左连接相反;
    • 全外连接(Full Outer Join):查询出左表和右表所有数据,但是去除两表的重复数据
  • 交叉连接(Cross Join):返回两表的笛卡尔积(对于所含数据分别为m、n的表,返回m*n的结果)

    • 不允许null值
    • 应用:例如购物网页中多个销售属性的组合:蓝色+16G;蓝色+64G......
  • 注:inner join 和 cross join 的功能其实差不多,当cross不加on条件,就会产生笛卡尔积,inner join 同样

数据库的范式

  • 第一范式(1NF,Normal Form):属性不应该是可分的。举例:如果将“电话”作为一个属性(一 列),是不符合1NF的,因为电话这个属性可以分解为家庭电话和移动电话...如果将“移动电话”作 为一个属性,就符合1NF;
  • 第二范式 2NF:每个非主属性完全依赖于主属性集(候选键集); B完全依赖于A,就是说A中的所有属性唯一决定B,属性少了就不能唯一决定,属性多了则有 冗余(叫依赖不叫完全依赖)。举例:(学号,课程名)这个主属性集可以唯一决定成绩,但 是对于学生姓名这个属性,(学号,课程名)这个属性集就是冗余的,所以学生姓名不完全依 赖于(学号,课程名)这一属性集; 主属性集/候选码集:某一组属性能够唯一确定其它的属性(主键就是从候选键集中选的一个 键),而其子集不能,这样的属性组中的属性就是主属性;不在候选码集中的属性成为非主属 性; 可以通过分解来满足 2NF:将(学号,课程名,成绩)做成一张表;(学号,学生姓名)做 成另一张表,避免大量的数据冗余; 满足1NF后,要求表中的所有列,都必须依赖于主键,而不能有任何一列与主键没有关系,也 就是说一个表只描述一件事情;
  • 第三范式 3NF:在 2NF 的基础上,非主属性不传递依赖于主属性 传递依赖:如果C依赖于B,B依赖于A,那么C传递依赖于A; 3NF在2NF的基础上,消除了非主属性之间的依赖;比如一个表中,主属性有(学号),非主 属性有(姓名,院系,院长名),可以看到院长名这个非主属性依赖于院系,传递依赖于学 号。消除的办法是分解。 必须先满足第二范式(2NF),要求:表中的每一列只与主键直接相关而不是间接相关,(表 中的每一列只能依赖于主键); 冗余数据:某些同样的数据多次出现(如学生姓名); 修改异常:修改了一个记录中的信息,另一个记录中相同的信息却没有修改; 删除异常:删除一个信息,那么也会丢失其它信息(删除一个课程,丢失了一个学生的信息); 插入异常:无法插入(插入一个还没有课程信息的学生)