SQL语句中 where 和 on 的区别

2019-07-03 15:17:58 浏览数 (1)

最近面试时候碰到一道题,关于数据库左连接和内连接中and和where的区别,网上看了看资料,加深一下印象,大家也可以看看。

先说结论:

在使用left join左连接时,on and和on where条件的区别如下:

1、on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。

2、where条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有left join的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉,on后的条件用来生成左右表关联的临时表,where后的条件对临时表中的记录进行过滤。

在使用inner join内连接时,不管是对左表还是右表进行筛选,on and和on where都会对生成的临时表进行过滤。

join过程可以这样理解:首先两个表做一个笛卡尔积,on后面的条件是对这个笛卡尔积做一个过滤形成一张临时表,如果没有where就直接返回结果,如果有where就对上一步的临时表再进行过滤。下面看实验:

先准备两张表:

先执行inner join

代码语言:javascript复制
select * from person p inner join account a 
on p.id=a.id and p.id!=4 and a.id!=4;
代码语言:javascript复制
select * from person p inner join account a 
on p.id=a.id where p.id!=4 and a.id!=4;

结果没有区别,前者是先求笛卡尔积然后按照on后面的条件进行过滤,后者是先用on后面的条件过滤,再用where的条件过滤。

再看看左连接left join

代码语言:javascript复制
select * from person p left join account a 
on p.id=a.id and p.id!=4 and a.id!=4;

这下看出来不对了,id为4的记录还在,这是由left join的特性决定的,使用left join时on后面的条件只对右表有效(可以看到右表的id=4的记录没了)。

代码语言:javascript复制
select * from person p left join account a 
on p.id=a.id where p.id!=4 and a.id!=4;

where的过滤作用就出来了,右连接的原理是一样的。到这里就真相大白了:inner join中on和where没区别,右连接和左连接就不一样了。

本文转载自:

SQL语句中where和 on的区别?

https://blog.csdn.net/wyqwilliam/article/details/82709843

0 人点赞