1.为什么要拆表
拆分表的目的:
为了解决数据冗余问题,可以减少重复数据的存储,表的结构也更加清晰
拆分之后:
在某些业务下,需要查询多个表,速度减低了。
空间 和 时间
2.表与表之间的关系
2.1 一对一
人与身份证的关系:
注意:
(1) 一对一不存在数据容易问题??可以不拆分表吗?可以。
(2) 什么场景需要拆分
用户信息 + 身份证 + …-》表中的字段太多了。
2.2 一对多
最常见的关系:
学生和成绩的关系:1个学生有多个成绩。
部门和员工的关系:1个部门有多个员工。
这种关系怎么去建立,怎么去表达
在“多”的一方,存储“一”的主键ID。
在成绩表中存储用户的ID。
在员工表中存储部门的ID
建表:使用主外键实现。
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 | 1001 |
3.多表查询
多表查询查询有如下几种
(1) 合并结果集:union,union all
(2) 连接查询(列的合并):
内连接:
外连接:
左外链接
右外连接
全连接
自然连接
(3) 子查询
4.合并结果集(行连接)
2个结果集(表)合并到一起。
要求:2个结果集的列数(数据类型)应该要相同
4.1 union all(全部)
将2个表的结果直接放在一起,不作任何处理。
select * from t1
union all
select * from t2;
4.2 union
将2个表的结果直接放在一起。相同的数据只留下一个(去重)
select * from t1
union
select * from t2;