金箔 發表於 2023-8-19 00:00:00

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

<p>
        <span><strong>前言</strong></span></p>
<p>
        今天接到蚂蚁金服的电面,问了sql中过滤条件放在on和where中的区别,当时满脑子是inner join,觉得没区别啊。后来才想起来,连接查询除了inner join还有right join,left join。汗呐,当时还是太紧张了。这里做一下记录吧。</p>
<p>
        join过程可以这样理解:首先两个表做一个笛卡尔积,on后面的条件是对这个笛卡尔积做一个过滤形成一张临时表,如果没有where就直接返回结果,如果有where就对上一步的临时表再进行过滤。下面看实验:</p>
<p>
        先准备两张表:</p>
<p>
        <img title="SQL中过滤条件放on和where中的区别详解" alt="SQL中过滤条件放on和where中的区别详解" src="https://zhuji.jb51.net/uploads/img/202305/4ace8ba42162e3a94de6249f4aa109fa.jpg"></p>
<p>
        先执行inner join:</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlightersql" id="highlighter_915583">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="sql keyword">select</code> <code class="sql plain">* </code><code class="sql keyword">from</code> <code class="sql plain">person p </code><code class="sql keyword">inner</code> <code class="sql color1">join</code> <code class="sql plain">account a </code><code class="sql keyword">on</code> <code class="sql plain">p.id=a.id </code><code class="sql color1">and</code> <code class="sql plain">p.id!=4 </code><code class="sql color1">and</code> <code class="sql plain">a.id!=4;</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        <img title="SQL中过滤条件放on和where中的区别详解" alt="SQL中过滤条件放on和where中的区别详解" src="https://zhuji.jb51.net/uploads/img/202305/d59a925cad92afe015a065295826efde.jpg"></p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlightersql" id="highlighter_559971">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="sql keyword">select</code> <code class="sql plain">* </code><code class="sql keyword">from</code> <code class="sql plain">person p </code><code class="sql keyword">inner</code> <code class="sql color1">join</code> <code class="sql plain">account a </code><code class="sql keyword">on</code> <code class="sql plain">p.id=a.id </code><code class="sql keyword">where</code> <code class="sql plain">p.id!=4 </code><code class="sql color1">and</code> <code class="sql plain">a.id!=4;</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        <img title="SQL中过滤条件放on和where中的区别详解" alt="SQL中过滤条件放on和where中的区别详解" src="https://zhuji.jb51.net/uploads/img/202305/2b7c618aebdf12bfc8aa4e3521bcf94d.jpg"></p>
<p>
        结果没有区别,前者是先求笛卡尔积然后按照on后面的条件进行过滤,后者是先用on后面的条件过滤,再用where的条件过滤。</p>
<p>
        再看看左连接left join</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlightersql" id="highlighter_54709">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="sql keyword">select</code> <code class="sql plain">* </code><code class="sql keyword">from</code> <code class="sql plain">person p </code><code class="sql color2">left</code> <code class="sql color1">join</code> <code class="sql plain">account a </code><code class="sql keyword">on</code> <code class="sql plain">p.id=a.id </code><code class="sql color1">and</code> <code class="sql plain">p.id!=4 </code><code class="sql color1">and</code> <code class="sql plain">a.id!=4;</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        <img title="SQL中过滤条件放on和where中的区别详解" alt="SQL中过滤条件放on和where中的区别详解" src="https://zhuji.jb51.net/uploads/img/202305/456946ff71054cb014fc162125cdfd92.jpg"></p>
<p>
        这下看出来不对了,id为4的记录还在,这是由left join的特性决定的,使用left join时on后面的条件只对右表有效(可以看到右表的id=4的记录没了)</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlightersql" id="highlighter_381897">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="sql keyword">select</code> <code class="sql plain">* </code><code class="sql keyword">from</code> <code class="sql plain">person p </code><code class="sql color2">left</code> <code class="sql color1">join</code> <code class="sql plain">account a </code><code class="sql keyword">on</code> <code class="sql plain">p.id=a.id </code><code class="sql keyword">where</code> <code class="sql plain">p.id!=4 </code><code class="sql color1">and</code> <code class="sql plain">a.id!=4;</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        <img title="SQL中过滤条件放on和where中的区别详解" alt="SQL中过滤条件放on和where中的区别详解" src="https://zhuji.jb51.net/uploads/img/202305/d46335cc8f7eb4ca087607c8b61a5410.jpg"></p>
<p>
        where的过滤作用就出来了。。。</p>
<p>
        右连接的原理是一样的。。</p>
<p>
        到这里就真相大白了inner join中on和where没区别,右连接和左连接就不一样了。</p>
<p>
        <span><strong>总结</strong></span></p>
<p>
        以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。</p>
<p>
        原文链接:https://blog.csdn.net/u013468917/article/details/61933994</p>
頁: [1]
查看完整版本: SQL中过滤条件放on和where中的区别详解