多表LEFT JOIN SQL查询执行逻辑拆解及流程咨询
别担心,这完全是学习多表JOIN时非常常见的疑问,咱们一步步拆解,把它弄明白~
拆解你的多表LEFT JOIN查询
首先先把你的SQL语句清晰列出来,方便咱们逐部分分析:
SELECT * FROM Table1 LEFT JOIN Table2 ON Table1.id = Table2.action_id LEFT JOIN Table3 ON Table1.changeset_id = Table3.id LEFT JOIN Table4 ON Table2.field_id = Table4.id
1. 逐个理解后续的LEFT JOIN
你已经搞懂第一个LEFT JOIN Table2的逻辑:保留Table1的所有行,匹配Table2中action_id等于Table1.id的行,匹配不到的话Table2的列会是NULL。后面两个LEFT JOIN都是基于前面已经生成的临时结果集来继续关联的,规则和第一个一致,但关联的对象和条件有区别:
第二个LEFT JOIN(关联Table3)
LEFT JOIN Table3 ON Table1.changeset_id = Table3.id
- 这里是用原始Table1里的changeset_id字段去匹配Table3的主键id
- 执行逻辑:保留前面临时结果集(Table1+Table2匹配后的所有行)的每一条记录,只要Table3里有id等于当前行changeset_id的记录,就把Table3的所有字段追加进来;如果找不到匹配的,Table3的所有字段都会显示为NULL
- 划重点:这个关联和Table2有没有匹配到数据无关——哪怕某一行的Table2全是NULL,只要Table1的changeset_id能在Table3找到对应值,Table3的字段就会有内容
第三个LEFT JOIN(关联Table4)
LEFT JOIN Table4 ON Table2.field_id = Table4.id
- 这里是用前面结果集中Table2的field_id字段去匹配Table4的主键id
- 执行逻辑:保留前面临时结果集(Table1+Table2+Table3匹配后的所有行)的每一条记录:
- 如果当前行的Table2.field_id有值(也就是之前Table2成功匹配到了数据),并且Table4里有id等于这个field_id的记录,就把Table4的字段追加进来;
- 如果Table2.field_id是NULL(也就是Table2没匹配到数据),或者Table4里找不到对应的id,Table4的所有字段都会显示为NULL
2. 拆解整个执行的子流程
多表LEFT JOIN的执行顺序是从左到右逐步构建临时结果集,你可以把整个SQL拆成这三个递进的步骤:
第一步:生成Table1 + Table2的临时结果集(记为Temp1)
- 以Table1为基础表,把每一行和Table2中满足
action_id = Table1.id的行进行匹配 - 保留Table1的所有行,匹配到的Table2字段显示对应值,没匹配到的Table2字段全为NULL
- 以Table1为基础表,把每一行和Table2中满足
第二步:用Temp1关联Table3生成Temp2
- 以Temp1为基础,把每一行和Table3中满足
id = Temp1.changeset_id的行进行匹配 - 保留Temp1的所有行,匹配到的Table3字段显示对应值,没匹配到的Table3字段全为NULL
- 以Temp1为基础,把每一行和Table3中满足
第三步:用Temp2关联Table4生成最终结果
- 以Temp2为基础,把每一行和Table4中满足
id = Temp2.field_id的行进行匹配 - 保留Temp2的所有行,匹配到的Table4字段显示对应值,没匹配到的Table4字段全为NULL
- 最后
SELECT *就是把这个最终结果集的所有字段返回给你
- 以Temp2为基础,把每一行和Table4中满足
3. 最终结果的核心特点
- 结果集的行数和Table1的行数完全相同,因为所有JOIN都是LEFT JOIN,始终保留最左侧基础表(Table1)的每一行
- Table2的字段:仅当Table1.id在Table2的action_id中存在时才有值,否则为NULL
- Table3的字段:仅当Table1.changeset_id在Table3的id中存在时才有值,否则为NULL(和Table2是否匹配无关)
- Table4的字段:仅当Table2成功匹配(field_id不为NULL)且该field_id在Table4的id中存在时才有值,否则为NULL
内容的提问来源于stack exchange,提问作者Bogaso
相关产品推荐
相关产品推荐

