SQL中过滤条件放on和where中的区别详解

 更新时间:2019年01月25日 11:46:16   作者:古月慕南  
这篇文章主要给大家介绍了关于SQL中过滤条件放on和where中的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起看看吧

前言

今天接到蚂蚁金服的电面,问了sql中过滤条件放在on和where中的区别,当时满脑子是inner join,觉得没区别啊。后来才想起来,连接查询除了inner join还有right join,left join。汗呐,当时还是太紧张了。这里做一下记录吧。

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

先准备两张表:

先执行inner join:

select * from person p inner join account a on p.id=a.id and p.id!=4 and a.id!=4;

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

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的记录没了)

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没区别,右连接和左连接就不一样了。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

相关文章

  • 快速解决openGauss数据库pg_xlog爆满问题

    快速解决openGauss数据库pg_xlog爆满问题

    这篇文章主要介绍了openGauss数据库pg_xlog爆满问题解决,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-04-04
  • DBeaver一款替代Navicat的数据库可视化工具

    DBeaver一款替代Navicat的数据库可视化工具

    这篇文章主要介绍了DBeaver一款替代Navicat的数据库可视化工具,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • SQL语句学习

    SQL语句学习

    丁丁现在在做数据库,可是上学时没有好好的学习SQL的语句,现在每天晚上还要问我,可是我又有好多自己的事情要做,不能天天给她讲(^_^其实我的水品也很一般了),所以先把我以前学习sql语句所记录的一些东东留在这里
    2014-06-06
  • sql小计汇总 rollup用法实例分析

    sql小计汇总 rollup用法实例分析

    rollup在oracle ,sql-server里面都有有。
    2009-06-06
  • navicat如何执行.sql文件

    navicat如何执行.sql文件

    这篇文章主要介绍了navicat如何执行.sql文件问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • StoneDB主从配置及切换实践方案

    StoneDB主从配置及切换实践方案

    这篇文章主要介绍了StoneDB主从配置及切换实践方案的相关资料,需要的朋友可以参考下
    2022-10-10
  • 使用DataGrip的详细教程

    使用DataGrip的详细教程

    这篇文章主要介绍了使用DataGrip的步骤详解,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2020-09-09
  • 数据库安装包和升级包脚本工具RedGate使用介绍

    数据库安装包和升级包脚本工具RedGate使用介绍

    这篇文章主要介绍了数据库安装包和升级包脚本工具RedGate使用介绍,RedGate是一个SQL脚本生成工具,需要的朋友可以参考下
    2014-07-07
  • Clickhouse数据表、数据分区partition的基本操作代码

    Clickhouse数据表、数据分区partition的基本操作代码

    clickhouse的分区是指将数据按照分区键进行划分,每个分区可以包含多个数据块,这篇文章主要介绍了Clickhouse数据表、数据分区partition的基本操作代码,需要的朋友可以参考下
    2023-11-11
  • DBeaver之如何导出数据库结构和数据

    DBeaver之如何导出数据库结构和数据

    这篇文章主要介绍了DBeaver之如何导出数据库结构和数据问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04

最新评论