今天在写sql语句中的左连接时,发现一个有意思的问题,一般我们写左连接时,格式如下:
SELECT 表1.column1, 表2.column2
FROM 表1
LEFT JOIN 表2
ON 表1.common_field = 表2.common_field [and 表2.field= ...];
其中可能对右表做一些约束,右表中未匹配到的值会赋为null,而左表都会完整返回,因此今天写sql语句时,我试了下对左表进行约束,即on后有左表.field = 某值,比如有如下两表:
sclass表:
sc_id s_id sc_name grade #1 0001 math 50 #1 0002 math 60 #1 0003 math 70 #2 0001 chinese 80 #2 0002 chinese 90 #2 0003 chinese 100
student表:
s_id s_name s_sex 0001 mu g 0002 kun g 0003 mei b
执行如下sql语句:
SELECT * FROM sclass left join student
on sclass.s_id = student.s_id and sclass.s_id = '0001';
在我的猜想中既然对on对左表没有影响,那么约束条件将会被忽略,而不会进行筛选,但是最后返回的结果却是这样的:

然后我很疑惑,难道是因为约束条件是两个表公共字段的原因?(貌似不太可能),然后我试了下对左表独有字段约束:
SELECT * FROM sclass left join student
on sclass.s_id = student.s_id and sclass.sc_name= 'math';
结果如下:

最后的结果仍是对右表进行了筛选。表明在左连接中,即使是对左表进行约束,左表也不会受到影响,而右表仍然会是不满足匹配条件的进行置空值处理。
只不过这种情况的出现,到底是on对左表进行了筛选,然后和右表进行连接,还是说最后两表连接生成了临时表,再根据on后这个条件进行了处理,抑或是其他情况?这个问题我百思不得其解,若有知道的大佬还请留言告知我一声。 |