多表的 inner join与left join;

当前情况

目前有三个表,关系如下:
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,不然仍然不显示主表的该条数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值