left join 的一点小纠结

多表查询

select eve.id,eve.objid,obj.name,title,strategy,isApprove,examtmp,provider,
target,encipher,concept,eve.fid
from OBJ_EVENTTREE eve 
left  join OBJ_FUNCTION obj on eve.fid = trim(obj.id)
where  eve.id='56'

left join是以OBJ_EVENTTREE表的记录为基础的,OBJ_EVENTTREE可以看成左表,OBJ_FUNCTION 可以看成右表,left join是以左表为准的.
换句话说,左表(OBJ_EVENTTREE)的记录将会全部表示出来,而右表(OBJ_FUNCTION )只会显示符合搜索条件的记录(例子中为: eve.fid = obj.id).
OBJ_FUNCTION 表记录不足的地方均为NULL.

原来的sql语句没有trim(),一直不能查出obj表的相关数据,后来发现是

由于数据库设计,OBJ_EVENTTREE 的 fid字段为varchar类型,表,OBJ_FUNCTION
的id字段为char类型,
而where查询条件id=56,char有8个字节,所以不满8字节都会为空,
id="56      "
trim为去空函数,加上trim()  ,结果正确显示,OK

### 原理 在 SQL 中,`LEFT JOIN` 是从左表(左外部连接)返回所有的行,即使右表中没有匹配的行。当 `LEFT JOIN` 后面跟小表时,其原理主要涉及到数据库的查询优化器对连接操作的处理。查询优化器会根据表的大小、索引情况等因素来选择合适的连接算法。对于 `LEFT JOIN` 后面跟小表的情况,常见的连接算法如嵌套循环连接(Nested Loop Join)会更高效。在嵌套循环连接中,左表会作为外层循环,逐行读取,对于左表的每一行,会在右表(小表)中进行查找匹配。由于小表的数据量少,在小表中进行查找匹配的速度会更快,从而提高连接操作的效率 [^1]。 ### 影响 - **性能提升**:通常情况下,`LEFT JOIN` 后面跟小表可以显著提升查询性能。因为小表的数据量小,在进行连接操作时,需要扫描的数据量少,减少了 I/O 操作和 CPU 计算量,从而加快查询速度。 - **资源消耗降低**:由于减少了数据扫描和处理的工作量,会降低数据库服务器的资源消耗,如内存、CPU 等,使数据库系统能够更稳定地运行。 - **查询结果准确性**:`LEFT JOIN` 的语义不会因为后面跟小表而改变,仍然会返回左表的所有行,右表没有匹配的行则用 `NULL` 填充,保证了查询结果的准确性。 ### 使用场景 - **数据关联分析**:当需要对两个表进行关联分析,且其中一个表的数据量明显小于另一个表时,可以将小表放在 `LEFT JOIN` 的右侧。例如,有一个订单表(大表)和一个商品分类表(小表),需要分析每个订单所属的商品分类,就可以使用 `LEFT JOIN` 将订单表和商品分类表进行连接。 - **数据补充**:当需要为大表补充一些额外信息,而这些信息存储在小表中时,可以使用 `LEFT JOIN` 后面跟小表的方式。比如,有一个用户信息表(大表)和一个用户权限表(小表),需要为用户信息表补充用户的权限信息,就可以通过 `LEFT JOIN` 实现。 ```sql -- 示例 SQL,假设 orders 是大表,categories 是小表 SELECT orders.order_id, categories.category_name FROM orders LEFT JOIN categories ON orders.category_id = categories.category_id; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

撸依天

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值