天天看點

多表的 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(,);
insert into student  values(,'張三');
insert into class  values(,'高數',);
insert into address  values(,'一号樓');
           

如果要查詢出相關的資訊,本身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(,'高數',);
insert into address  values(,'二号樓');
           

若使用原來的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,不然仍然不顯示主表的該條資料。