多表连接
0. 表间关系分析
1. 一对多的关系,在多的关系中加列。
列:dept表 emp表
id name id name dept_id
1 财务部 1 张三 1
2 人事部 2 李四 1
3 科技部 3 王五 2
4 赵六 3
2. 一对一的关系,可以在任意一方添加列保存另一方的主键为外键。
3. 多对多的关系时,添加一个第三方的表,在第三方表中分别保存两张表的主键,以此来保存两张表中数据之间的对应关系。
列:stu学生表,字段:id,name
tea老师表,字段:id,name
1 create table stu_tea( 2 stu_id int, 3 tea_id int, 4 primary key(stu_id,tea_id), 5 foreign key(stu_id) references stu(stu_id), 6 foreign key(tea_id) references tea(tea_id), 7 );
primary key(stu_id,tea_id)中的stu_id,tea_id为联合主键
4. 级联更新:主表中的主键发生更新时,从表中记录的外键数据也会跟该表更新,ON DELETE CASCADE
5. 级联删除:当主表删除了主键数据时,从表中记录外键数据也会跟着删除,ON UPDATE CASCADE
1. 连接
1. 内连接(两个表的公共部分)
列:dept表 emp表
id name id name dept_id
1 财务部 1 张三 1
2 人事部 2 李四 1
3 科技部 3 王五 2
4 赵六 3
1 select * from dept,emp where emp.dept_id=dept.id
1 select * from dept inner join emp on emp.dept_id=dept.id
2. 左连接(可以将左表中的所有记录都查出来,右边表只显示和左边相对应的数据,如果左边表中某些数据在右表中没有对应的数据,右边显示null)
1 select * from dept left join emp on emp.dept_id=dept.id
3. 右连接(可以将右表中的所有记录都查出来,左边表只显示和右边相对应的数据,如果右边表中某些数据在左表中没有对应的数据,左边显示null)
1 select * from dept right join emp on emp.dept_id=dept.id
2. 当一张表中包含了对应关系时,可以将此表分割为两张表
列:emp表
id name topId
1 张三 6
2 李四 5
3 王五 4
4 刘畅 8
5 刘鑫 9
6 嫣然 10
。。。。。。。。。
可以将此表分为两个表:emp e1(员工表)和emp e2(上级表)
显示的字段为:e1.id,e1.name,e2.id
连接条件为:e1.topId=e2.id
组合语法:
1 select e1.id,e1.name,e2.name from emp e1,emp e2 where e1.topId=e2.id