MySQL LEFT JOIN INNER JOIN实例

本文深入探讨了使用SQL进行复杂查询的技术细节,包括联接多个表、筛选特定记录和获取详细设备信息的方法。通过两个具体案例,展示了如何构建复杂的SQL语句以满足高级数据检索需求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SELECT KEY_ID_TAG,accuml_map_to_fes.DESCRIPTION,accuml_map_to_fes.RTU_TAG,accuml_map_to_fes.DOT_NO, fes_accuml.TAG_NAME, fes_accuml.DESCRIPTION,fes_dev_info.TAG_NAME,fes_dev_info.DEV_DESC 
FROM accuml_map_to_fes LEFT JOIN (fes_accuml INNER JOIN fes_dev_info ON  fes_accuml.DEV_TAG = fes_dev_info.TAG_NAME)
ON fes_accuml.TAG_NAME = concat(accuml_map_to_fes.RTU_TAG,'.',accuml_map_to_fes.DOT_NO) WHERE  KEY_ID_TAG LIKE 'accuml.QHB.DTS432-311Xinst242.%';


SELECT tblA.KEY_ID_TAG,tblA.DESCRIPTION,tblA.OFFSET_NO,fes_analog_ctrl.DESCRIPTION,tblA.RTU_TAG,tblA.DOT_NO,fes_analog.DESCRIPTION,fes_dev_info.TAG_NAME,fes_dev_info.DEV_DESC
FROM 
((SELECT analog_map_to_fes.KEY_ID_TAG,analog_map_to_fes.DESCRIPTION,analog_control.OFFSET_NO,analog_map_to_fes.RTU_TAG,analog_map_to_fes.DOT_NO
FROM analog_map_to_fes LEFT JOIN analog_control ON analog_map_to_fes.KEY_ID_TAG = concat('analog.',analog_control.TAG_NAME)
WHERE analog_map_to_fes.KEY_ID_TAG LIKE 'analog.QHB.300JGXX620Xinst248.%') AS tblA 
LEFT JOIN fes_analog
ON fes_analog.TAG_NAME = concat(tblA.RTU_TAG,'.',tblA.DOT_NO))
LEFT JOIN fes_analog_ctrl 
ON fes_analog_ctrl.TAG_NAME = concat(tblA.RTU_TAG,'.',tblA.OFFSET_NO)
LEFT JOIN fes_dev_info
ON fes_analog.DEV_TAG = fes_dev_info.TAG_NAME

 

### 左连接 (Left Join) 与内连接 (Inner Join) 的区别 #### 定义 左连接 (`LEFT JOIN`) 返回左表中的所有记录以及右表中符合条件的记录。如果右表中不存在匹配项,则返回 `NULL` 值[^3]。 内连接 (`INNER JOIN`) 则仅返回两个表中满足连接条件的匹配行。换句话说,只有当两表都存在对应关系的数据时,这些数据才会被展示出来[^4]。 #### 使用场景 对于 `LEFT JOIN` 来说,它的主要用途是在需要保留左侧表格全部信息的同时获取右侧表格的相关补充信息。即使右侧表格没有任何相匹配的信息也不会影响到最终查询结果里来自左边部分的内容显示[^1]。 而 `INNER JOIN` 更适合于寻找共同特征或者交集的情况——即希望得到的是两张或多张不同来源之间相互重叠的部分而非单方面的完整列表[^2]。 #### 示例代码 下面通过具体的例子来说明这两种类型的差异: 假设我们有两个简单的表A和B: ```sql -- 表A CREATE TABLE A ( aID INT PRIMARY KEY, name VARCHAR(50) ); INSERT INTO A VALUES (1, 'Alice'), (2, 'Bob'); -- 表B CREATE TABLE B ( bID INT PRIMARY KEY, age INT, aID INT -- 外键指向A.aID ); INSERT INTO B VALUES (101, 25, 1), (102, 30, NULL); ``` ##### LEFT JOIN 实例 当我们执行以下SQL语句时, ```sql SELECT * FROM A LEFT JOIN B ON A.aID = B.aID; ``` 会获得这样的结果: |aID |name |bID |age |aID | |----|------|-----|----|----| |1 |Alice |101 |25 |1 | |2 |Bob |NULL |NULL|NULL| 可以看到,“Bob”的相关信息虽然在表A中有记录但由于他在表B找不到对应的条目所以相应字段填充为了null值表示缺失状态。 ##### INNER JOIN 实例 再看另一个情况下的输出效果: ```sql SELECT * FROM A INNER JOIN B ON A.aID = B.aID; ``` 此时只会显示出同时存在于AB两方之内的项目组合而成的新集合形式呈现给用户查看而已。 |aID |name |bID |age |aID | |----|------|-----|----|----| |1 |Alice |101 |25 |1 | 这里仅仅列出了能够成功建立映射联系的对象实例化表现形态。 ### 总结 综上所述,在实际应用过程中可以根据具体需求灵活选用合适的join方式以达到预期目的并提高效率减少不必要的计算开销等问题发生几率最小化处理原则下做出最佳决策方案设计思路方向指引作用明显增强用户体验满意度水平提升显著可见一斑矣!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值