**
十一、表与表之间的关系
**
11.1为什么拆表
拆分表的目的:为了解决数据冗余问题,可以减少重复数据的存储,表的结构也更加清晰了。
拆分之后:
在某些业务下,需要查询多个表,速度降低了。
空间 时间 的博弈
11.2表与表之间的关系
11.2.1一对一
人和身份证的关系:
注意:
(1)一对一不存在数据冗余问题 可以不拆分表吗? 可以
(2)什么场景需要拆分:用户信息+身份证+……》表中的字段太多了
11.2.2一对多
最最常见的关系:
学生和成绩的关系:一个学生有多个成绩
部门和员工的关系:一个部门有多个员工
这种关系怎么去建立,怎么去表达
在“多”的一方,存储“一”的主键ID
在成绩表中存储用户的ID
在员工表中存储部门的ID
建表:使用主外键实现
11.2.3多对多
常见案例:
老师与学生的关系:一个老师对应多个学生,多个学生对应多位老师
用户与商品的关系
用户和权限的关系
这种关系怎么去建立,怎么去表达:借助第三张表
用户和商品:订单(用户ID)什么时候买了什么商品(商品ID)
ID 用户ID 商品ID
1001 1 6
1002 1 5
1003 2 6
用户和权限的关系,谁有什么权限
- ID 用户ID 权限ID 1001 1 1001 1002 1 1003 1003 2 1003
11.3多表查询
多表查询有如下几种:
(1)合并结果集:union,union all
(2)连接查询(列的合并):内连接
外连接:左外连接 右外连接
全连接
自然连接
(3)子查询
11.4合并结果集(行连接)
将两个结果集(表)合并在一块
要求:2个结果的列数(数据类型)应该要相同
11.4.1 union all
将2个表的结果直接放到一起 不做任何处理
select * from t1
union all
select * from t2;
11.4.2union
将2个表的结果直接放在一起 相同的数据只留下一个(去重)
select * from t1
union
select * from t2;
11.5连接查询(列连接)
问题:学生表有10条数据,成绩表有10条数据
连接之后有多少条数据(笛卡尔积):10*10