优秀的编程知识分享平台

网站首页 > 技术文章 正文

你可能忽略了left join 的on 条件是可以多个的

nanyue 2025-02-03 14:24:29 技术文章 7 ℃

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 条件是在生成临时表的时候用的,不管条件是真是假,都会返回左边表的记录,然后按照条件对右表进行筛选,给后面的查询和过滤打下基础。

Tags:

最近发表
标签列表