首先需要说明,连接的具体结果和数据库语言是有关系的,不同的数据库语言遵守的规则有细微的差别,不能一概而论,我这里是mysql。
首先,贴出两张表。
成绩表:score
学生表:student
1、left join 在on后增加条件含左表字段
SELECT * FROM student
left join score on score.s_id=student.s_id AND score.s_name='赵雷';
结果:
可以看到,on后面的限制条件score.s_id=student.s_id AND score.s_name='赵雷'
共同控制两个表的连接。只有score.s_id=student.s_id 并且 AND score.s_name='赵雷'的数据进行了连接。
而且,在展示的时候还要保证主表数据不会缺失。
下图同理
2、left join 在on后增加条件含右表字段
SELECT * FROM student
left join score on score.s_id=student.s_id AND score.s_score is not null;
得到的表太长,没有截完
可以看到,s_score为空的数据并没有参与连接。和left join 在on后增加条件含左表字段功能一样。on后面的限制条件score.s_id=student.s_id AND score.s_score is not null共同控制两个表的连接。只有score.s_id=student.s_id 并且score.s_score is not null的数据进行了连接。
而且,在展示的时候还要保证主表数据不会缺失。
其实这个展示的不很清楚,我换另一个查询语句
可见,on后面的统统作为连接的条件,符合on后面所有条件的才连接。但是同时会保证主表(这里是左表)的完整性。
right join就省略了,因为right join和left join其实是一样的。(只是左右表的区别)
3、left join 在where后增加条件
条件中额外增加左表字段
条件中额外增加右表字段
只单单加一个相等连接条件
以上运行都会报错,说明left join后的条件一定要写在on后面,而不能写在where后面。
4、join,在where后面加条件
可以看到,where就是一个正常的筛选条件,根据where后面的所有条件来连接两个表。
5、join ,在on后面添加条件
可以看到,当是join时,条件放在where后面和on后面是一样的,因为没有保证主表数据完整这个限制。