MySQL編程 基礎篇(二)SQL執行流程

對於查詢處理,可將其分爲邏輯查詢處理及物理查詢處理。邏輯查詢處理表示執行查詢應該產生什麼樣的結果,而物理查詢代表MySQL數據庫是如何得到該結果的。

邏輯查詢處理的順序以及步驟的序號,每一步操作都會產生一個虛擬表,該虛擬表作爲下一個處理的輸入。這些虛擬表對用戶是透明的,只有最後一步生成的虛擬表纔會返回給用戶,如果沒有在查詢中指定某一子句,則將跳過相應的步驟。

 

  1. from,左表和右表執行笛卡爾積,產生虛擬表VT1

  2. on,對虛擬表VT1應用on篩選,產生虛擬表VT2;在產生VT2時,會增加一個額外的列來表示ON過濾條件的返回值,返回值有TRUE、FALSE、UNKNOWN。

對於在ON過濾條件下的NULL值比較,此時的比較結果爲UNKNOWN,卻被視爲FALSE來進行處理,即兩個NULL並不相同。但是在下面兩種情況下認爲兩個NULL值的比較是相等的:GROUP BY子句把所有NULL值分到同一組。ORDER BY子句中把所有NULL值排列在一起。

  1. join,outer join,保留表中未匹配的行作爲外部行添加到虛擬表VT2中,from包含兩個以上表,重複執行1~3

  2. where

在當前應用WHERE過濾器時,有兩種過濾是不被允許的:由於數據還沒有分組,因此現在還不能在WHERE過濾器中使用 where_condition=MIN(col) 這類對統計的過濾。由於沒有進行列的選取操作,因此在SELECT中使用列的別名也是不被允許的,如SELECT city as c FROM t WHERE c='ShangHai'是不允許出現的。

  1. group byColumns selected for output can be referred to in ORDER BY and GROUP BY clauses using column names, column aliases, or column positions. Column positions are integers and begin with 1

  2. with

  3. having

  4. select,第二次執行SELECT操作,第一次是什麼時候呢?我猜是group by。

  5. distinct

  6. order by

  7. limit

 

SELECT查詢一共有3個過濾過程,分別是ON、WHERE、HAVING。ON是最先執行的過濾過程。

對於OUTER JOIN中的過濾,在ON過濾器過濾完之後還會添加保留表中被ON條件過濾掉的記錄,所以on中的過濾條件不可靠,而WHERE條件中被過濾掉的記錄則是永久的過濾。在INNER JOIN中兩者是沒有差別的,因爲沒有添加外部行的操作。

不要爲表中的行假定任何特定的順序。就是說,在實際使用環境中,如果確實需要有序輸出行記錄,則必須使用ORDER BY子句。

在MySQL數據庫中,NULL值在升序過程中總是首先被選出,即NULL值在ORDER BY子句中被視爲最小值

對於沒有應用ORDER BY的LIMIT子句,結果同樣可能是無序的,因此LIMIT子句通常和ORDER BY子句一起使用

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章