当前情况
目前有三个表,关系如下:
1. sc表,有 student_id, class_id
2. student表,有student_id,student_name,
3. class表,有class_id,class_name,class_address_id,
4. address表,有address_id,address_name
相同名字的字段相对应。
假设分别有如下数据:
insert into sc values(1,2);
insert into student values(1,'张三');
insert into class values(2,'高数',3);
insert into address values(3,'一号楼');
如果要查询出相关的信息,本身SQL应该如下:
select s.student_name,c.class_name,a.address_name
from SC sc
inner join student s on s.student_id=sc.student_id
inner join class c on sc.class_id=c.class_id
inner join adderss a on a.address_id =c.address_id
查询出的信息如下:
张三,高数,一号楼 。
业务要求
假设现在业务情况如下: 课程会删除,地址也会删除,但要求仍然显示有sc的记录。操作如下:
delete from class;
delete from address;
insert into class values(3,'高数',5);
insert into address values(5,'二号楼');
若使用原来的sql,则无法查询到sc的记录。现在将sql改变从如下:
select s.student_name,c.class_name,a.address_name
from SC sc
inner join student s on s.student_id=sc.student_id
/* 原来都是inner,现在将class表的 改成了left*/
left join class c on sc.class_id=c.class_id
inner join adderss a on a.address_id =c.address_id
但是仍然无法查询出数据。因为: sc的数据是(1,2); sc的2是class_id,关联class表中class_id为2的数据;但是class表中现在无id为2的数据,但因为与class的关联使用了left,其实不影响。如果sql为:
select s.student_name,c.class_name
from SC sc
inner join student s on s.student_id=sc.student_id
/* 原来都是inner,现在将class表的 改成了left*/
left join class c on sc.class_id=c.class_id
其实仍然能查询出数据,为:张三、(null)
但因为class与address的关联仍然为inner join,所以无法显示。将sql改为如下:
select s.student_name,c.class_name,a.address_name
from SC sc
inner join student s on s.student_id=sc.student_id
/* 原来都是inner,现在将class表和address表的inner 改成了left*/
left join class c on sc.class_id=c.class_id
left join adderss a on c.address_id=a.address_id
则能查询数据,为:张三、(null)、(null)
总结
一表为主表,一表为子表。有时虽然字表的数据已经更改了,但要求仍然显示主表的数据。此时使用left join即可。但若 子表还关联了子子表,则子表与子子表的关联也需要使用left join,不然仍然不显示主表的该条数据。