MySQL的on和where的区别,实战注意事项

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

看看如下的例子:

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

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

下面看几个例子:

例子一:

正确SQL:

错误SQL:

假设删除掉and那一行

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

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

例子二

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

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

故正确SQL应该这样写

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

如有错误,感谢纠正。

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值