on和where的区别
1、where条件是在临时表生成好后,再对临时表进行过滤的条件;
2、on条件是在生成临时表前使用的条件,它会先做条件过滤,在做表联结。
示例表
后文的讲解都是基于下面示例表a和示例表b来进行的(左表a,右表b)

where使用
在联表语句中使用where是先联表查询生成临时表,在对临时表执行where条件过滤。
select * from a left join b on a.id=b.id where a.name="a11";
left join中使用on
对左表条件执行on:先对左表进行过滤;如果在条件中的记录正常联表;如果不在条件中的则展示左表,右表内容都是null。下面三个查询语句依次对应下图的三个结果
select * from a left join b on a.id=b.id and a.id=1;
select * from a left join b on a.id=b.id and a.id=2;
select * from a left join b on a.id=b.id and a.id=3;

对右表条件执行on:先对右表进行过滤;如果在条件中的记录正常联表;如果不在条件中的则展示左表,右表内容都是null。下面三个查询语句依次对应下图的三个结果
select * from a left join b on a.id=b.id and b.id=1;
select * from a left join b on a.id=b.id and b.id=2;
select * from a left join b on a.id=b.id and b.id=3;

right join中使用on
对左表条件执行on:先对左表进行过滤;如果在条件中的记录正常联表;如果不在条件中的则展示右表,左表内容都是null。下面三个查询语句依次对应下图的三个结果
select * from a right join b on a.id=b.id and a.id=1;
select * from a right join b on a.id=b.id and a.id=2;
select * from a right join b on a.id=b.id and a.id=3;

对右表条件执行on:先对右表进行过滤;如果在条件中的记录正常联表;如果不在条件中的则展示右表,左表内容都是null。下面三个查询语句依次对应下图的三个结果
select * from a right join b on a.id=b.id and b.id=1;
select * from a right join b on a.id=b.id and b.id=2;
select * from a right join b on a.id=b.id and b.id=3;

inner join中使用on
不论对左表还是右表条件执行on都是先对表执行条件,在联表。
select * from a join b on a.id=b.id and a.name="a111" and b.id=1;

网友评论