Mysql 的執行順序:html
from:sql
從這個語句中能夠發現,全部的查詢語句都是從 from 中開始執行的,在執行過程當中,每一個步驟都會爲下一個步驟生成一個虛表,這個虛表做爲下個執行步驟的輸入。其中,from 中表的合併是使用笛卡爾積。.net
join:htm
若是是outer join 那麼這一步就將添加外部行,left outer jion 就把左表在第二步中過濾的添加進來,若是是right outer join 那麼就將右表在第二步中過濾掉的行添加進來,這樣生成虛擬表。blog
on 和 where 的區別:排序
on 邏輯表達式先執行,where但最大的區別是在包含outer join子句中的查詢,on 條件是在生成臨時表時鏈接的條件,而 where 是在臨時表生成之後,再對臨時表進行過濾的條件。能夠這樣理解,on 負責鏈接,where 負責篩選。get
舉個例子:如今有一個學生表(班級,學號)和一個成績表(學號,成績)我如今須要返回一個x班級的全體學生的成績,可是這個班級有幾個學生缺考了,也就是說再成績表中沒有記錄,爲了獲得咱們預期的結果,首先咱們須要用 on 指定學生和成績表的關係(學生.姓名 = 成績.姓名),此時沒有參加們被 on 的邏輯表達過濾掉了,可是他們又會被 left join 找回來,此時就須要 where 進行最終篩選。io
order by:select
order by 返回的是一個遊標,而不是虛擬表。遊標是包含特定物理順序的邏輯組織,而虛擬表的順序是可有可無的。由於排序很須要成本,因此除非是須要排序,不然最好別用。qq
參考: