InnerJoin 和 LeftJoin

1,093 阅读1分钟

InnerJoin 和 LeftJoin

作为一个前端开发人员,今天突然对数据库的表的关联产生的兴趣,网上搜了一下。

发现下面的图:

关于 on 和 where

数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户。

在使用 left join 时,onwhere 条件的区别如下:

1、on 条件是在生成临时表时使用的条件,它不管 on 中的条件是否为真,都会返回左边表中的记录。

2、where 条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有 left join 的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。

注: 在关联表中,如果使用where就会抛错。

案例:

表TableA:

sid f1 f2
1 A11 A12
2 A21 A22
3 A31 A32

表TableB:

sid f1 f2 A_sid
1 B11 B12 1
2 B12 B22 1
3 B31 B32 2

执行语句一: inner join

select a.sid as a_sid, b.sid as b_sid, a.f1 as a_f1, b.f2 as b_f2 from TableA a inner join TableB b on a.sid = b.A_sid

a_sid b_sid a_f1 b_f2
1 1 A11 B12
1 2 A11 B22
2 3 A21 B32

执行语句二:left join

select a.sid as a_sid, b.sid as b_sid, a.f1 as a_f1, b.f2 as b_f2 from TableA a left join TableB b on a.sid = b.A_sid

a_sid b_sid a_f1 b_f2
1 1 A11 B12
2 3 A21 B32
3 null null null

执行语句三:right join

select a.sid as a_sid, b.sid as b_sid, a.f1 as a_f1, b.f2 as b_f2 from TableA a right join TableB b on a.sid = b.A_sid

a_sid b_sid a_f1 b_f2
1 1 A11 B12
1 2 A11 B22
2 3 A31 B32