mysql簡單查詢語句的執行順序

轉自:http://www.cnblogs.com/rollenholt/p/3776923.html

這裏寫圖片描述
FORM: 對FROM的左邊的表和右邊的表計算笛卡爾積。產生虛表VT1
ON: 對虛表VT1進行ON篩選,只有那些符合的行纔會被記錄在虛表VT2中。
JOIN: 如果指定了OUTER JOIN(比如left join、 right join),那麼保留表中未匹配的行就會作爲外部行添加到虛擬表VT2中,產生虛擬表VT3, rug from子句中包含兩個以上的表的話,那麼就會對上一個join連接產生的結果VT3和下一個表重複執行步驟1~3這三個步驟,一直到處理完所有的表爲止。
WHERE: 對虛擬表VT3進行WHERE條件過濾。只有符合的記錄纔會被插入到虛擬表VT4中。
GROUP BY: 根據group by子句中的列,對VT4中的記錄進行分組操作,產生VT5.
CUBE | ROLLUP: 對錶VT5進行cube或者rollup操作,產生表VT6.
HAVING: 對虛擬表VT6應用having過濾,只有符合的記錄纔會被 插入到虛擬表VT7中。
SELECT: 執行select操作,選擇指定的列,插入到虛擬表VT8中。
DISTINCT: 對VT8中的記錄進行去重。產生虛擬表VT9.
ORDER BY: 將虛擬表VT9中的記錄按照進行排序操作,產生虛擬表VT10.
LIMIT:取出指定行的記錄,產生虛擬表VT11, 並將結果返回。

以下爲個人理解,便於加強記憶之用。
下面是一條簡單的單表查詢例子:
select good_id, good_name from goods where good_name in(‘Nokia’,’Sumsung’) group by good_name order by num;
上面用到了幾個常見的關鍵字查詢 其中group by 就不能出現在where前,這就是上面說的一個執行順序的原因,其實,自己仔細細想一下,也比較符合邏輯。查詢一條語句,首先必須得按照查詢語句中的條件得到一個結果集,再對這些查詢得到的結果集進行分組,最後可以利用having進行最後的過濾操作。對於最後的輸出結果(select),如果有必要可以使用order by進行排序(升序asc、降序desc)。

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