数据库(二)——外键约束、一对一、一对多、多对多
一、表与表之间的关系和外键约束
1、表与表之间为什么要存在关系
在讲外键以及表之间的关系前,先讲为什么要存在关系:
2、表间关系(一对一)
举个例子,在中国,按照法律来讲,每一位男性只能拥有一位妻子,所以这种就是一对一的关系。现在设置两张表,一张是男性,一张是女性,两张表有 id 和姓名,这时,如果要设置外键,就在某张表中设置多一个字段,这个字段专门对应另外一张表中的字段(一般是主键):
上图中,可以看到妻子表设置了 mid 这个字段,对应丈夫表的 mid,且给妻子的 mid 字段设置外键,关联丈夫表的主键。
3、表间关系(一对多)
举例子:比如一个部门对应多个员工,这种情况就是一对多关系。
注意:
A. 一般设置外键是主表的主键对应从表的外键,主(一) 从(多)。
B. 从表的外键的数据类型以及长度,必须与主表的主键的数据类型以及长度一致。
C. 设置外键关联之后,必须先增加主表的数据,再增加从表的数据。
D. 设置外键关联之后,删除数据先删除从表数据,再删除主表的数据。
4、表间关系(多对多)
实质上并没有设置多对多的关键字,而是通过第三张表(中间表),第三张表分别对两张表实现一对多的关系,从而实现多对多的关系。
二、数据库三大范式
1、什么是三大范式以及分别是什么?
2、第一大范式错误例子
下图中国家与城市合在了一起,应该将它们分开:
3、第二大范式错误例子
下图中,常用于像酒店开房间的表,房间跟人应该分开来,一张表只描述一种事物。
4、第三大范式错误例子
下图中主要错误是出现了某些字段的局部依赖,正确的应该是只能与主键进行依赖
三、多表查询
1、非等值查询
在多表的情况下,如果还用以前的搜索方式,则会出现大量无效数据。
所以用以下方式的查询:
2、内连接查询
a、显式内连接
1.概念:显式内连接:使用 mysql 内连接的关键字的内连接查询:关键字 inner join
2.语法:select * from 左表 inner join 右表 on 条件
3.案例:
查询出部门的信息以及对应员工信息:
SELECT d.*,e.* FROM dept d INNER JOIN emp e ON d.did = e.did
b、隐式内连接
1.概念:隐式内连接,不使用inner join 来进行连接查询
2.语法:select * from 左表,右表 where 条件
3.案例:
查询出部门的信息以及对应员工信息
SELECT d.*,e.* FROM dept d,emp e WHERE d.did=e.did
3、外连接查询
a、左外连接查询
1.语法:select * from 左表 left join 右表 on 条件
2.案例:
部门是否有员工,都需要查询除部门的信息
SELECT d.*,e.* FROM dept d LEFT JOIN emp e ON d.did=e.did
3.匹配的规则:
以左表为基准,右表一一进行匹配,如果可以匹配,则左右表正常显示,否则左表依然显示,右表设置为空
b、右外连接查询
1.语法:select * from 左表 right join 右表 on 条件
2.案例:
查询出所有员工的信息,不管是否有部门
SELECT d.*,e.* FROM dept d RIGHT JOIN emp e ON d.did = e.did
3.匹配的规则:
以右表为基准,左表一一进行匹配,如果可以匹配,则左右表正常显示,否则右表依然显示,左表设置为空。
4、子查询
1.概念:一个完整查询语句嵌套另一个完成的查询语句,就是子查询.
2.体现:
A.把一个子查询的结果当做另一个子查询的条件来使用
B.把一个查询语句的结果当做另一个查询语句的列来使用
3.案例:
#查询出研发部门的员工信息
分析:
a.查询出员工的信息 b.查询出部门为研发部门 c.关联的条件 did
sql:
SELECT * FROM emp e WHERE e.did IN (SELECT d.did FROM dept d WHERE d.dname="研发部")
#查询出员工的信息以及部门的名称
分析:
1.查询员工的信息 2.查询出部门的名称 3.关联条件 did
sql:
SELECT e.*,(SELECT d.dname FROM dept d WHERE d.did=e.did) AS dname FROM emp e
5、多表查询练习