join执行顺序

SQL多字段JOIN(两个表JOIN ON多字段) 全网首发SQL多字段JOIN JOIN ON 多字段 HIVE多字段JOIN MySQL多字段JOIN 两个表JOIN ON多字段 JOIN ON 后面不是 等于号 阅读详情

转自:MySQL SQL 多个Join on(表连接) 和Where间的执行顺序(nest loop join机制)_低调的JVM的博客-优快云博客_nestloop

在mysql中,多表连接采用nest loop join,即循环嵌套连接的方式,其他还有归并排序连接,哈希连接;

mysql sql优化器会对sql的表的连接顺序做一定的优化,并不见得一定是我们写的sql的表连接顺序,会尽量使用查询结果集最小的表作为驱动表,前提是连接顺序改变不会改变查询结果,然后按照优化后的顺序和其他的表逐渐连接查询。 也就是说left join连接并不一定是从左边关联到右边,也有可能是从右边关联到左边,left join仅仅是保证左侧表符合条件的记录会进入到结果集中,具体顺序使用explain执行查看。

先分析内连接或者是多表关联查询的情况:,假设sql是这样的:

select a.id,b.name,c.adress 
from A a 
    inner join B b on a.bid = b.id 
    inner join C c on a.cid = c.id 
    inner join D d on a.did = d.id
where a.id in (1,2,3,4,5,6) and b.class = '1001' and c.id > 15 and d.age < 30;
select a.id,b.name,c.adress 
from A a ,B b ,C c ,D d
where a.bid = b.id 
    and c on a.cid = c.id 
    and d on a.did = d.id
    and a.id in (1,2,3,4,5,6) 
    and c.id > 15 
    and d.age < 30;

如何确定A,B,C,D之间的连接顺序?如何确定驱动表?MySQL会优先选用结果集最小的那张表作为驱动表来和其他的表连接。如何得到结果集最小的表? MySQL会估算每一个表的结果集大小,如何估算? 会使用WHERE中的针对各个表的查询条件来估算每个表的结果集大小,此时索引就发挥了作用。

表A的条件是a.id in (1,2,3,4,5,6),假设id是唯一键,则A的结果集是6;

表B的条件是b.class = ‘1001’,若class上有索引,则使用此索引估算,假设B的总记录数是100,class索引的分布率是10%,即class有10个不同的值,则估算为100*10% = 10,即B的结果集为10;

表C的条件是 c.id > 15,假设C的总记录数是20,id是唯一键,则C的结果集最多为5;估算D的结果集方法类似,D的结果集为12;

若WHERE中不含指定表的查询条件或者查询的条件不包含索引,则此表的结果集默认为记录数最大值,但并不代表此表的结果集大于其他的表,因为有些表本身就没几条数据。

如此就确定了表的结果集大小,C , A , B , D。当然结果集大小是决定表连接顺序的一个关键因素,SQL优化器在做物理查询优化时不仅仅会考虑结果集,还会考虑查询所需的数据是否在缓存中,如果不在从磁盘读取的代价,读取到数据后将二进制数据解析成数据行的代价,以及表与表连接可能的结果集大小等等因素,综合各方面来确定表的连接顺序。

假设sql执行器按照C , A , B , D的顺序来连接,先根据where内C表的条件查询C表,得到一个结果集。然后关联查询A表,在关联时以ON 内a.cid = c.id 为关联条件。若关联的C表的字段不是唯一的话,可能生成一对多的关联,即一行A表记录生成多条结果集的记录。以on条件关联后,在执行where内关于C表的查询条件c.id > 15;那么c.id > 15这个查询条件可以放在on之后,也可以放在where之后,on之后是在生成临时表之前过滤C表的记录,而WHERE之后是对临时表的记录做过滤,理论上放在on之后效率会高一点,但where的条件若有索引则会使用索引,所以效率也不算低。而且若on之后跟的条件不是针对C表的话,可能会对结果集产生影响。AC结果集的临时表再去关联B表,一样先on关联,然后where过滤,依次关联和过滤直到表关联结束。

当然以上的sql都是a.bid = b.id and a.cid = c.id,关联条件均在A表上,有些时候时间接关联,比如a.bid = b.id and b.cid = c.id,此时表的关联顺序可能是A > B > C,或者 C > B >A,或者先B > C,然后关联A等等。SQL优化器会确保无论如何调整关联顺序不会对结果集有影响。

以上均是内连接时的情况,外连接要稍微复杂点。

假设SQL如下:

select a.id,b.name,c.adress 
from A a 
    left join B b on a.bid = b.id 
    left join C c on b.cid = c.id 
    right join D d on d.age = c.dage
where a.id in (1,2,3,4,5,6) and b.class = '1001' and c.id > 15 and d.age < 30;

