国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

sql執行順序以及on和where的區別

2019-11-08 19:47:16
字體:
來源:轉載
供稿:網友
(1.)select語句的執行順序

PRocessing Order of the SELECT statementThe following steps show the processing order for a SELECT statement.

1.FROM

2.ON

3.JOIN

4.WHERE

5.GROUP BY

6.WITH CUBE or WITH ROLLUP

7.HAVING

8.SELECT

9.DISTINCT

10.ORDER BY

11.TOP

(5)SELECT DISTINCT

(7)TOP(<top_specification>) <select_list>                      

(1)FROM <left_table> <join_type> JOIN <right_table> ON <on_predicate> 

(2)WHERE <where_predicate>

(3)GROUP BY <group_by_specification>

(4)HAVING <having_predicate>

(6)ORDER BY <order_by_list>

T-SQL在查詢各個階級分別干了什么:

(1)FROM 階段

    FROM階段標識出查詢的來源表,并處理表運算符。在涉及到聯接運算的查詢中(各種join),主要有以下幾個步驟:

  a.求笛卡爾積。不論是什么類型的聯接運算,首先都是執行交叉連接(cross join),求笛卡兒積,生成虛擬表VT1-J1。

      b.ON篩選器。這個階段對上個步驟生成的VT1-J1進行篩選,根據ON子句中出現的謂詞進行篩選,讓謂詞取值為true的行通過了考驗,插入到VT1-J2。

      c.添加外部行。如果指定了outer join,還需要將VT1-J2中沒有找到匹配的行,作為外部行添加到VT1-J2中,生成VT1-J3。

    經過以上步驟,FROM階段就完成了。概括地講,FROM階段就是進行預處理的,根據提供的運算符對語句中提到的各個表進行處理(除了join,還有apply,pivot,unpivot)

(2)WHERE階段

     WHERE階段是根據<where_predicate>中條件對VT1中的行進行篩選,讓條件成立的行才會插入到VT2中。

(3)GROUP BY階段

      GROUP階段按照指定的列名列表,將VT2中的行進行分組,生成VT3。最后每個分組只有一行。

(4)HAVING階段

      該階段根據HAVING子句中出現的謂詞對VT3的分組進行篩選,并將符合條件的組插入到VT4中。

(5)SELECT階段

  這個階段是投影的過程,處理SELECT子句提到的元素,產生VT5。這個步驟一般按下列順序進行

        a.計算SELECT列表中的表達式,生成VT5-1。

        b.若有DISTINCT,則刪除VT5-1中的重復行,生成VT5-2

        c.若有TOP,則根據ORDER BY子句定義的邏輯順序,從VT5-2中選擇簽名指定數量或者百分比的行,生成VT5-3

(6)ORDER BY階段

     根據ORDER BY子句中指定的列明列表,對VT5-3中的行,進行排序,生成游標VC6.

如果On和where只能選其一的話:

先進行on的過濾, 而后才進行join, 這樣就避免了兩個大表產生全部數據的笛卡爾積的龐大數據. 

這些步驟執行時, 每個步驟都會產生一個虛擬表,該虛擬表被用作下一個步驟的輸入。這些虛擬表對調用者(客戶端應用程序或者外部查詢)不可用。只是最后一步生成的表才會返回 給調用者。

如果沒有在查詢中指定某一子句,將跳過相應的步驟。(2) 那 on 和where 那個更高效呢如果是inner join, 放on和放where產生的結果一樣, 但沒說哪個效率速度更高? 如果有outer join (left or right), 就有區別了, 因為on生效在先, 已經提前過濾了一部分數據, 而where生效在后.

綜合一下, 感覺還是放在on里更有效率, 因為它先于where執行. 先笛卡爾積, 然后再on過濾, 如果join是inner的, 就繼續往下走, 如果join 是left join, 就把on過濾掉的左主表中的數據再添加回來; 然后再執行where里的過濾;

on中不是最終過濾, 因為后面left join還可能添加回來, 而where才是最終過濾.

只有當使用外連接(left, right)時, on 和 where 才有這個區別, 如果用inner join, 在哪里制定都一樣, 因為on 之后就是where, 中間沒有其它步驟.


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 财经| 揭东县| 黄平县| 江口县| 华蓥市| 吴堡县| 蒙阴县| 林西县| 丰宁| 江永县| 洛扎县| 潢川县| 电白县| 宜州市| 墨竹工卡县| 台山市| 青阳县| 凤城市| 山阳县| 姜堰市| 台东市| 江永县| 定结县| 巴林右旗| 甘谷县| 满城县| 政和县| 朝阳区| 北辰区| 延寿县| 尚志市| 金华市| 吉安县| 阳谷县| 象山县| 鄂温| 辽中县| 南华县| 新巴尔虎右旗| 卓资县| 无为县|