MySQL--join,on,where的执⾏顺序
⼀、典型SELECT语句完整的执⾏顺序
网页界面设计趋势1)from⼦句组装来⾃不同数据源的数据;
2)使⽤on进⾏join连接的数据筛选
3)where⼦句基于指定的条件对记录⾏进⾏筛选;
4)group by⼦句将数据划分为多个分组;
web前端培训论坛
5)cube, rollup
6)使⽤聚集函数进⾏计算;layim下载
7)使⽤having⼦句筛选分组;
8)计算所有的表达式;
9)计算select的字段;
10)使⽤distinct 进⾏数据去重
11)使⽤order by对结果集进⾏排序。
12)选择TOPN的数据
⼆、from
如果是采⽤的关联  from tableA, tableB ,这2个表会先组织进⾏笛卡尔积,然后在进⾏下⾯的  where、group by 等操作。
三、on
如果使⽤left join, inner join 或者 outer full join的时候,使⽤on 进⾏条件筛选后,在进⾏join。
mysql语句的执行顺序看下⾯的2个sql 和结果。2者的区别仅仅是在on后⾯的⼀个语句在on和where位置的不同。由此可以看出是先通过on 进⾏条件筛选,然后在join,最后在进⾏where条件筛选。
假如:是先进⾏join,在进⾏on的话,会产⽣⼀个笛卡尔积,然后在筛选。这样的left join 和直连接没有任何的区别。所以肯定是先on 条件筛选后,在进⾏join。
假如:是在进⾏where 后,在on,在进⾏join,下⾯2个sql的返回结果应该是⼀样的。由此可以见,where是针对 join 后的集合进⾏的筛选。
综上:先执⾏on 条件筛选,在进⾏join,最后进⾏where 筛选。
SELECT DISTINCT a.domain , b.domain
FROM mal_nxdomains_raw a
LEFT JOIN  mal_nxdomains_detail b ON a.domain = b.domain  AND b.date  ='20160403'
WHERE  a.date ='20160403'
SELECT DISTINCT a.domain , b.domain
FROM mal_nxdomains_raw a
LEFT JOIN  mal_nxdomains_detail b ON a.domain = b.domain  #and b.date  ='20160403'
WHERE  a.date ='20160403'
AND b.date  ='20160403'
四、on 条件与where 条件
使⽤位置
on 条件位置在join后⾯
where 条件在join 与on完成的后⾯
使⽤对象
华为手机数据线接口类型on 的使⽤对象是被关联表
where的使⽤对象可以是主表,也可以是关联表
选择与使⽤
主表条件筛选:只能在where后⾯使⽤。
被关联表,如果是想缩⼩join范围,可以放置到on后⾯。如果是关联后再查询,可以放置到where 后⾯。
如果left join 中,where条件有对被关联表的关联字段的⾮空查询,与使⽤inner join的效果后,在进⾏where 筛选的效果
dart中文文档是⼀样的。不能起到left join的作⽤。
五、join 流程
tableA join tableB,从A表中拿出⼀条数据,到B表中进⾏扫描匹配。
所以A的⾏数决定查询次数,B表的⾏数决定扫描范围。例如A表100条,B表200表,需要100次从A表中取出⼀条数据到B表中进⾏200次的⽐对。
相对来说从A表取数据消耗的资源⽐较多。所以尽量tableA选择⽐较⼩的表。同时缩⼩B表的查询范围。
但是实际应⽤中,因为⼆者返回的数据结果不同,使⽤的索引也不同,导致条件放置在on 和 where 效率是不⼀定谁更好。要根据需求来确定。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。