多个连续的left join连接顺序验证

时间:2022-10-09 19:55:30

  在实际工作中,很多情况下会用到外连接,尤其是做主页面的数据展示查询时,连续用到多个left join会很常见,这样的多个left join会怎么样执行呢,之前在网上查到的执行顺序是,顺序的从坐到右的连接表,例如有 a,b,c三张表的数据都需要查到,就需要进行连接查询,如 select *  from  a  left join b on a.id = b.id left join a.id = c.id,这时是怎么顺序进行执行的呢?

 上网找资料,我们得知是a表先和b表进行连接,会生成一张中间临时表,然后这张表的数据再和c表进行连接,最后生成的表的数据就是a left join b left join c 的。

我们实际进行跑库的验证:

有商品表(product),库存表(stock),价格表三张表(price),做连接,为了验证是第一、二张表的中间表和第三张表进行的连接,我们第一张和第二张表连接时让一部分第二张表的数据连接的字段是null,即sql:

SELECT a.goods_id,b.specification,c.money FROM product  a  LEFT JOIN stock  b 

ON a.goods_id = b.goods_id AND b.goods_id>5    -------让a表连接b表时goods_id<=5的连接不到b表数据,显示为null

LEFT JOIN   price c
ON a.goods_id  = c.goods_id   

即只执行 ab连接sql:SELECT a.goods_id,b.specification FROM product a LEFT JOIN stock  b ON a.goods_id = b.goods_id AND b.goods_id>5 

多个连续的left join连接顺序验证


再执行完整的sql,结果为:

多个连续的left join连接顺序验证


发现 goods_id 为1的对应8条c表数据,这8条均为c表的数据:

SELECT * FROM  price WHERE goods_id = 1

多个连续的left join连接顺序验证


a left join b on 条件1 left join c on 条件2 执行顺序是:先a和b进行连接,生成一张中间表d,然后再和c进行条件连接生成最后的表的数据 


 select * from a left join b on (a,b的连接条件)left join c on(a,b形成的临时中间表和c的连接条件)


如有问题,敬请指教