首先解释一下on和where的区别:
(1)在内连接的时候,也就是使用inner join ...on的时候,on和where作用是相同的。
(2)在外连接的时候,on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。而where条件是在临时表生成好后,再对临时表进行过滤的条件。
当然,在on连接后面还可以用where进行数据过滤。

看看如下的例子:

in的用法 mysql中not mysql的on和in用法_SQL

(1)on是生成临时表时使用的条件,上面我们采用的是左外连接,左外连接是以左表为基础的,左表的记录将会全部表示出来,而右表只会显示符合搜索条件的记录。也就是说emp是左表,dept是右表,条件是emp的deptno与dept中的deptno相等且为40时才连接,但emp表中不存在deptno为40的记录,也就是右表没有符合条件的记录,而记录不足的地方均用NULL来补充。

(2)而where是在临时表生成好后,再对临时表进行过滤。也就是说emp表与dept的连接条件只是emp的deptno与dept中的deptno相等,然后在对生成的临时表进行筛选,由于emp表中不存在deptno为40的记录,所以未找到符合条件的记录。

下面看几个例子:

例子一:

in的用法 mysql中not mysql的on和in用法_SQL_02

in的用法 mysql中not mysql的on和in用法_in的用法 mysql中not_03

正确SQL:

in的用法 mysql中not mysql的on和in用法_赋值_04

错误SQL:

in的用法 mysql中not mysql的on和in用法_数据库_05

in的用法 mysql中not mysql的on和in用法_赋值_06

假设删除掉and那一行

in的用法 mysql中not mysql的on和in用法_mysql_07

in的用法 mysql中not mysql的on和in用法_数据库_08

很明显,“Thomas”的bonus是不为null的,那为什么在on连接多一个and后会出现“Thomas”的奖金为“null”呢?

其实也就是左表(left)在右边找不到可以匹配的,(第一个条件可以匹配到,第二个条件匹配不到),所以就赋值的时候就只能赋值为NULL。

例子二

in的用法 mysql中not mysql的on和in用法_SQL_09

in的用法 mysql中not mysql的on和in用法_mysql_10

in的用法 mysql中not mysql的on和in用法_数据库_11

in的用法 mysql中not mysql的on和in用法_in的用法 mysql中not_12

下面这SQL语句为什么报错??

in的用法 mysql中not mysql的on和in用法_赋值_13

in的用法 mysql中not mysql的on和in用法_赋值_14

首先,on条件和where条件是有区别的。对于上述语句,一定会保存记录的表是Books。Order表的过滤应该放到on条件中去的,这样不匹配就会赋值为NULL,而在本题中where判断为null是不会被过滤的,而原先的值可能被过滤!!

故正确SQL应该这样写

in的用法 mysql中not mysql的on和in用法_赋值_15

综上所述,在内连接(left/right)的时候,会先把左边/右边的所有记录先记录下来,然后再根据on找到另一张表的所有记录,若不满足所有的on,那么直接赋值为NULL。而where是在两张表链接后进行筛选,若不匹配直接过滤掉。

如有错误,感谢纠正。