mysql三张表怎么连接 mysql三张表联合查询sql语句

Mysql怎么实现三表连接怎么添加条件?有两种方式: 关键字where 或嵌入在inner 或left 中:
下面定义3个表A,B,C,字段分别为A:a,b;B:b,c;C:c , d
正常where 使用语句如下:
select A.a,B.b,C.c from A
inner join B on A.b=B.b
inner join C on C.c=B.c
where A.a=10 or B.b=10 or C.c=10
下面的SQL 嵌入到inner 中的使用方式:
select A.a,B.b,C.c from A
inner join B on A.b=B.b and B.b=10
inner join C on C.c=B.c and C.c=10
MYSQL数据库中三个数据表如何实现关联数据库多表关联mysql三张表怎么连接,一般采用外键比较方便mysql三张表怎么连接,也可以额外建一个连接表做多表关联的连接mysql三张表怎么连接,但这样稍微有点儿复杂 , 这些是建表方面的关联 。查询关联,可以采用多表查询的方式关联查询 , 这点要求稍高点儿 , 但关联后再操作单表时,别的表不用受太大的影响 , 这点特好 。
MySQL中3表join流程分析 常听说MySQL中3表 join 的执行流程并不是前两张表 join 得出结果,再与第三张表进行 join;而是3表嵌套的循环连接 。那这个3表嵌套的循环连接具体又是个什么流程呢?与前两张表 join 得出结果再与第三张表进行 join 的执行效率相比如何呢?下面通过一个例子来分析分析 。
set optimizer_switch='block_nested_loop=off';
关联字段无索引的情况下强制使用索引嵌套循环连接算法,目的是更好的观察扫描行数 。
表结构和数据如下:
示例SQL:
通过 slow log 得知一共扫描 24100 行:
执行计划显示用的索引嵌套循环连接算法:
扫描行数构成:
总行数=100+4000+20000=24100 。
从这个结果来看 , join 过程像是先 t1 和 t3 join 得出 20 行中间结果,再与 t2 进行 join 得出结果 。这结论与我们通常认为的 3表 join 实际上是3表嵌套的循环连接不一样,接着往下看 。
查看执行计划成本:
mysql explain format=json select * from t1 join t2 on t1.b=t2.b join t3 on t1.b=t3.b where t1.a21\G
其他信息:
IO成本= 1*1.0 =1
CPU成本= 100*0.2 =20
t1总成本=21
IO成本= 1*1.0 =1
CPU成本= 200*0.2 =40
t3表总成本= 驱动表扇出*(IO成本+CPU成本) = 20*(1+40) =820
阶段性总成本= 21+820 =841
此处 eval_cost=80,实则为 驱动表扇出*被驱动每次扫描行数*filtered*成本常数,即20*200*10%*0.2。
简化公式为: eval_cost=rows_produced_per_json*成本常数
IO成本= 4*1.0 =4
CPU成本= 1000*0.2 =200
t2表总成本= 前2表join的扇出*(IO成本+CPU成本) = 400*(4+200) =81600
阶段性总成本= 841+81600 =82441
此处 eval_cost=8000,即rows_produced_per_json*成本常数 ,即40000*0.2
根据执行计划成本分析:
这样看,3表 join 流程是:
注意,由于造的数据比较特殊 , 所以第 3 步得出的中间结果集实际上只有 1行,所以最终 t2 表的查找次数是20*1=20 ,所以扫描总行数是20*1000。所以单看 slow log 中显示的 24100 行,会误认为是先得出 t1 和 t3 join 的结果 , 再去和 t2 进行 join 。
当我调整 t3 的数据 , 删除20行,再插入20行,使满足 b21 的数据翻倍,这样“第 3 步得出的中间结果集”变成 2 行:
再来看slow log 中扫描的总行数为44100,t1、t3的扫描行数不变,t2 的扫描行数变为20*2*1000=40000 :
为什么执行计划中分析得到的是 t2 表查找 400 次呢?
因为执行计划对t1 join t3 的扇出是个估算值,不准确 。而 slow log 是真实执行后统计的,是个准确值 。
为什么执行计划中,t2表的执行次数是用“t1 join t3 的扇出”表示的?这不是说明 t1 先和 t3 join , 结果再和 t2 join?

推荐阅读