知识点 数据库

目录

1.关于范式:

(1)第一范式:表头不可分割  

(2)第二范式:非主属性完全依赖于码

(3)第三范式: 3NF在2NF的基础之上,消除了非主属性对于码的传递函数依赖

(4)BCNF: 3NF 的基础上消除主属性对于码的部分与传递函数依赖

2. 关于各种连接

(1) INNER JOIN (内连接) 

(2) LEFT JOIN (左连接) 

(3) RIGHT JOIN(右连接) 

 (4) OUTER JOIN,FULL JOIN (外连接、全连接) 

(5) LEFT JOIN EXCLUDING INNER JOIN(左连接不包含内连接) 

(6) RIGHT JOIN EXCLUDING INNER JOIN(右连接不包含内连接) 

(7) OUTER JOIN EXCLUDING INNER JOIN(外连接不包含内连接) 


1.关于范式:

(1)第一范式:表头不可分割  

第一范式是最基本要求

满足前:

preview

满足后:

preview

(2)第二范式:非主属性完全依赖于码

           也就是说去掉码中的任一属性后,任何一个非主属性都无法通过码得出

 

某一非主属性
学号和课程 分数

            某一非主属性满足了完全依赖于码,若想达到满足第二范式,则全部的非主属性均要满足

           也就是说在没达到第二范式前,面临的问题是非主属性部分依赖于码,即去掉码中的某一属性,某一非主属性依然可以通               过码得到获得

某一非主属性
学号和课程 姓名

           姓名可以不由课程决定,所以说存在非主属性部分依赖于码,只要存在就不满足第二范式,

            事实上我们知道姓名仅由学号决定

修改前:

preview

修改后: 

 

(3)第三范式: 3NF在2NF的基础之上,消除了非主属性对于码的传递函数依赖

修改前:

学号可得系名,系名可得系主任,因此由学号可得系主任,存在非主属性对于码的传递函数依赖

修改后:

preview

(4)BCNF: 3NF 的基础上消除主属性对于码的部分与传递函数依赖

例子: 

  1. 某公司有若干个仓库;
  2. 每个仓库只能有一名管理员,一名管理员只能在一个仓库中工作;
  3. 一个仓库中可以存放多种物品,一种物品也可以存放在不同的仓库中。每种物品在每个仓库中都有对应的数量。

那么关系模式 仓库(仓库名,管理员,物品名,数量) 属于哪一级范式?

答:已知函数依赖集:仓库名 → 管理员,管理员 → 仓库名,(仓库名,物品名)→ 数量
码:(管理员,物品名),(仓库名,物品名)
主属性:仓库名、管理员、物品名
非主属性:数量
∵ 不存在非主属性对码的部分函数依赖和传递函数依赖。∴ 此关系模式属于3NF。

 

