mysql中的on的執行順序_MySQL -- join , on , where 的執行順序


一、典型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的數據

二、from

如果是采用的 關聯 from tableA, tableB ,這2個表會先組織進行笛卡爾積,然后在進行下面的 where、group by 等操作。

三、on

如果使用left join, inner join 或者 outer full join的時候,使用on 進行條件篩選后,在進行join。

看下面的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 DISTINCTa.domain , b.domainFROMmal_nxdomains_raw aLEFT JOIN mal_nxdomains_detail b ON a.domain = b.domain AND b.date = '20160403'

WHERE a.date = '20160403'

 

SELECT DISTINCTa.domain , b.domainFROMmal_nxdomains_raw aLEFT 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 篩選的效果是一樣的。不能起到left join的作用。

五、join 流程

tableA join tableB, 從A表中拿出一條數據,到B表中進行掃描匹配。

所以A的行數決定查詢次數,B表的行數決定掃描范圍。例如A表100條,B表200表,需要100次從A表中取出一條數據到B表中進行200次的比對。

相對來說從A表取數據消耗的資源比較多。所以盡量tableA選擇比較小的表。同時縮小B表的查詢范圍。

但是實際應用中,因為二者返回的數據結果不同,使用的索引也不同,導致條件放置在on 和 where 效率是不一定誰更好。要根據需求來確定。
————————————————
版權聲明:本文為CSDN博主「宋夢寒」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/weixin_42527178/article/details/113195220


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM