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

论坛 期权论坛 编程之家     
选择匿名的用户   2021-6-2 20:49   2349   0

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

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP