有的时候由于业务需求,我们必须要用到left join或者right join。那么你对left join或者right join产生过疑惑么?
这里就以left join为例
对于left join,我们印象最深的就是左表的数据会全部显示,右边的数据满足条件会显示。那么这句话具体的意思是啥呢?
假设有以下两张表:
ID | NAME |
1 | J |
2 | K |
3 | L |
ID | AGE |
2 | 10 |
3 | 20 |
4 | 30 |
SELECT * FROM A LEFT JOIN B ON A.id = B.id
结果是:
A.ID | A.NAME | B.ID | B.AGE |
1 | J | NULL | NULL |
2 | K | 2 | 10 |
3 | L | 3 | 20 |
这个结果很容易理解,以左表A为基础,ON的条件是用来筛选右表B的。
SELECT * FROM A LEFT JOIN B ON A.ID = B.ID AND A.ID = 2
结果是:
A.ID | A.NAME | B.ID | B.AGE |
1 | J | NULL | NULL |
2 | K | 2 | 10 |
3 | L | NULL | NULL |
为什么第三条数据里面表B的部分也是NULL?首先,对于LEFT JOIN下没有WHERE条件的时候,左表A的所有数据肯定是可以完全展示的,因为就如如同上面说的,ON的条件是来筛选B表数据的,所以上面结果表中左边这块的A表部分数据是很好理解的。问题就在第第三条数据中B表部分为什么都是NULL,因为ON后面的条件中有一个A.ID=2,第三条数据A.ID=3,不符合条件,所以第三条数据中B部分为NULL。
SELECT * FROM A LEFT JOIN B ON A.ID = B.ID WHERE A.ID = 2
结果是:
A.ID | A.NAME | B.ID | B.AGE |
2 | K | 2 | 10 |
对于这个结果,相信经历了前两个sql的你,应该可以理解了吧。ON的条件是来筛选B表数据的,WHERE的条件是能影响左右表的.
最后,给各位一个忠告,如果不是业务需要,能用inner join处理的,就别用left join或者right join,因为inner join查询效率上面比它们高。