首先 ,我们有两张表
表1,学生表
name | age | classid | |
---|---|---|---|
1 | 张三 | 18 | 1 |
2 | 李四 | 17 | 2 |
3 | 王五 | 18 | 2 |
4 | 赵本六 | 17 | 3 |
5 | 洪七公 | 18 | 3 |
6 | 王八 | 17 | 4 |
表2,班级表
id | class_name | |
---|---|---|
1 | 1 | 1班 |
2 | 2 | 20班 |
3 | 2 | 21班 |
4 | 3 | 2班 |
首先,我们先
select * from
temp.test_student a
left join
temp.test_class b
on
a.classid=b.id
and a.name= '张三'
查看结果
name | age | classid | id | class_name | |
---|---|---|---|---|---|
1 | 张三 | 18 | 1 | 1 | 1班 |
2 | 李四 | 17 | 2 | NULL | NULL |
3 | 王五 | 18 | 2 | NULL | NULL |
4 | 赵本六 | 17 | 3 | NULL | NULL |
5 | 洪七公 | 18 | 3 | NULL | NULL |
6 | 王八 | 17 | 4 | NULL | NULL |
发现 on 条件并没有对左表进行过滤,但是结果也没有发散,如果没有a.name='张三' 这个条件,结果肯定会发散,因为class id为2的有2条。 但是并没有发散,on条件限制于左表时,不会影响左表,而是对关联后的结果筛掉左表条件对应右表的值。
继续
select * from temp.test_student a left join temp.test_class b
on a.classid=b.id
and b.id= 1
查看结果
name | age | classid | id | class_name | |
---|---|---|---|---|---|
1 | 张三 | 18 | 1 | 1 | 1班 |
2 | 李四 | 17 | 2 | NULL | NULL |
3 | 王五 | 18 | 2 | NULL | NULL |
4 | 赵本六 | 17 | 3 | NULL | NULL |
5 | 洪七公 | 18 | 3 | NULL | NULL |
6 | 王八 | 17 | 4 | NULL | NULL |
on 条件作用于右表,会先对右表数据进行过滤,再进行关联
所以,如果要限制左表数据 ,必须写到where 条件中