对于外连接,有一个主表的概念,即left的左边表或者right的右边表,对于主表,会返回主表所有符合条件的记录行,而对于副表,则只返回能和主表关联的行,一条主表记录根据on条件和副表内每一行匹配,有多少行匹配上了就生成多少临时表的记录,也就是说主表的一行记录可能生成临时表的多条记录,若副表中没有匹配行时,则副表生成一条所有字段均为null的记录和主表的记录行匹配, 确保主表的符合条件的行能进入临时表。

对于外连接,大部分情况会以我们的SQL顺序来执行,因为有主表的结果集限制,上述SQL一般会先根据WHERE条件从A表重 查询出符合条件的记录行,作为主表和B表以ON条件关联,A结果集中的每条记录均和B表中符合条件的每条记录行生成AB临时表的一条记录,若B表有多个符合记录行,则生成多个临时表行,若B表没有符合条件的行,则生成一条所有字段均为null的行与A的记录行连接,若没有ON条件,则以“笛卡尔积”的形式连接,即A结果集的每一行和B表的每一行均连接生成临时表的记录。

当ON执行完之后,同样用WHERE条件过滤临时结果集中不符合条件的记录行,和内连接的机制相同,之后再次关联其他表。最后right join D,此时D表时主动表,D表关联A,B,C查询后的临时表,最终会返回D表中所有符合条件的记录行。

以上就是nest loop join机制,嵌套循环连接。一层一层的连接,循环用外层结果集的记录行和内层的所有符合条件ON条件的记录依次连接,内层没有符合条件的生成所有字段为null的记录行,当不存在ON条件是以“笛卡尔积”的形式连接。连接过后where过滤,再连接,在过滤,直到左右表均连接完毕。连接完毕后有group by字句则执行分组,有having字句的则对分组后的结果集再过滤,所以having执行在where之后,因此有些条件放where字句内能缩小分组前的结果集,提高执行效率。之后还有order by字句的则执行排序,最后得到查询的结果。

大鹏激光

SQL:JOIN 完全指南:从基础到实战应用 阅读详情

相关推荐

SQL 中 JOIN 的执行顺序优化指南

SQL查询中JOIN的执行顺序优化是数据库性能调优的关键。数据库引擎会根据表大小、索引情况、JOIN类型等因素动态确定最优JOIN顺序。优化技巧包括使用STRAIGHT_JOIN强制顺序、更新统计信息、查询提示等。对于复杂多表连接,建议分解查询或使用物化视图。不同数据库的JOIN优化特性各异,需通过EXPLAIN分析执行计划。面试时应重点展示通过具体案例优化JOIN性能的经验。

hixiaoyang的博客 1312

MySQL SQL 多个Join on(表连接) 和Where间的执行顺序(nest loop join机制)

这篇博客写的不好,一些内容有误,最新的可以看 https://blog.youkuaiyun.com/qq_27529917/article/details/87904179, 里面的应该是值得看的

点滴之积 4万+

hivesql中使用join 关联表时where 和 on、join 的执行先后顺序

环境:hive 0.13.1版本 select t1.cust_pty_no ,t2.amt from a t1 left join b t2 on t1.cust_pty_no = t2.cust_pty_no and t2.busi_date='2020-04-17' where t1.busi_date='2020-04-17' 使用expalin 查看执行计划如下: 看红色圈住部分,n...

weixin_42903419的博客 1万+

(四)sql多表连接查询join on的用法

(四)sql多表连接查询join on的用法

qq_43070500的博客 4万+

实现线程自定义顺序执行——join()解析

【问题】 现在有 T1、T2、T3 三个线程,你怎样保证 T2 在 T1 执行完后执行,T3 在 T2 执行完后执行? 要保证 T1、T2、T3 三个线程顺序执行,可以利用 Thread 类的 join 方法。Thread 类中的 join 方法的主要作用就是同步,它可以使得线程之间的并行执行变为串行执行。当我们调用某个线程的这个方法时,这个方法会挂起调用线程,直到被调用线程结束执行,调用线程才会...

程序员世杰 2308

使用 Wireshark 分析 PPPoE 流量中的 BRAS 名称 AC-Name

客户端发出广播请求,寻找 PPPoE 服务器。: BRAS 服务器响应 PADI 请求,提供服务并包含AC-Name。: 客户端选择一个 BRAS 并发起连接请求。: BRAS 确认连接并分配会话 ID。在这些阶段中,AC-Name是 BRAS 提供的一个关键字段,用于标识服务器名称。

caca_66的博客 2066

SQL 的JOIN ON连表查询注意事项(查偏科学生的例子)

