Ⅰ sql執行順序以及on和where的區別
(1.)select語句的執行順序
Processing Order of the SELECT statement
The 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, 中間沒有其它步驟.
Ⅱ SQL中的ON和WHERE有什麼區別啊謝謝
本質上的區別不是很清楚.
實際應用中的,比較了解,on 條件是用於外鍵連接,where 條件是用於篩選紀錄.
on可適用於多條記錄,asp批量處理時候常用.where必將常見於單條記錄讀取查詢.
而且on一般跟join連用的,where是條件語句,聽說在有索引的情況下,join的效率會更快點,但具體沒親自測試過.
where是SQL-89語法,用on是SQL-92語法,都還沒過時,具體看實際用途進行選擇.
Ⅲ SQL左右連接中的on and和on where的區別
on and 是指這前後兩個表連接的條件 不止一個條件,兩個表會按所有條件進行前後連接,這on和and左右出現的是列與列的關系。他是A和B全部數據按要求的連接。
on where 是指這前後兩個表的連接條件只有on後面的一個,然後對連接好的結果,去執行where條件查詢,where後面的列可以不是連接相關的列,where後面出現的是某一個列的條件,是對行的篩選條件,不是列與列的連接關系。where是對A或B篩選之後的數據再去按照ON的條件去連接
比如select * from employee A join Salary B on A.name=B.name and A.ID=B.ID
select * from employee A join Salary B on A.name=B.name where A.ID='111'
你感受下
Ⅳ sql where後面多個條件是或者的關系怎麼寫
1、創建測試表,create table test_condition(id number, value varchar2(200));
Ⅳ sql語句中的left join on 中的on是什麼意思on後邊必須跟兩個表中的主鍵欄位嗎
on是篩選條件,篩選兩個表之間的關系,on後面僅要兩表的值有一定的聯系就可以,是值有聯系即可,不必是主鍵
Ⅵ SQL中連接表時,什麼時候用where 什麼時候用on作為限制條件
一般on是關聯2個表欄位,where只是通過某個表條件來限制結果。
Ⅶ SQL中ON和WHERE的區別
1、 on條件是在生成臨時表時使用的條件,它不管on中的條件是否為真,都會返回左邊表中的記錄。
2、where條件是在臨時表生成好後,再對臨時表進行過濾的條件。這時已經沒有left join的含義(必須返回左邊表的記錄)了,條件不為真的就全部過濾掉。
Ⅷ sql的on有什麼用
on 是關聯條件,『當...的時候』的意思
作用類似WHERE.
只有用join 的時候 才用.
有:
inner join ...on
left outer join ...on
right outer join ...on
幾種情況.
如:
SELECT *
FROM TABALE1 A
LEFT OUTER JOIN TABLE2 B ON A.COL1=B.COL2.