激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數(shù)據(jù)庫技術(shù)|

服務(wù)器之家 - 數(shù)據(jù)庫 - Sql Server - SQLServer中SELECT語句的執(zhí)行順序

SQLServer中SELECT語句的執(zhí)行順序

2019-11-25 15:27MSSQL教程網(wǎng) Sql Server

關(guān)于Sql中Select語句的執(zhí)行順序,一直很少注意這個問題,對于關(guān)鍵字的使用也很隨意,至于效率問題,因為表中的數(shù)據(jù)量都不是很大,所以也不是很在意。

今天在寫一條語句的時候,在查詢分析器里邊執(zhí)行 
要用10s,換用另外一種寫法只用少于1s的時間,同事說是因為Sql句語執(zhí)行順序的原因。之前看過一點相 
關(guān)的書,有一點印象,到網(wǎng)上找了資料,學習下。 
邏輯查詢處理步驟 

復制代碼代碼如下:


(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> 


每個步驟產(chǎn)生一個虛擬表,該虛擬表被用作下一個步驟的輸入。只有最后一步生成的表返回給調(diào)用者。如 
果沒有某一子句,則跳過相應(yīng)的步驟。 
1. FROM:對FROM子句中的前兩個表執(zhí)行笛卡爾積,生成虛擬表VT1。 
2. ON:對VT1應(yīng)用ON篩選器。只有那些使<join_condition>為真的行才被插入VT2。 
3. OUTER(JOIN):如果指定了OUTER JOIN,保留表中未找到匹配的行將作為外部行添加到VT2,生成VT3。 
如果FROM子句包含兩個以上的表,則對上一個聯(lián)接生成的結(jié)果表和下一個表重復執(zhí)行步驟1到步驟3,直到 
處理完所有的表為止。 
4. 對VT3應(yīng)用WHERE篩選器。只有使<where_condition>為TRUE的行才被插入VT4。 
5. GROUP BY:按GROUP BY 子句中的列列表對VT4中的行分組,生成VT5。 
6. CUBE|ROLLUP:把超組插入VT5,生成VT6。 
7. HAVING:對VT6應(yīng)用HAVING篩選器。只有使<having_condition>為TRUE的組才會被插入VT7。 
8. SELECT:處理SELECT列表,產(chǎn)生VT8。 
9. DISTINCT:將重復的行從VT8中移除,產(chǎn)生VT9。 
10. ORDER BY:將VT9中的行按ORDER BY子句中的列列表排序,生成一個有表(VC10)。 
11. TOP:從VC10的開始處選擇指定數(shù)量或比例的行,生成表VT11,并返回給調(diào)用者。 
以下是其它網(wǎng)友的補充: 
好像自已在書寫 SQL 語句時由于不清楚各個關(guān)鍵字的執(zhí)行順序, 往往組織的 SQL 語句缺少很好的邏輯, 憑感覺 "拼湊" ( 不好意思, 如果您的 SQL 語句也經(jīng)常 "拼湊", 那您是不是得好好反省一下呢?, 呵呵). 
這樣做確實是爽了自己, 可苦了機器, 服務(wù)器還需要在我們的雜亂無章的 SQL 語句中尋找它下一句需要執(zhí)行的關(guān)鍵字在哪里. 
效率嘛, 由于我們的感覺神經(jīng)對秒以下的變化實在不敏感, 暫且就認為自已寫的 SQL 順序無關(guān)緊要, "反正沒什么變化!", 呵呵.其實服務(wù)器對每句 SQL 解析時間都會有詳細記錄的, 大家可以看一下自已按習慣寫的 SQL 和按標準順序?qū)懙腟QL解析時間差別有多大. 
因此, 建議大家在平時工作中 SQL 語句按標準順序?qū)? 一是專業(yè), 二是實用, 呵呵, 不過我覺得最主要的是心里感覺舒服. 
標準的 SQL 的解析順序為: 
(1).FROM 子句, 組裝來自不同數(shù)據(jù)源的數(shù)據(jù) 
(2).WHERE 子句, 基于指定的條件對記錄進行篩選 
(3).GROUP BY 子句, 將數(shù)據(jù)劃分為多個分組 
(4).使用聚合函數(shù)進行計算 
(5).使用 HAVING 子句篩選分組 
(6).計算所有的表達式 
(7).使用 ORDER BY 對結(jié)果集進行排序 
舉例說明: 在學生成績表中 (暫記為 tb_Grade), 把 "考生姓名"內(nèi)容不為空的記錄按照 "考生姓名" 分組, 并且篩選分組結(jié)果, 選出 "總成績" 大于 600 分的. 
標準順序的 SQL 語句為: 
select 考生姓名, max(總成績) as max總成績 
from tb_Grade 
where 考生姓名 is not null 
group by 考生姓名 
having max(總成績) > 600 
order by max總成績 
在上面的示例中 SQL 語句的執(zhí)行順序如下: 
(1). 首先執(zhí)行 FROM 子句, 從 tb_Grade 表組裝數(shù)據(jù)源的數(shù)據(jù) 
(2). 執(zhí)行 WHERE 子句, 篩選 tb_Grade 表中所有數(shù)據(jù)不為 NULL 的數(shù)據(jù) 
(3). 執(zhí)行 GROUP BY 子句, 把 tb_Grade 表按 "學生姓名" 列進行分組 
(4). 計算 max() 聚集函數(shù), 按 "總成績" 求出總成績中最大的一些數(shù)值 
(5). 執(zhí)行 HAVING 子句, 篩選課程的總成績大于 600 分的. 
(7). 執(zhí)行 ORDER BY 子句, 把最后的結(jié)果按 "Max 成績" 進行排序. 
好了,看了這些之后,我相信大家都知道了SQL中select語句的執(zhí)行順序了吧!哈哈!

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 午夜精品毛片 | 亚洲精品aaaaa | 成人片在线播放 | 精品一区二区三区在线播放 | 国产成人高清在线观看 | 在线播放污| 一区二区三区日韩在线观看 | 欧美精品一区二区视频 | 日本娇小18xxxⅹhd | 爽妇网国产精品 | 7777奇米成人四色影视 | 嫩呦国产一区二区三区av | 日日操操 | 国产精品视频一区二区三区综合 | 免费91在线| 美女黄色影院 | 把娇妻调教成暴露狂 | 91精品国产777在线观看 | 天天色狠狠干 | 日本欧美一区二区三区视频麻豆 | 久草成人在线 | 91精品国产综合久久婷婷香蕉 | 9999在线视频 | 羞羞的视频在线观看 | 牛牛a级毛片在线播放 | 99国语露脸久久精品国产ktv | 亚洲一区久久久 | 天天透天天狠天天爱综合97 | 国产毛片在线高清视频 | 伊人一二三四区 | 日韩视频一区二区三区在线观看 | 日本成人在线免费 | 国产亚洲精品久久久久久网站 | 国产 日韩 一区 | 一级黄色毛片免费 | 想要xx在线观看 | 久久免费视频一区二区三区 | 狠狠干91| 中国a级黄色片 | 91精品国产91热久久久做人人 | 一区二区三区四区视频在线观看 |