InnerJoin 和 LeftJoin
作为一个前端开发人员,今天突然对数据库的表的关联产生的兴趣,网上搜了一下。
发现下面的图:
关于 on 和 where
数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户。
在使用 left join 时,on 和 where 条件的区别如下:
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 |