left join on 后增加条件分析

部署运行你感兴趣的模型镜像

SQL用过一定时间的同学,对left join,right join应该非常熟悉了,可能有些同学包括我在内,

对left/right join on 后面增加左表或右表条件后,或者多个left/right join 表不同的位置查询结果

感觉到很不解,因此我对以下左连接做了分析演示:

1.两个表的左连接的查询。

2.两个表左连接,在on后面增加左表条件,以及增加右表条件的查询。

3.三张表的左连接的查询(不同的条件)。

备注:这篇文章没有对where后增加条件进行分析,大家只要记住,where后面增加的条件是对临时表生成后,进行过滤的。

而on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。

***tab1 left join tab2 on,其实on后面的条件就是对tab2数据的过滤。

 

》》》演示数据脚本

-- 表1
DROP TABLE IF EXISTS `tab1`;
CREATE TABLE `tab1` (
  `id` int(11) DEFAULT NULL,
  `size` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `tab1` VALUES ('1', '10');
INSERT INTO `tab1` VALUES ('2', '20');
INSERT INTO `tab1` VALUES ('3', '30');

-- 表2
DROP TABLE IF EXISTS `tab2`;
CREATE TABLE `tab2` (
  `size` int(11) DEFAULT NULL,
  `name` varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `tab2` VALUES ('10', 'AAA');
INSERT INTO `tab2` VALUES ('20', 'BBB');
INSERT INTO `tab2` VALUES ('20', 'CCC');

-- 表3
DROP TABLE IF EXISTS `tab3`;
CREATE TABLE `tab3` (
  `size` int(11) DEFAULT NULL,
  `notes` varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `tab3` VALUES ('10', 'F1');
INSERT INTO `tab3` VALUES ('10', 'F2');
INSERT INTO `tab3` VALUES ('30', 'F3');

》》》演示表数据截图

1.tab1与tab2的左连接

-- 两张表的左连接

-- 查询左表所有记录【包含左表与右表匹配以及左表未匹配的记录】

SELECT
       *
FROM
       tab1
LEFT JOIN tab2 ON tab1.size = tab2.size;

2.tab1与tab2的左连接(on后面增加条件)

-- 很重要:【on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录】。

1)对tab1增加条件

SELECT
       *
FROM
       tab1
LEFT JOIN tab2 ON tab1.size = tab2.size and tab1.id=2;

-- 始终记住left join,左表tab1数据都有,如果加入左表tab1条件tab1.id=2,则只有满足tab1.id=2,对应的右表tab2.size为20的才有数据,其他为null。

-- 重要(相当于只关联符合tab1.id=2的size,其他为null,得到的结果)
 

2)对tab2增加条件与tab1对比

SELECT
       *
FROM
       tab1
LEFT JOIN tab2 ON tab1.size = tab2.size and tab2.name in ('BBB','CCC');

-- 该结果与1)结果一样,左表tab1数据都有,右表tab2数据只有满足tab2.name是BBB和CCC的才有数据,其他为null。

-- 重要(相当于只关联符合tab2.name in (‘BBB’,’CCC’)的size,其他为null,得到的结果)。

 3)对tab2增加的条件

SELECT
       *
FROM
       tab1
LEFT JOIN tab2 ON tab1.size = tab2.size and tab2.`name`='AAA';

-- 左表tab1数据都有,右表tab2数据只有满足tab2.name是AAA的才有数据,其他为null。

-- 重要(相当于只关联符合tab2.name=’AAA’的size,其他为null,得到的结果)。

3.三张表的左连接(下面两种写法结果一样)

-- tab3与tab1、tab2左连接【条件为tab1.size=tab3.size】,

-- 这种写法指,从tab1.size是否在tab3中有匹配数据,如果tab1.size为null,那tab3.size就为null

-- 第二种写法可以看作两张表的左连接。

SELECT
       *
FROM
       tab1
LEFT JOIN tab2 ON tab1.size = tab2.size
LEFT JOIN tab3 ON tab1.size = tab3.size;

SELECT
       *
FROM
       (
              SELECT
                     tab1.size
              FROM
                     tab1
              LEFT JOIN tab2 ON tab1.size = tab2.size
       ) a
LEFT JOIN tab3 ON a.size = tab3.size;

4.三张表的左连接(左连接条件不同)

-- tab3与tab1、tab2左连接【条件为tab2.size=tab3.size】,

-- 这种写法指,从tab2.size是否在tab3中有匹配数据,如果tab2.size为null,那tab3.size就为null

-- 这种统计在于tab2没有数据,tab3就没数据。

SELECT
       *
FROM
       tab1
LEFT JOIN tab2 ON tab1.size = tab2.size
LEFT JOIN tab3 ON tab2.size = tab3.size;

注:本文是个人演示总结,非官方理论,如果有错误的地方,还请同学们在评论下方提出,

       我及时修正,为大家提供更好的演示例子。

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

### 如何在 MySQL 的 LEFT JOIN 中使用 ON 子句添判断条件 当处理 `LEFT JOIN` 语句时,在 `ON` 子句中入特定的判断条件可以控制连接行为,从而精确地获取所需的数据集。对于从表(右侧表)而言,这些条件会在创建临时结果集的过程中应用;而对于主表(左侧表),即使不满足 `ON` 子句内的条件也会保留其所有的行。 考虑如下 SQL 查询结构: ```sql SELECT * FROM table_left AS t1 LEFT JOIN table_right AS t2 ON t1.id = t2.left_id AND t2.condition_column = 'specific_value'; ``` 此查询表示将基于两个表格之间的关系字段 (`id`) 进行联结操作的同时,附了一个额外的要求——只有当右边表中的某列(`condition_column`)等于指定值('specific_value')的时候才认为它们之间存在有效的关联[^4]。 需要注意的是,如果希望进一步对最终得到的结果施限制,则应该把这些逻辑放置于 `WHERE` 子句内而不是 `ON` 部分。因为前者是在整个联合过程结束后才生效,能够确保不会意外丢失任何来自左表的信息[^2]。 例如,假设有一个场景需要找出所有职位信息以及对应的职业需求为“程序员”的工作详情,但是某些职位可能暂时没有任何与之相匹配的工作描述。此时可以通过下面的方式实现这一目标: ```sql SELECT j.*, ji.* FROM jobinfo AS j LEFT JOIN jobdetails AS ji ON j.jobId = ji.jobInfoId AND ji.professionRequire = '程序员' WHERE j.status = 'open'; -- 主表上的过滤条件应放在此处 ``` 上述例子展示了如何利用 `AND` 关键字来组合多个条件到同一个 `ON` 子句里,并且说明了为何要区分哪些条件适合放在 `ON` 而不是 `WHERE`[^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值