3、left连表查询一般直接select*,因为是连几张表或自己查,不需要指定字段。1、关联查询时,别名随便起,甚至中文也可以,内对同一个字段可以起不同的别名互不影响 ,SQL 的JOIN ON连表查询注意事项。SQL 的JOIN ON连表查询注意事项。要注意在外面join on连表时两个。的字段 必须要和自己里面对的上。

SSHLY3的博客 4464

数字后端DRC Violation定位与自动化修复:Innovus与Calibre协同实战

设计规则检查(DRC)是芯片tapeout前确保版图可制造性的关键验证环节。在数字后端流程中,Calibre作为signoff级物理验证工具,会依据代工厂SVRF规则文件对GDS进行严格几何检查;而Innovus则提供快速迭代的in-design DRC反馈。两者协同成为工程师定位violation、保障流片成功的主流工作流。面对成千上万条DRC violation,高效的定位与分类思路、跨工具映射技巧,以及基于Tcl脚本的自动化修复方法,能大幅缩短物理验证周期。本文从DRC的分层定位出发,结合Innovu

weixin_29185167的博客 336

SQL多个JOIN执行顺序

多个JOIN从左到右执行 select * from a left join b on a.id=b.id left join c on b.id=c.id 先a和b交的结果集t,t再和c相交 mysql> select * from a; +------+------+ | id...

chenwanya5281的博客 6619

Perplexity SPACE沙箱平台:安全AI开发环境实战解析

沙箱技术通过资源隔离和权限控制创建受限执行环境,其核心原理是容器化隔离机制。在AI开发领域,这种技术解决了环境配置复杂性和安全风险等关键问题。SPACE沙箱平台作为AI代码执行环境,提供了标准化的开发沙箱,支持Python生态和主流AI框架。通过实战案例展示,该平台特别适用于情感分析等NLP任务的快速原型验证,帮助开发者在安全隔离的环境中测试AI模型和算法,显著提升开发效率并降低系统风险。

weixin_29029995的博客 274

Stata新手避坑:用reghdfe搞定行业、地区多重固定效应,告别‘共线性’报错

本文详细介绍了如何使用Stata中的reghdfe命令高效处理多重固定效应问题,解决传统方法在面板回归中遇到的共线性报错和低R²问题。通过实战案例和高级技巧,帮助新手快速掌握行业、地区等多维固定效应的控制方法,提升经济学和金融学研究的分析效率。

weixin_30635053的博客 419

join on和where执行顺序

原文源自:https://zoroeye.iteye.com/blog/2231332 1、join中相比where优先推荐on            WHERE子句中使用的连接语句,在数据库语言中,被称为隐性连接。INNER JOIN……ON子句产生的连接称为显性连接。(其他JOIN参数也是显性连接)WHERE和INNER JOIN产生的连接关系,没有本质区别,结果也一样。但是!隐性连接随着...

bobozai86的博客 3万+

FFmpeg + OBS 低延迟直播串流实战:从H264裸流到RTP组播的完整配置

本文详细介绍了如何利用FFmpeg将H264裸流转码为RTP协议,并通过组播技术实现与OBS客户端的超低延迟直播串流。文章深入剖析了FFmpeg关键参数调优、SDP文件生成与配置,以及OBS客户端的无缝拉流方法,为需要毫秒级实时交互的场景提供了一套去中心化、高效稳定的完整解决方案。

fanta的博客 830

join语句的执行顺序

前言 通常我们写的一个完整的SQL语句都可以拆分成多个子句,子句的执行过程通常会产生虚拟表。什么是虚拟表呢?虚拟表,英文为virtual table,简称为vt。顾名思义,就是实际上并不存在,至少在物理上是不存在的,但是在逻辑上却是存在的表。在MySQL中,有三种虚拟表:临时表、内存表和视图,这里不作详细的介绍,有兴趣的话可以自行查阅资料。回到正题,一条完整的SQL语句在执行的过程中会被拆分为多个SQL子句,每个子句执行时都会产生虚拟表vt,但是最终结果只会返回最后一个虚拟表。从这个思路入手,来理解一下jo

qq_42640067的博客 6794

245. 项目195:简易文字冒险游戏——《跟老吕学Python·新手》

如果您在学习本专栏教程时遇到任何问题,或有任何技术交流的意愿,欢迎在文章评论区留言,或通过优快云私信与老吕取得联系。老吕将及时回复您的留言,并与您共同探讨,以期为大家提供更为精准和有效的帮助。老吕珍视每一位读者的反馈和支持,期待与您共同学习、共同进步,共同创造美好的未来!我们的目标是不仅教会您Python语言,更是培养您解决问题的思维方式。请随意翻阅,按照自己的节奏学习,让这本专栏成为您编程旅程中的可靠伙伴。开发一个简易的文字冒险游戏,通过文本描述场景和事件,让玩家通过选择不同的选项来推动故事发展。

