为什么要使用多表?
因为需要存储不同的信息
为什么需要多表关联?
因为设计多张表的时候,减少了数据冗余,但是数据与数据之间有一定的关系,这时就需要多表关联。
为了建立冗余小、结构合理的数据库,设计数据库时需要遵循一定的规则。在关系型数据库中这种规则被称为范式。范式是符合某一种设计要求的总结。
目前关系型数据库有5种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯科德范式(BCNF)、第四范式(4NF)、第五范式(5NF)。
第一范式是最基本的范式。意思就是说表中的每列都不可再分,如:
| 编号 | 姓名 | 联系方式 |
|---|---|---|
| 001 | 张三 | 15199996666 |
| 002 | 王五 | 2766669999 |
| 003 | 李四 | 1666666666 |
三个人填的都是联系方式,问题来了:你知道他们填的是手机号?QQ号?又或者是微信号?确定起来非常麻烦。因此需要确保每列的原子性。可以将联系方式改为具体的手机号或者其他的。
意思就是:不同的表只存储一类信息,然后通过主键和外键关联。
如一个订单表:
| 订单编号 | 数量 | 商品编号 | 商品名称 | 单价 | 订单金额 |
|---|---|---|---|---|---|
| 0001 | 2 | 0202 | 手机 | 2000 | 4000 |
在这里知道商品编号后就可以知道商品名称和单价
| 订单编号 | 数量 | 订单金额 | 商品编号 |
|---|---|---|---|
| 0001 | 2 | 4000 | 0202 |
| 商品编号 | 商品名称 | 单价 |
|---|---|---|
| 0202 | 手机 | 2000 |
一般来说,数据库只需要满足第三范式就可以了。
一个表的外键是另一个表的主键,外键可以重复,也可以是空值。外键用于与另一张表的关联。是能确定另一张表记录的字段,用于保持数据的一致性。如:A表中的一个字段,是B表的主键,那么这个字段就是A表的一个外键。注意:一张表的主键只有一个,外键可以有多个。
在多表关联时,有两种关联方式:
弱关联:表与表之间没有任何约束关系的
强关联:有外键约束
/*创建表时添加外键*/
CREATE TABLE score (
cid INT PRIMARY KEY AUTO_INCREMENT ,
score INT,
sid INT,
CONSTRAINT FK_students_score_id FOREIGN KEY (sid) REFERENCES students(id)
)
/*添加外键语句:
CONSTRAINT 约束名 foreign key(本表的外键名) references 外表(外表中的主键)
约束名规则:FK_外表_主表_外表的主键列
注意:外表称为被参照表,
主表称为参照表。
*/
/*表已经创建时添加外键*/
-- 添加列
ALTER TABLE score ADD COLUMN sid INT
-- 添加外键约束
ALTER TABLE score ADD CONSTRAINT FK_students_score_id FOREIGN KEY (sid) REFERENCES students(id)
当参照表中没有记录时不能将记录添加到参照表中
当参照表中有对应记录时,不能在被参照表中删除
删除被参照表之前先删除参照表
含义:又称多表查询,当查询的字段来自于多个表时,就会用到连接查询。
笛卡尔乘积现象:表1有m行,表2有n行,结果=m*n
发生原因:没有有效的连接条件。只需要添加有效连接条件。
分为等值连接、非等值连接、自然连接
就是把满足条件的两张表中的交集数据查询出来
语法:Select 结果 from 表1,表2 where 表1.column1 = 表2.column2
外左连接(left join):
select 结果 from 表1 left join 表2 on 表1.column1 = 表2.column2
外有链接(right join):
select 结果 from 表1 right join 表2 on 表1.column1 = 表2.column2