SQLServer中SELECT語句的履行次序。本站提示廣大學習愛好者:(SQLServer中SELECT語句的履行次序)文章只能為提供參考,不一定能成為您想要的結果。以下是SQLServer中SELECT語句的履行次序正文
明天在寫一條語句的時刻,在查詢剖析器裡邊履行
要用10s,換用別的一種寫法只用少於1s的時光,同事說是由於Sql句語履行次序的緣由。之前看過一點相
關的書,有一點印象,到網上找了材料,進修下。
邏輯查詢處置步調
(8)SELECT (9)DISTINCT
(11)<TOP_specification> <select_list>
(1)FROM <left_table>
(3) <join_type> JOIN <right_table>
(2) ON <join_condition>
(4)WHERE <where_condition>
(5)GROUP BY <group_by_list>
(6)WITH {CUBE | ROLLUP}
(7)HAVING <having_condition>
(10)ORDER BY <order_by_list>
每一個步調發生一個虛擬表,該虛擬表被用作下一個步調的輸出。只要最初一步生成的表前往給挪用者。如
果沒有某一子句,則跳過響應的步調。
1. FROM:對FROM子句中的前兩個表履行笛卡爾積,生成虛擬表VT1。
2. ON:對VT1運用ON挑選器。只要那些使<join_condition>為真的行才被拔出VT2。
3. OUTER(JOIN):假如指定了OUTER JOIN,保存表中未找到婚配的即將作為內部行添加到VT2,生成VT3。
假如FROM子句包括兩個以上的表,則對上一個聯接生成的成果表和下一個表反復履行步調1到步調3,直到
處置完一切的表為止。
4. 對VT3運用WHERE挑選器。只要使<where_condition>為TRUE的行才被拔出VT4。
5. GROUP BY:按GROUP BY 子句中的列列表對VT4中的行分組,生成VT5。
6. CUBE|ROLLUP:把超組拔出VT5,生成VT6。
7. HAVING:對VT6運用HAVING挑選器。只要使<having_condition>為TRUE的組才會被拔出VT7。
8. SELECT:處置SELECT列表,發生VT8。
9. DISTINCT:將反復的行從VT8中移除,發生VT9。
10. ORDER BY:將VT9中的行按ORDER BY子句中的列列表排序,生成一個有表(VC10)。
11. TOP:從VC10的開端處選擇指定命量或比例的行,生成表VT11,並前往給挪用者。
以下是其它網友的彌補:
似乎自已在書寫 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 成就" 停止排序.
好了,看了這些以後,我信任年夜家都曉得了SQL中select語句的履行次序了吧!哈哈!