朱容容 發表於 2025-8-11 09:52:09

SQL join中on和where的区别解析

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li><a href="#_label0">0.结论</a></li><li><a href="#_label1">1.数据准备</a></li><li><a href="#_label2">2.测试</a></li><ul class="second_class_ul"><li><a href="#_lab2_2_0">2.1.普通</a></li><ul class="third_class_ul"><li><a href="#_label3_2_0_0">2.1.1.class单表</a></li><li><a href="#_label3_2_0_1">2.1.2.student单表</a></li><li><a href="#_label3_2_0_2">2.1.3.笛卡尔积</a></li><li><a href="#_label3_2_0_3">2.1.4. 内连接</a></li><li><a href="#_label3_2_0_4">2.2.5.普通外连</a></li></ul><li><a href="#_lab2_2_1">2.2.重点来啦-外连接</a></li><ul class="third_class_ul"><li><a href="#_label3_2_1_5">2.2.1.一</a></li><li><a href="#_label3_2_1_6">2.2.2.二</a></li><li><a href="#_label3_2_1_7">2.2.3.三</a></li><li><a href="#_label3_2_1_8">2.2.4.四</a></li></ul></ul><li><a href="#_label3">3.参考资料</a></li><ul class="second_class_ul"></ul></ul></div><p class="maodian"><a name="_label0"></a></p><h2>0.结论</h2>
<ul><li>两个表在,join时,首先做一个笛卡尔积,on后面的条件是对这个笛卡尔积做一个过滤形成一张临时表,如果没有where就直接返回结果,如果有where就对上一步的临时表再进行过滤。<ul><li>先on,再join,再where</li><li>在使用left join时,on和where条件的区别如下:</li></ul></li><li>1、on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。</li><li>2、where条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有left join的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉</li></ul>
<p class="maodian"><a name="_label1"></a></p><h2>1.数据准备</h2>
<div class="jb51code"><pre class="brush:sql;">DROP TABLE IF EXISTS `class`;
CREATE TABLE `class`
(
    `c_id`   int          DEFAULT NULL COMMENT '班级ID',
    `c_name` varchar(50) DEFAULT NULL COMMENT '班级名'
);
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student`
(
    `s_id`   int          DEFAULT NULL COMMENT '学生ID',
    `s_name` varchar(50) DEFAULT NULL COMMENT '学生名',
    `c_id`   int          DEFAULT NULL COMMENT '班级ID'
);
INSERT INTO `class` (`c_id`, `c_name`)
VALUES (1, '一班'),
       (2, '二班'),
       (3, '三班');
INSERT INTO `student` (`s_id`, `s_name`, `c_id`)
VALUES (1, '张三', 1),
       (2, '李四', 2),
       (3, '王五', 4);</pre></div>
<p class="maodian"><a name="_label2"></a></p><h2>2.测试</h2>
<div class="jb51code"><pre class="brush:sql;">-- 单表
select * from class c;
select * from student s;
-- 笛卡尔积
select * from class c inner join student s                                                                                 order by c.c_id, s.s_id;
-- 内连
select * from class c inner join student s on c.c_id = s.c_id order by c.c_id, s.s_id;
-- 左外连(先on,再join,再where)
select * from class c leftjoin student s on c.c_id = s.c_id                                                                         order by c.c_id, s.s_id;
select * from class c leftjoin student s on c.c_id = s.c_id and   c.c_id &lt;&gt; 2        order by c.c_id, s.s_id;
select * from class c leftjoin student s on c.c_id = s.c_id where c.c_id &lt;&gt; 2        order by c.c_id, s.s_id;
select * from class c leftjoin student s on c.c_id = s.c_id and   s.c_id &lt;&gt; 2        order by c.c_id, s.s_id;
select * from class c leftjoin student s on c.c_id = s.c_id where s.c_id &lt;&gt; 2        order by c.c_id, s.s_id;</pre></div>
<p class="maodian"><a name="_lab2_2_0"></a></p><h3>2.1.普通</h3>
<p class="maodian"><a name="_label3_2_0_0"></a></p><h4>2.1.1.class单表</h4>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202508/2025081109380928.png" /></p>
<p class="maodian"><a name="_label3_2_0_1"></a></p><h4>2.1.2.student单表</h4>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202508/2025081109380964.png" /></p>
<p class="maodian"><a name="_label3_2_0_2"></a></p><h4>2.1.3.笛卡尔积</h4>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202508/2025081109380971.png" /></p>
<p class="maodian"><a name="_label3_2_0_3"></a></p><h4>2.1.4. 内连接</h4>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202508/2025081109380924.png" /></p>
<p class="maodian"><a name="_label3_2_0_4"></a></p><h4>2.2.5.普通外连</h4>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202508/2025081109380998.png" /></p>
<p class="maodian"><a name="_lab2_2_1"></a></p><h3>2.2.重点来啦-外连接</h3>
<p class="maodian"><a name="_label3_2_1_5"></a></p><h4>2.2.1.一</h4>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202508/2025081109380985.png" /></p>
<p class="maodian"><a name="_label3_2_1_6"></a></p><h4>2.2.2.二</h4>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202508/2025081109380922.png" /></p>
<p class="maodian"><a name="_label3_2_1_7"></a></p><h4>2.2.3.三</h4>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202508/2025081109380979.png" /></p>
<p class="maodian"><a name="_label3_2_1_8"></a></p><h4>2.2.4.四</h4>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202508/2025081109380987.png" /></p>
<p class="maodian"><a name="_label3"></a></p><h2>3.参考资料</h2>
<p><a href="https://www.jb51.net/article/270224.htm" rel="external nofollow" target="_blank">SQL语句中LEFT&nbsp;JOIN的ON和WHERE有什么区别</a></p>
頁: [1]
查看完整版本: SQL join中on和where的区别解析