【數據庫】關於 mysql 的執行順序

Mysql 的執行順序:html

  1. from
  2. join
  3. on
  4. where
  5. group by (開始使用select中的別名,後面的語句中均可以使用)
  6. avg,sum...
  7. having
  8. select
  9. distinct
  10. order by

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

 

參考:

http://www.javashuo.com/article/p-hpflcnvm-cq.html

http://www.javashuo.com/article/p-xqpgxwmz-mm.html

相關文章
相關標籤/搜索