先来看这样两条语句
#语句1
select * from actor left join category on actor.actor_id = category.category_id and category_id = 1
#语句2
select * from actor left join category on actor.actor_id = category.category_id where category_id = 1
同样的条件category_id = 1
,一个放在on后面,一个放在where后面
- actor_id 从1-200,有200条数据
- category_id 从1-16,有16条数据
第一条语句将判断条件 category_id = 1
放在了on里面,而第二条语句放在了where中,name这两条语句最终的执行结果会有什么不同吗
结果是放在where语句中最终只会有一条,而and category_id = 1
则会有200条数据
结论:
-
当使用内连接的时候,两种方式一样
当使用左外连接的时候,会把左表的数据全部查出,当使用右外连接的时候,会把右表中的数据全部查出 -
而and则是在表连接前过滤A表或B表里面哪些记录符合连接条件,同时会兼顾是left join还是right join。即
假如是左连接的话,如果左边表的某条记录不符合连接条件,那么它不进行连接,但是仍然留在结果集中(此时右边部分的连接结果为NULL)
on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录