SQL语句 左连接 on对左表进行约束,对右表的影响

今天在写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后这个条件进行了处理,抑或是其他情况?这个问题我百思不得其解,若有知道的大佬还请留言告知我一声。

猜你喜欢

转载自blog.csdn.net/gfuasg/article/details/82591974
今日推荐