SQL 中 SELECT 語句的執行順序

 好像自已在書寫 SQL 語句時由於不清楚各個關鍵字的執行順序, 往往組織的 SQL 語句缺少很好的邏輯, 憑感覺 "拼湊" ( 不好意思, 如果您的 SQL 語句也經常 "拼湊", 那您是不是得好好反省一下呢?, 呵呵). 確實是爽了自己, 可苦了機器, 服務器還需要在我們的雜亂無章的 SQL 語句中尋找它下一句需要執行的關鍵字在哪裏. 效率嘛, 由於我們的感覺神經對秒以下的變化實在不敏感, 暫且就認爲自已寫的 SQL 順序無關緊要, "反正沒什麼變化!", 呵呵.其實服務器對每句 SQL 解析時間都會有詳細記錄的, 大家可以看一下自已按習慣寫的 SQL 和按標準順序寫的SQL解析時間差別有多大.
   因此, 建議大家在平時工作中 SQL 語句按標準順序寫, 一是專業, 二是實用, 呵呵, 不過我覺得最主要的是心裏感覺舒服.
   標準的 SQL 的解析順序爲:
   (1).FROM 子句, 組裝來自不同數據源的數據
   (2).WHERE 子句, 基於指定的條件對記錄進行篩選
   (3).GROUP BY 子句, 將數據劃分爲多個分組
   (4).使用聚合函數進行計算
   (5).使用 HAVING 子句篩選分組
   (6).計算所有的表達式
   (7).使用 ORDER BY 對結果集進行排序

   舉例說明: 在學生成績表中 (暫記爲 tb_Grade), 把 "考生姓名"內容不爲空的記錄按照 "考生姓名" 分組, 並且篩選分組結果, 選出 "總成績" 大於 600 分的.
   標準順序的 SQL 語句爲:
   select 考生姓名, max(總成績) as max總成績
   from tb_Grade
   where 考生姓名 is not null
   group by 考生姓名
   having max(總成績) > 600
   order by max總成績
  
   在上面的示例中 SQL 語句的執行順序如下:
   (1). 首先執行 FROM 子句, 從 tb_Grade 表組裝數據源的數據
   (2). 執行 WHERE 子句, 篩選 tb_Grade 表中所有數據不爲 NULL 的數據
   (3). 執行 GROUP BY 子句, 把 tb_Grade 表按 "學生姓名" 列進行分組
   (4). 計算 max() 聚集函數, 按 "總成績" 求出總成績中最大的一些數值
   (5). 執行 HAVING 子句, 篩選課程的總成績大於 600 分的.
   (7). 執行 ORDER BY 子句, 把最後的結果按 "Max 成績" 進行排序.

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