mysql查詢語句join、on、where的執(zhí)行順序
MySQL 的執(zhí)行順序
一、典型SELECT語句完整的執(zhí)行順序
1)from子句組裝來自不同數(shù)據(jù)源的數(shù)據(jù);
2)使用on進行join連接的數(shù)據(jù)篩選
3)where子句基于指定的條件對記錄行進行篩選;
4)group by子句將數(shù)據(jù)劃分為多個分組;
5)cube, rollup
6)使用聚集函數(shù)進行計算;
7)使用having子句篩選分組;
8)計算所有的表達式;
9)計算select的字段;
10)使用distinct 進行數(shù)據(jù)去重
11)使用order by對結(jié)果集進行排序。
12)選擇TOPN的數(shù)據(jù)
二、from
如果是采用的 關(guān)聯(lián) from tableA, tableB ,這2個表會先組織進行笛卡爾積,然后在進行下面的 where、group by 等操作。
三、on
如果使用left join, inner join 或者 outer full join的時候,使用on 進行條件篩選后,在進行join。
看下面的2個sql 和結(jié)果。2者的區(qū)別僅僅是在on后面的一個語句在on和where位置的不同。 由此可以看出是先通過on 進行條件篩選,然后在join,最后在進行where條件篩選。
- 假如:是先進行join,在進行on的話,會產(chǎn)生一個笛卡爾積,然后在篩選。這樣的left join 和 直連接 沒有任何的區(qū)別。 所以肯定是先on 條件篩選后,在進行join。
- 假如:是在進行where 后,在on,在進行join, 下面2個sql的返回結(jié)果應該是一樣的。由此可以見,where是針對 join 后的集合進行的篩選。
綜上: 先 執(zhí)行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 條件
1、使用位置
on 條件位置在join后面
where 條件在join 與on完成的后面
2、使用對象
on 的使用對象是被關(guān)聯(lián)表
where的使用對象可以是主表,也可以是關(guān)聯(lián)表
3、選擇與使用
主表條件篩選:只能在where后面使用。
被關(guān)聯(lián)表,如果是想縮小join范圍,可以放置到on后面。如果是關(guān)聯(lián)后再查詢,可以放置到where 后面。
如果left join 中,where條件有對被關(guān)聯(lián)表的 關(guān)聯(lián)字段的 非空查詢,與使用inner join的效果后,在進行where 篩選的效果是一樣的。不能起到left join的作用。
五、join 流程
tableA join tableB, 從A表中拿出一條數(shù)據(jù),到B表中進行掃描匹配。所以A的行數(shù)決定查詢次數(shù),B表的行數(shù)決定掃描范圍。例如A表100條,B表200表,需要100次從A表中取出一條數(shù)據(jù)到B表中進行200次的比對。
相對來說從A表取數(shù)據(jù)消耗的資源比較多。所以盡量tableA選擇比較小的表。同時縮小B表的查詢范圍。
但是實際應用中,因為二者返回的數(shù)據(jù)結(jié)果不同,使用的索引也不同,導致條件放置在on 和 where 效率是不一定誰更好。要根據(jù)需求來確定。
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
MySQL Delete 刪數(shù)據(jù)后磁盤空間未釋放的原因
這篇文章主要介紹了MySQL Delete 刪數(shù)據(jù)后磁盤空間未釋放的原因,幫助大家更好的理解和學習使用MySQL,感興趣的朋友可以了解下2021-05-05MySQL中SELECT+UPDATE處理并發(fā)更新問題解決方案分享
這篇文章主要介紹了MySQL中SELECT+UPDATE處理并發(fā)更新問題解決方案分享,需要的朋友可以參考下2014-05-05centos7環(huán)境下二進制安裝包安裝 mysql5.6的方法詳解
這篇文章主要介紹了centos7環(huán)境下二進制安裝包安裝 mysql5.6的方法,詳細分析了centos7環(huán)境下使用二進制安裝包安裝 mysql5.6的具體步驟、相關(guān)命令、配置方法及操作注意事項,需要的朋友可以參考下2020-02-02MySQL數(shù)據(jù)庫之內(nèi)置函數(shù)和自定義函數(shù) function
這篇文章主要介紹了MySQL數(shù)據(jù)庫之內(nèi)置函數(shù)和自定義函數(shù) function,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,感興趣的小伙伴可以參考一下2022-06-06