多表连接查询
数据存储在多表的原因:
- 为什么不用一个表存储数据,非要使用多个表呢,下面通过例子介绍其原因。
- 假设有如下结构的关系。
当一名学生考完某课后,其信息就会在student表中以一条记录的形式存储。下面列出student关系所存在的问题。
(1)数据冗余。某个学生可能考了多门课程,有多个成绩,所以该生的“学号”、“姓名”“性别”和“来源地”就会有多次重复,请参考表10.1所示。
(2)更新异常。由于数据冗余,如果要更改“张三”的来源地为“福建省”时,必须要更改多条记录,一旦遗忘了更改某条记录,“张三”就会有两个不同的来源地。
(3)插入异常。如果某学生没有考任何考试,则无法将这名学生的学号、姓名、性别、来源地等信息插入到表内。因为,student中学号和课号组成了一个码,码值的一部分为空的记录,是不能被插入到表中的。
(4)删除异常。如果一名学生的考试成绩全部作废,需要删除,则其正常信息也会随之被删除。这样就丢掉了一部分有用的信息。
由于上述原因,数据就被放到了不同的多个表中。
范式:
- 目前,范式分为第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、BCNF范式、第四范式(4NF)、第五范式(5NF)和第六范式(6NF)等范式。这些范式其实是不同程度的规则,它们之间有着层次关系,第一范式是最底层的规则,第二范式是满足第一范式的基础上又多了一些要求的规则,以此类推。
- 一般来说,设计的数据库只要满足第三范式就可以了,所以下面只介绍1NF、2NF和3NF。
❀第一范式(1NF)
第一范式是关系数据库的底线,要想成为关系数据库则必须要满足第一范式。第一范式的内容为,记录的每一个分量都是不可分割的基本数据项。
❀第二范式(2NF)
要满足第二范式,首先必须满足第一范式,即满足第一范式是满足第二范式的前提条件,其次,第二范式增加的要求是,每一个非主属性要完全函数依赖于码。
可以用分解的方法将一个不满足2NF的表,分解为满足2NF的多个表。
❀第三范式(3NF)
第三范式是在满足第二范式的基础上,还增加了每一个非主属性都不传递依赖于码的要求。
连接查询:
- 连接两表的方法
- 无连接规则连接
无连接规则连接后得到的结果是将所有表中的每一行都互相连接,即结果为笛卡尔积。
语法格式:
SELECT *(或字段列表) FROM 表名1,表名2,...; #得到的表数据总数为每个表的数据量相乘 #如:表1数据数为N,表2数据数为M,则连接后的表的数据数为N*M
- 有链接规则连接
有连接规则连接,其实就是在无连接规则的基础上,加上WHERE
子句指定连接规则的连接方法。
语法格式:
- 无连接规则连接