Python老吕的博客 712

CUDA&PCL 点云体素下采样

CUDA&PCL 点云体素下采样

dayuhaitang1的博客 1268

mysql多个join在一句先后执行顺序_mysql join的执行顺序??

例1(left join && right join):select * from A left join B on A.aid = B.bid right join C on A.aid = C.cid;// 最终返回的是 C 表中的数据,附带A、B两表中符合条件的数据// 这边的执行顺序是怎样的?// 我的理解:1. A left join B 返回 A 表数据,附带 B 表中...

weixin_28744573的博客 3724

am62x A53与R5F通信

AM62x是Ti的一款异构多核芯片。remoteproc驱动,硬编码(写死)了R5F/M4F固件的名字,这样驱动启动时,就会找硬件编码的固件,下面是其对应关系。值得注意的是,linux内核中的M4F remoteproc驱动启动M4F,而linux内核中的R5F remoreteproc驱动不启动R5F,相反,它attach到已经在boot阶段启动的R5F固件上。在/lib/firmware的真实固件名:,而我们生成的固件名如下所示,没有直接对应的,经确认,.out文件就是我们需要的,重命名后即可。

鹰之翔 1361

mysql查询语句join、on、where执行顺序

MySQL 的执行顺序 一、典型SELECT语句完整的执行顺序 1)from子句组装来自不同数据源的数据; 2)使用on进行join连接的数据筛选 3)where子句基于指定的条件对记录行进行筛选; 4)group by子句将数据划分为多个分组; 5)cube, rollup 6)使用聚集函数进行计算; 7)使用having子句筛选分组; 8)计算所有的表达式; 9)计算select的字段; 10)使用distinct 进行数据去重 11)使用order by对结果集进行排序。 12)选择TOPN的数据 二

lihongbao80的专栏 1万+

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

mysql join顺序_mysql join的执行顺序??

例1(left join && right join):select * from A left join B on A.aid = B.bid right join C on A.aid = C.cid;// 最终返回的是 C 表中的数据,附带A、B两表中符合条件的数据// 这边的执行顺序是怎样的?// 我的理解:1. A left join B 返回 A 表数据,附带 B 表中...

weixin_29664063的博客 865

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

sql 的join 执行顺序

SQL子句执行顺序和Join的一点总结 1.笛卡尔积(Cartesian product) 顾名思义, 这个概念得名于笛卡儿. 在数学中,两个集合 X 和 Y 的笛卡儿积(Cartesian product),又称直积,表示为 X × Y,是其第一个对象是 X 的成员而第二个对象是 Y 的一个成员的所有可能的有序对. 假设集合A={a,b},集合B={0,1,2},则两个集合的笛卡尔积为

yidian_yidi的专栏 1213

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

inner join和left join的使用以及执行顺序

好久没有写关于程序媛的技术文章了,昨天室友问了一些数据库相关的问题,那我们就来谈谈数据库吧。那问的是什么问题呢?我们来举个例子:现有以下数据库表:1.学生表Student,表中包含字段StudentId(学生号),Mobile(手机号);2.学生资料存放表Information,表中包含字段StudentId(学生号),InfoRelationId(信息关联Id)3.学生兴趣爱好表Ho...

janny_flower的博客 1万+

Java使用join方法让多个线程顺序执行【案例学习】

Java使用join方法让多个线程顺序执行!

末尾卡片和博主交流学习! 1259

hive多个left join执行计划顺序

先说明2点: 1、leftjoin是逻辑操作符,只用于保证“数据正确” 2、优化器才是最终决定执行顺序的地方,一般来说会按照你的意愿顺序去执行,但是并不完全能保证。 回答你的问题: 1.求教多个leftjoin怎么执行 eg: select*fromaleftjoinbona.abid=b.baidleftjoinconc.cbid=b.bcid...

maenlai0086的博客 1万+

mysql多个join在一句先后执行顺序,MySQL 高级(二)一条SQL语句的执行顺序 SQL中的七种JOIN图解...

MySQL 高级(二)一条SQL语句的执行顺序 SQL中的七种JOIN图解MySQL 高级(二)一条SQL语句的执行顺序 SQL中的七种JOIN图解MySQL 高级(二)一条SQL语句的执行顺序 SQL中的七种JOIN图解人的书写思路:1 SELECT DISTINCT2 FROM3 JOIN ON 4 WHERE5 GROUP BY6 HAVING7 ORDER BY8 LIMITMySQL的...

weixin_42497593的博客 869
上一篇: spring cloud/boot的.yml文件或.properties文件读取不到的原因
下一篇: mysql索引原理及查询优化
冷down
博客等级 码龄10年 11粉丝 18原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值