存在着主属性对于码的部分函数依赖与传递函数依赖。(在此例中就是存在主属性【仓库名】对于码【(管理员,物品名)】的部分函数依赖。

解决办法就是要在 3NF 的基础上消除主属性对于码的部分与传递函数依赖。

修改前:

主属性 仓库名  由 码  (管理员,物品名) 决定     主属性存在对码的部分依赖        事实上 仓库名仅由管理员决定

主属性  管理员 由 码  (仓库名,物品名) 决定      主属性存在对码的部分依赖       事实上 管理员仅由仓库名决定

主属性  物品名 由 码  (仓库名,物品名) 决定      主属性存在对码的部分依赖       事实上 物品名仅由仓库名决定

出现以上问题的原因在于

非主属性 数量 完全依赖于   (仓库名,物品名)      因此,码必定得是 (仓库名,物品名) 

那么码为什么还有一个(管理员,物品名呢)  ,原因是 其他不用管,你数量这个东西,除了(仓库名,物品名)能得到,也只能是通过(管理员,物品名)得到了,因为管理员和仓库名是1对1的嘛 所以码只能是它俩

新问题: 这里非主属性 数量 对于码 (仓库名,物品名)  不存在传递依赖

                         非主属性 数量 对于码 (管理员,物品名)  是否存在传递依赖?

若存在,则该题说满足第三范式就是不对的。 若不存在,那么这里的传递依赖:是主属性对码存在吗?

修改后:

仓库(仓库名,管理员)
库存(仓库名,物品名,数量)

即 表1    仓库名是码   非主属性是管理员   或者 码是管理员,非主属性是仓库      

    表2     仓库名和物品名是码,非主属性是数量


参考链接:https://www.zhihu.com/question/24696366/answer/29189700

 

2. 关于各种连接

                      

                   表A                                                                                             表B

            1,2,3,4,5,6,7 10                                                                       1,2,3,6,7,8,9,11

(1) INNER JOIN (内连接) 

内连接是一种一一映射关系,就是两张表都有的才能显示出来 

A B 共有的显示,其余不显示  显示的为:1,2,3,6,7

代码如下: 其他代码类似 

SELECT  A.PK AS A_PK,A.Value AS A_Value,B.PK AS B_PK,B.Value AS B_Value
FROM table_a A
INNER JOIN table_b B
ON A.PK = B.PK;

(2) LEFT JOIN (左连接) 

左连接是左边表的所有数据都有显示出来,右边的表数据只显示共同有的那部分,没有对应的部分只能补空显示

A中都显示    1,2,3,4,5,6,7 10      B中 只显示共有的 1,2,3,6,7

(3) RIGHT JOIN(右连接) 

右连接是右边表的所有数据都有显示出来,左边的表数据只显示共同有的那部分,没有对应的部分只能补空显示

B中都显示   1,2,3,6,7,8,9,11     A中 只显示共有的 1,2,3,6,7

 (4) OUTER JOIN,FULL JOIN (外连接、全连接) 

查询出左表和右表所有数据,但是去除两表的重复数据,意思是重复数据只计算一次,不叠加

B中都显示   1,2,3,6,7,8,9,11     A中都显示 1,2,3,4,5,6,7 10  

但是显示的时候,是按序号分别对应的,能对应上的必定是共有的,如果A有B没有,那么就B空,否则A空

代码: MySql 可执行版,模拟FULL JOIN

SELECT  A.PK AS A_PK,A.Value AS A_Value,B.PK AS B_PK,B.Value AS B_Value
FROM table_a A
LEFT JOIN  table_b B
ON A.PK = B.PK
 UNION
SELECT  A.PK AS A_PK,A.Value AS A_Value,B.PK AS B_PK,B.Value AS B_Value
FROM table_a A
RIGHT JOIN  table_b B
ON A.PK = B.PK;

(5) LEFT JOIN EXCLUDING INNER JOIN(左连接不包含内连接) 

这个查询是只查询左边表有的数据,共同有的也不查出来 

A中仅显示不公有的 4,5,10   B中显示为空   

这里写图片描述

(6) RIGHT JOIN EXCLUDING INNER JOIN(右连接不包含内连接) 

这个查询是只查询右边表有的数据,共同有的也不查出来 

A中显示为空       B中显示   8,9,11  

 

(7) OUTER JOIN EXCLUDING INNER JOIN(外连接不包含内连接) 

意思就是查询左右表各自拥有的那部分数据  

A显示4,5,10     B中显示   8,9,11  

 代码:mysql不支持full join,只能通过下面代码模拟实现

SELECT  A.PK AS A_PK, A.Value AS A_Value, B.PK AS B_PK,
B.Value AS B_Value
 FROM table_a A
 LEFT JOIN table_b B
ON A.PK = B.PK
 WHERE B.PK IS NULL
UNION ALL
 SELECT *
 FROM table_a A
 RIGHT JOIN table_b B
 ON A.PK = B.PK
  WHERE A.PK IS NULL;

参考链接:https://blog.csdn.net/u014204541/article/details/79739980

版权声明:本文为mcc_2016原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/mcc_2016/article/details/97387504