⑴ sql的where子句查詢條件的執行順序
過濾掉最多數據最多的先執行,這些都是優化器做的事
⑵ 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語句的執行順序是什麼,為什麼下面這兩個sql執行的結果是一樣的
你這兩個sql語句只是運行順序不同
第一個sql語句你嵌套多一層子查詢,先把sum(case when right(jym,1) in(2,8) then jyje else 0 end)/100 兩個聚合函數算出來,然後在分組having直接過濾。
而第二個sql是在having的時候才去算sum(case when right(jym,1) in(2,8) then jyje else 0 end)/100 兩個聚合函數的值。
但是你最後都是用這個條件去過濾的,所以結果是一樣的
⑷ sql查詢語句的各個命令執行的標准順序是什麼為什麼
查詢語句是sql語句中使用最多的操作,也涉及到非常多的命令。比如where過濾,groupby分組,order
by
排序
limit取值
having等。雖然多,但是各個命令執行的時候卻是有順序的,順序如下:select
*from
表名①--
where
條件1②--
group
by
依據列③--
having
條件2④--
order
by
依據列⑤--
limit
0,1為什麼是這么個順序,原因:limit取值永遠是最後一個.如果你要order
by排序,前提是要首先得到一個查詢結果.查詢結果中的三個關鍵詞,where總是是放在表名的後面,而havin過濾永遠是放在group後面,所以就有了這么個順序.如果不遵循順序,就會出現錯誤。
⑸ 如何指定where中的執行順序
由於SQL優化起來比較復雜,並且還會受環境限制,在開發過程中,寫SQL必須必須要遵循以下幾點的原則:
1.ORACLE採用自下而上的順序解析WHERE子句,根據這個原理,表之間的連接必須寫在其他WHERE條件之前, 那些可以過濾掉最大數量記錄的條件必須寫在WHERE子句的末尾. 例如: (低效) SELECT … FROM EMP E WHERE SAL > 50000 AND JOB = 『MANAGER』 AND 25 < (SELECT COUNT(*) FROM EMP WHERE MGR=E.EMPNO); (高效) SELECT … FROM EMP E WHERE 25 < (SELECT COUNT(*) FROM EMP WHERE MGR=E.EMPNO) AND SAL > 50000 AND JOB = 『MANAGER』; 2.SELECT子句中避免使用』*』 當在SELECT子句中列出所有的COLUMN時,使用動態SQL列引用 『*』 是一個方便的方法.可是,這是一個非常低效的方法. 實際上,ORACLE在解析的過程中, 會將』*』 依次轉換成所有的列名, 這個工作是通過查詢數據字典完成的, 這意味著將耗費更多的時間. 3.使用表的別名(Alias) 當在SQL語句中連接多個表時, 請使用表的別名並把別名前綴於每個Column上.這樣一來,就可以減少解析的時間並減少那些由Column歧義引起的語法錯誤. 註:Column歧義指的是由於SQL中不同的表具有相同的Column名,當SQL語句中出現這個Column時,SQL解析器無法判斷這個Column的歸屬。
⑹ 資料庫中,select where group by having 執行順序
Group
By
和
Having,
Where
,Order
by這些關鍵字是按照如下順序進行執行的:Where,
Group
By,
Having,
Order
by。
一、使用count(列名)當某列出現null值的時候,count(*)仍然會計算,但是count(列名)不會。
二、數據分組(group
by
):
select
列a,聚合函數(聚合函數規范)
from
表明
where
過濾條件
group
by
列a
group
by
字句也和where條件語句結合在一起使用。當結合在一起時,where在前,group
by
在後。即先對select
xx
from
xx的記錄集合用where進行篩選,然後再使用group
by
對篩選後的結果進行分組。
三、使用having字句對分組後的結果進行篩選,語法和where差不多:having
條件表達式
需要注意having和where的用法區別:
1.having只能用在group
by之後,對分組後的結果進行篩選(即使用having的前提條件是分組)。
2.where肯定在group
by
之前,即也在having之前。
3.where後的條件表達式里不允許使用聚合函數,而having可以。
四、當一個查詢語句同時出現了where,group
by,having,order
by的時候,執行順序和編寫順序是:
1.執行where
xx對全表數據做篩選,返回第1個結果集。
2.針對第1個結果集使用group
by分組,返回第2個結果集。
3.針對第2個結果集中的每1組數據執行select
xx,有幾組就執行幾次,返回第3個結果集。
4.針對第3個結集執行having
xx進行篩選,返回第4個結果集。
5.針對第4個結果集排序。
拓展資料
當我們看到一個類似上述的包含了where,
group
by,
having,
order
by等關鍵字的SQL時,我們要首先要知道其執行順序是怎樣的,才能判斷出其所表達的含義;
下面列出其執行順序:
1.
根據where子句選擇行;
2.
根據group
by
子句組合行;
3.
根據having子句篩選組;
4.
根據order
by子句中的分組函數的結果對組進行排序,order
by必須使用分組函數或者使用Group
by子句中指定的列;
下面看一個例子:
我們現在知道,其執行順序如下:
1.基於Where
Rating>1
篩選出符合條件的行;
2.基於group
by
CategoryName
對篩選的結果進行分組;
3.為每個CategoryName組計算Count(*)
4.
基於having
CategoryName
like
'A%'留下符合條件的組
5.
根據order
by
的條件對剩下的行組進行排序,SQL中的count(*)也是分組函數。
⑺ GROUP BY,WHERE,HAVING之間的區別和用法
group by、having、where均為SQL語句中的函數。
一、區別
1、執行順序不同
在SQL語句中,where語句的執行順序先於group by,group by語句的執行順序先於having。
2、執行條件不同
在group by的SQL語句中,select中返回的欄位,必須包含在group by語句的後面,作為分組的依據,而且欄位包含在聚合函數中。
在having 的SQL語句中,having只能用於group by,having 子句中的每一個元素也必須出現在select列表中,having語句可以使用聚合函數。
where不使用聚合函數。
二、用法
1、where用於篩選查詢,通常用在select 的後面。
select city, count(*),age from dbo.user where departmentID=2;
2、group by用於對where的查詢結果進行分組,通常放在where之後。
select city, count(*),age from dbo.user where departmentID=2 group by city,age;
3、having一般放在group by之後,對where和group by查詢出來的分組進行過濾。
select city, count(*),age from dbo.user where departmentID=2 group by city,age having age >40;
(7)sql語句where執行順序擴展閱讀
ORDER BY子句中還經常會用到排序函數:ASC,DESC
其中,ASC表示升序,DESC為降序
排序函數一般放置在子句的末尾處,表示排序的方式。
例如:SELECT 課程編號,成績 FROM Score WHERE 學號=『2006091**1' ORDER BY 成績 ASC;
⑻ sql 語句中同時使用 top 、 where、 order by, 它們的執行順序是怎樣的
WHERE最先,根據WHERE條件先找出所有數據,WHERE內部的順序是從後往前,右往左。
然後是ORDER BY順序整理,如果是ORACLE使用ROWNUM控制就不是了。
最後是TOP N截出前N行。
⑼ SQL where 條件順序對性能的影響有哪些
SQL Select語句完整的執行順序:
1、from子句組裝來自不同數據源的數據;
2、where子句基於指定的條件對記錄行進行篩選;
1)where條件的執行順序是從右到左的;
2)where條件優先執行索引類條件;
3、group by子句將數據劃分為多個分組;
4、使用聚集函數進行計算;
5、使用having子句篩選分組;
6、計算所有的表達式;
7、使用order by對結果集進行排序