网站首页 > 技术文章 正文
Left join 呢,就是左连接,是以左表当基础,按照 ON 后面给出来的两表的条件把两表连起来。结果会把左表所有要查的信息都列出来,而右表就只列出 ON 后面条件跟左表能对上的那部分。
在 SQL 查询里,ON 条件可重要啦。不管 ON 里的条件咋写,左连接首先得把左边的所有行都拿到。对于右边的表,要是满足连接条件,就输出值,要是不满足条件,就返回 null 。也就是说,ON 里的过滤条件是当左外连接的连接条件,可不是过滤条件。左边表的数据是得全部输出的,做连接的时候,抽取出符合条件的左边的数据行,跟右边的表做连接,然后输出结果。不符合条件的数据行,就输出左边表,右边表就是 null 值,再输出结果。
比如说,假设有两张表,表 1 和表 2 。表 1 里的数据是这样的:id 是 1,size 是 10;id 是 2,size 是 20;id 是 3,size 是 30 。表 2 里的数据是这样的:size 是 10,name 是 AAA;size 是 20,name 是 BBB;size 是 20,name 是 CCC 。当执行 SQL 语句 “select * form tab1 left join tab2 on (tab1.size = tab2.size and tab2.name='AAA')” 的时候,查询的过程是这样的:首先,中间表的 on 条件是 tab1.size = tab2.size and tab2.name='AAA' 。就算条件不是真的,也会返回左表的记录。要是左表的某一行符合连接条件,那就跟右表做连接,输出左表和右表的行。要是不符合连接条件,那就输出左表的行,右表的行直接就是 null 。
反正,ON 条件在 LEFT JOIN 里主要就是起到连接左右表的作用,保证左表的所有数据都能输出,同时按照条件挑出右表的数据跟它配上。
二、ON 条件数量的探讨
(一)ON 条件可以有多个吗
在 LEFT JOIN 里,ON 条件是能有好几个的。比如说,假设有三张表 A、B、C,要做左连接查询,可以这么写 SQL 语句:SELECT * FROM A LEFT JOIN B ON A.id = B.a_id AND A.name = B.b_name LEFT JOIN C ON A.id = C.c_id AND A.address = C.c_address 。通过这种办法,就实现了有多个 ON 条件的连接。
(二)多 ON 条件的作用
有好几个 ON 条件在连接表的时候,能更准确地挑出符合特定条件的记录。拿两个表来说,有好几个 ON 条件的时候,只有同时满足所有条件的记录才会被连起来。这样能让结果集里多余的数据变少,让查询更准。比如说,有员工表和部门表,要找出特定部门名字而且在特定入职日期范围里的员工信息,就可以用多个 ON 条件来连接,像 SELECT * FROM employees LEFT JOIN departments ON employees.department_id = departments.id AND departments.name = '特定部门名称' AND employees.join_date BETWEEN '开始日期' AND '结束日期' 。
(三)ON 条件数量对查询结果的影响
ON 条件的数量不一样,对查询结果会有不一样的影响。当增加 ON 条件的时候,结果集的大小可能会变小。因为条件多了就意味着筛选更严了,只有满足所有条件的记录才会被放到结果集里。比如说,一开始就一个 ON 条件做左连接,可能会得到比较多的结果。但增加了几个 ON 条件以后,不符合新增加条件的记录就会被排除掉,结果集的数量可能就会变少。同时,如果 ON 条件里有的条件是对左表有限制,虽然不影响返回的行数,但是会影响右表的匹配内容,让右表不满足条件的部分变成 null 。
三、ON 与 WHERE 的区别
(一)在多 ON 条件下的表现
在有多个 ON 条件的时候,ON 条件是在生成临时表的时候用的条件,不管条件是真是假,都会把左边表的记录返回,同时按照多个条件对右表进行筛选,不满足条件的右表记录就补成 NULL 。而 WHERE 条件是在临时表生成好了以后,再对临时表进行过滤的条件,这时候已经没有 LEFT JOIN 的意思了,条件不真的记录会全都被过滤掉。 比如说,假设有三张表 A、B、C ,执行 SQL 语句 SELECT * FROM A LEFT JOIN B ON A.id = B.a_id AND A.name = B.b_name LEFT JOIN C ON A.id = C.c_id AND A.address = C.c_address WHERE B.name = '特定名称' AND C.address = '特定地址' 。在这个例子里,多个 ON 条件先对左右表进行连接,挑出满足连接条件的记录,就算条件不真也会返回左表记录,右表补成 NULL 。而 WHERE 条件是在临时表生成以后,对临时表里面的记录进行过滤,只有满足 WHERE 条件的记录才会最后被返回。
(二)不同场景下的应用
在实际用的时候,要是需要连接好几个表,还得对连接条件进行很精确的控制,那就应该用 ON 条件。比如说,在一个电商系统里,有订单表、商品表和用户表。要查特定用户在特定时间段里买的特定商品的订单信息,就可以用多个 ON 条件来连接,像 SELECT * FROM orders LEFT JOIN products ON orders.product_id = products.id AND products.name = '特定商品名称' LEFT JOIN users ON orders.user_id = users.id AND users.username = '特定用户名' WHERE orders.order_date BETWEEN '开始日期' AND '结束日期' 。 而 WHERE 条件通常是在连接完了以后,对结果集做进一步的筛选和限制。就像在上面说的查询结果里,要是想再进一步挑出订单金额大于一定值的记录,就可以用 WHERE 条件来过滤。 反正,在 SQL 查询里,应该按照具体的需求合适地选择用 ON 条件和 WHERE 条件,这样才能实现又准又高效的查询。
四、总结on多条件
(一)总结多 ON 条件的特点和作用
在 SQL 查询里,LEFT JOIN 的 ON 条件能有好几个,这给咱们连接多个表的时候提供了更灵活、更精确的控制办法。多 ON 条件的主要特点和作用有:
能更准地挑出符合特定条件的记录。通过多个条件组合起来,只有同时满足所有条件的记录才会被连接起来,这样能让结果集里多余的数据变少,让查询更准。
能对左右表的连接进行更细的控制。不一样的 ON 条件能分别对着左表和右表做限制,虽说左表的记录总会被返回,可右表不满足条件的部分会被补成 NULL,这样就影响了右表的匹配内容。
在生成临时表的时候起关键作用。ON 条件是在生成临时表的时候用的,不管条件是真是假,都会返回左边表的记录,然后按照条件对右表进行筛选,给后面的查询和过滤打下基础。
猜你喜欢
- 2025-02-03 彻底搞懂where,inner join,left join,right join,full join的区别
- 2025-02-03 FLINK-SQL之JOIN的6种方式(flink sql执行流程)
- 2025-02-03 详细介绍MySQL中的LEFT JOIN、INNER JOIN和RIGHT JOIN
- 2025-02-03 SQL关联各种JOIN傻傻分不清楚,读这一篇就够了
- 2025-02-03 2副图秒懂SQL中的join(sqljoin的用法)
- 2025-02-03 SQL JOIN 从入门到精通——看懂这张图,告别面试尴尬!
- 2025-02-03 浅析Sql中内连接、外连接、全连接、交叉连接的区别
- 2025-02-03 什么,LEFT JOIN 会变成 JOIN?(left join on in)
- 2025-02-03 left join中的on和where条件你真的理解了吗?
- 2025-02-03 初学者的一分钟SQL Join教程(sql技巧)
- 02-21走进git时代, 你该怎么玩?_gits
- 02-21GitHub是什么?它可不仅仅是云中的Git版本控制器
- 02-21Git常用操作总结_git基本用法
- 02-21为什么互联网巨头使用Git而放弃SVN?(含核心命令与原理)
- 02-21Git 高级用法,喜欢就拿去用_git基本用法
- 02-21Git常用命令和Git团队使用规范指南
- 02-21总结几个常用的Git命令的使用方法
- 02-21Git工作原理和常用指令_git原理详解
- 最近发表
- 标签列表
-
- cmd/c (57)
- c++中::是什么意思 (57)
- sqlset (59)
- ps可以打开pdf格式吗 (58)
- phprequire_once (61)
- localstorage.removeitem (74)
- routermode (59)
- vector线程安全吗 (70)
- & (66)
- java (73)
- org.redisson (64)
- log.warn (60)
- cannotinstantiatethetype (62)
- js数组插入 (83)
- resttemplateokhttp (59)
- gormwherein (64)
- linux删除一个文件夹 (65)
- mac安装java (72)
- reader.onload (61)
- outofmemoryerror是什么意思 (64)
- flask文件上传 (63)
- eacces (67)
- 查看mysql是否启动 (70)
- java是值传递还是引用传递 (58)
- 无效的列索引 (74)