多表设计-关联查询
为什么要多表关联
数据冗余--拆分
数据库设计范式
- 为了建立冗余较小、结构合理的数据库,设计数据库时必须遵循一定的 规则。在关系型数据库中这种规则就称为范式。范式是符合某一种设计 要求的总结。
- 目前关系数据库有5种范式:第一范式(1NF)、第二范式(2NF)、第 三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范 式(5NF,又称完美范式)。
- 满足最低要求的范式是第一范式(1NF)。在第一范式的基础上进一步 满足更多规范要求的称为第二范式(2NF),其余范式以次类推。一般 来说,数据库只需满足第三范式(3NF)就行了
数据库设计范式
1.第一范式(确保每列保持原子性) 第一范式是最基本的范式。如果数据库表中的所有字段值都是不可分解的原子值,就 说明该 数据库表满足了第一范式
2. 第二范式就是要有主键,要求其他字段都依赖于主键。
- 没有主键就没有唯一性,没有唯一性在集合中就定位不到这行记录,所以要主键。
- 其他字段为什么要依赖于主键?因为不依赖于主键,就找不到他们。更重要的是,其 他字段组成的这行记录和主键表示的是同一个东西,而主键是唯一的,它们只需要依 赖于主键,也就成了唯一的
3.第三范式就是要消除传递依赖,方便理解,可以看做是“消除冗余”
外键:引用另外一个数据表的某条记录。
外键列类型与主键列类型保持一致 数据表之间的关联/引用关系是依靠具体的主键(primary key)和外键(foreign key)建立起来 的。
create table score( cid int not null auto_increment primary key,
score int,
sid int,
CONSTRAINT 约束名 foreign key(sid) references student(sid) );
约束名规则:
例:
FK_ForeignTable_PrimaryTable_On_ForeignColumn
- 当主表中没有对应的记录时,不能将记录添加到从表
- 不能更改主表中的值而导致从表中的记录孤立
- 从表存在与主表对应的记录,不能从主表中删除该行
- 删除主表前,先删从表
关联查询
含义:又称多表查询,当查询的字段来自于多个表时,就会用到连接查询
笛卡尔乘积现象:表1有m行,表2有n行,结果=m*n
发生原因:没有有效的连接条件
如何避免:添加有效的连接条件
按功能分类: 内连接 外连接 左外连接 右外连接
子查询
含义:出现在其他语句中的select语句,称为子查询或内查询;
外部的查询语句,称为主查询或 外查询.
分类:
按子查询出现的位置:
- select后面:支持标量子查询
- from后面:支持表子查询
- where:支持标量子查询,列子查询
按功能、结果集的行列数不同:
- 标量子查询(结果集只有一行一列)
- 列子查询(结果集只有一列多行)
- 表子查询(结果集一般为多行多列