create table a (id int, name char(1))
insert into a
select 1,'a' union all
select 2,'b' union all
select 3,'c'
create table b (id int, name char(1))
insert into b
select 1,'a' union all
select 2,'b' union all
select 3,'c'
select * from a left join b on a.id=1
--
left join 嘛, 无非是左边表为基础, 扫描右边表匹配的记录
先是左边表的第1条记录
1 a
按条件 a.id=1, 来扫描右边表的记录
对于右边表的每条记录, 显然 a.id=1 这个条件都是成立的, 所以第1条记录匹配后的结果是:
1 a 1 a
1 a 2 b
1 a 3 c
---------------------------------------------
然后再扫描第2条记录
2 b
对于条件 a.id=1, 在边表中没有与之匹配的记录, 所以右边表为NULL
因此第2条记录匹配的结果为
2 b NULL NULL
----------------------------------------------
第3条记录与第2条记录一样, 匹配的结果是
3 c NULL NULL
---------------------------------------
因此最终结果是5条记录
1 a 1 a
1 a 2 b
1 a 3 c
2 b null null
3 c null null
--
left join 嘛, 无非是左边表为基础, 扫描右边表匹配的记录
先是左边表的第1条记录
1 a
按条件 a.id=1, 来扫描右边表的记录
对于右边表的每条记录, 显然 a.id=1 这个条件都是成立的, 所以第1条记录匹配后的结果是:
1 a 1 a
1 a 2 b
1 a 3 c
---------------------------------------------
然后再扫描第2条记录
2 b
对于条件 a.id=1, 在边表中没有与之匹配的记录, 所以右边表为NULL
因此第2条记录匹配的结果为
2 b NULL NULL
----------------------------------------------
第3条记录与第2条记录一样, 匹配的结果是
3 c NULL NULL
---------------------------------------
因此最终结果是5条记录
1 a 1 a
1 a 2 b
1 a 3 c
2 b null null
3 c null null
总结:
首先,left join 的执行是有顺序的
他先用左边的第一条记录来右边的进行比较,找出符合条件的(如果没有符合条件的,则用左边的作为查询结果的左半部分,右边用空null来填充),依次执行左边的每一条记录,直到最后一条用,将所有结果拼在一起
注意:左连接结果的行数最少为左表的行数
其次,在加如了where条件后,where不是连接查询语句的一部分,他是在做完连接查询以后在做的过滤,因此他可以将做完左外连接的数据再过滤
他先用左边的第一条记录来右边的进行比较,找出符合条件的(如果没有符合条件的,则用左边的作为查询结果的左半部分,右边用空null来填充),依次执行左边的每一条记录,直到最后一条用,将所有结果拼在一起
注意:左连接结果的行数最少为左表的行数
其次,在加如了where条件后,where不是连接查询语句的一部分,他是在做完连接查询以后在做的过滤,因此他可以将做完左外连接的数据再过滤