當前位置:首頁 » 編程語言 » sqlselect執行順序
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

sqlselect執行順序

發布時間: 2023-01-11 06:55:04

sql的執行順序 與 游標

最近項目中使用了很多大sql,在編碼時sql經常出現執行錯誤,記錄下sql的執行順序,在編碼時就考慮全面,省的之後還要繼續花時間進行試驗調試。

(8)SELECT (9)DISTINCT (11)<Top Num> <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子句中的前兩個表執行笛卡爾積(Cartesian proct)(交叉聯接),生成虛擬表VT1

2.ON: 對VT1應用ON篩選器。只有那些使為真的行才被插入VT2。

3.OUTER(JOIN): 如 果指定了OUTER JOIN(相對於CROSS JOIN 或(INNER JOIN),保留表(preserved table:左外部聯接把左表標記為保留表,右外部聯接把右表標記為保留表,完全外部聯接把兩個表都標記為保留表)中未找到匹配的行將作為外部行添加到 VT2,生成VT3.如果FROM子句包含兩個以上的表,則對上一個聯接生成的結果表和下一個表重復執行步驟1到步驟3,直到處理完所有的表為止。

4.WHERE: 對VT3應用WHERE篩選器。只有使為true的行才被插入VT4.

5.GROUP BY: 按GROUP BY子句中的列列表對VT4中的行分組,生成VT5.

6.CUBE|ROLLUP: 把超組(Suppergroups)插入VT5,生成VT6.

7.HAVING: 對VT6應用HAVING篩選器。只有使為true的組才會被插入VT7.

8.SELECT: 處理SELECT列表,產生VT8.

9.DISTINCT: 將重復的行從VT8中移除,產生VT9.

10.ORDER BY: 將VT9中的行按ORDER BY 子句中的列列表排序,生成游標(VC10).

11.TOP: 從VC10的開始處選擇指定數量或比例的行,生成表VT11,並返回調用者。

註:步驟10,按ORDER BY子句中的列列表排序上步返回的行,返回遊標VC10.這一步是第一步也是唯一一步可以使用SELECT列表中的列別名的步驟。這一步不同於其它步驟的 是,它不返回有效的表,而是返回一個游標。SQL是基於集合理論的。集合不會預先對它的行排序,它只是成員的邏輯集合,成員的順序無關緊要。對表進行排序 的查詢可以返回一個對象,包含按特定物理順序組織的行。ANSI把這種對象稱為游標。理解這一步是正確理解SQL的基礎。

因為這一步不返回表(而是返回遊標),使用了ORDER BY子句的查詢不能用作表表達式。表表達式包括:視圖、內聯表值函數、子查詢、派生表和共用表達式。它的結果必須返回給期望得到物理記錄的客戶端應用程序。例如,下面的派生表查詢無效,並產生一個錯誤:select * from(select orderid,customerid from orders order by orderid) as d

在SQL中,表表達式中不允許使用帶有ORDER BY子句的查詢,而在T—SQL中卻有一個例外(應用TOP選項)。所以要記住,不要為表中的行假設任何特定的順序。換句話說,除非你確定要有序行,否則不要指定ORDER BY 子句。排序是需要成本的,SQL Server需要執行有序索引掃描或使用排序運行符。

參考:

https://www.cnblogs.com/knowledgesea/p/3699851.html

https://www.cnblogs.com/

Ⅱ 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後面,所以就有了這么個順序.如果不遵循順序,就會出現錯誤。

資料庫中,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(*)也是分組函數。

Ⅳ sql left join 的執行順序

SQL語句執行的時候是有一定順序的。理解這個順序對SQL的使用和學習有很大的幫助。

1.from   先選擇一個表,或者說源頭,構成一個結果集。

2.where 然後用where對結果集進行篩選。篩選出需要的信息形成新的結果集.

3.group by 對新的結果集分組.

4.having 篩選出想要的分組.

5.select 選擇列

6.order by 當所有的條件都弄完了。最後排序

我的理解是這樣,SQL語句中無論是否連接的其他表。 無論如何都要先形成一個結果集。後面的順序不變!

只不過使用連接時,形成結果集合的方式略有不同。這個和 Left Join的實現原理有關。

select a.name,b.name

from T_left a            //1

Left Join T_Right b   //3

ON  a.id = b.id         //2

使用Left Join 形成結果集的方式是這樣的。

.  首先對From子句中的前兩個表,執行笛卡爾積運算。運算結果 形成一個結果集合。

.  ON按條件,對上邊的結果集,進行篩選,形成新的結果集。

.  以左連接為例,如果T_left中存在未匹配到的行。那麼把T_left中的這幾行以外部行的形式加到上邊的結果集中形成新的結果集。

 如果存在多張表,重復1~3過程!

select * from A left join B on A.aid = B.bid right join C on A.aid =C.cid;

// 最終返回的是 C 表中的數據,

1.A left join B 返回A表數據,附帶B表中符合條件的數據 

2.A left join B 假設等於結果 AB 

3.AB right join C 返回C,附帶AB中符合條件的數據

Ⅳ sql語句執行順序

1、先執行from,join來確定表之間的連接關系,得到初步的數據。

2、where對數據進行普通的初步的篩選。

3、group by 分組。

4、各組分別執行having中的普通篩選或者聚合函數篩選。

5、然後把再根據我們要的數據進行select,可以是普通欄位查詢也可以是獲取聚合函數的查詢結果,如果是集合函數,select的查詢結果會新增一條欄位。

6、將查詢結果去重distinct。

7、最後合並各組的查詢結果,按照order by的條件進行排序。

SQL語句性能優化:

1, 對查詢進行優化,應盡量避免全表掃描,首先應考慮在 where 及 order by 涉及的列上建立索引。

2,應盡量避免在 where 子句中對欄位進行 null 值判斷,創建表時NULL是默認值,但大多數時候應該使用NOT NULL,或者使用一個特殊的值,如0,-1作為默 認值。

3,應盡量避免在 where 子句中使用!=或<>操作符, MySQL只有對以下操作符才使用索引:<,<=,=,>,>=,BETWEEN,IN,以及某些時候的LIKE。

4,應盡量避免在 where 子句中使用 or 來連接條件, 否則將導致引擎放棄使用索引而進行全表掃描, 可以 使用UNION合並查詢:select id from t where num=10 union all select id from t where num=20



Ⅵ sas中sql中的優先順序

sql執行順序優先順序由高到低依次是:from關鍵字後面的語句、where關鍵字後面的語句、「group by」後面的語句、select後面的語句、「order by」後面的語句。

php入門到就業線上直播課:進入學習

這一條語句包含我們經常用到的一些關鍵字,select,from,where,group by,order by,它的執行順序如下:
先執行from關鍵字後面的語句,明確數據的來源,它是從哪張表取來的。
接著執行where關鍵字後面的語句,對數據進行篩選。
再接著執行group by後面的語句,對數據進行分組分類。
然後執行select後面的語句,也就是對處理好的數據,具體要取哪一部分。
最後執行order by後面的語句,對最終的結果進行排序。

Ⅶ Hive SQL語句執行順序

Hive 中 sql 語句的執行順序如下:

from .. where .. join .. on .. select .. group by .. select .. having .. distinct .. order by .. limit .. union/union all

下面我們通過一個 sql 語句分析下:

上面這條 sql 語句是可以成功執行的,我們看下它在 MR 中的執行順序:

Map 階段

Rece 階段

上面這個執行順序到底對不對呢,我們可以通過 explain 執行計劃來看下,內容過多,我們分階段來看。

我們看到 Stage-5 是根,也就是最先執行 Stage-5,Stage-2 依賴 Stage-5,Stage-0 依賴 Stage-2。

圖中標 ① 處是表掃描操作,注意先掃描的 b 表,也就是 left join 後面的表,然後進行過濾操作(圖中標 ② 處),我們 sql 語句中是對 a 表進行的過濾,但是 Hive 也會自動對 b 表進行相同的過濾操作,這樣可以減少關聯的數據量。

先掃描 a 表(圖中標 ① 處);接下來進行過濾操作 idno > �'(圖中標 ② 處);然後進行 left join,關聯的 key 是 idno(圖中標 ③ 處);執行完關聯操作之後會進行輸出操作,輸出的是三個欄位,包括 select 的兩個欄位加 group by 的一個欄位(圖中標 ④ 處);然後進行 group by 操作,分組方式是 hash(圖中標 ⑤ 處);然後進行排序操作,按照 idno 進行正向排序(圖中標 ⑥ 處)。

首先進行 group by 操作,注意此時的分組方式是 mergepartial 合並分組(圖中標 ① 處);然後進行 select 操作,此時輸出的欄位只有兩個了,輸出的行數是 30304 行(圖中標 ② 處);接下來執行 having 的過濾操作,過濾出 count_user>1 的欄位,輸出的行數是 10101 行(圖中標 ③ 處);然後進行 limit 限制輸出的行數(圖中標 ④ 處);圖中標 ⑤ 處表示是否對文件壓縮,false 不壓縮。

限制最終輸出的行數為 10 行。

通過上面對 SQL 執行計劃的分析,總結以下幾點:

Ⅷ SQL SELECT語句總結(一)

SELECT查詢基本語法:

5. SELECT  COLUMN_LIST

1. FROM TABLE_NAME

2. WHERE

3. GROUP BY

4. HAVING

6. ORDER BY

7. OFFSET

8. FETCH

SELECT語句的執行順序如上,上一步返回一個結果集,下一步操作該結果集,然後返回新的結果集給再下一步,注意1是FROM,5是SELECT,6是ORDER BY。

這樣就很好了解GROUP BY 和HAVING之間的關系了,先GROUP BY分組得出一個結果集,但是該結果集中的數據並不是我們都想要的,HAVING語句就是用來篩選這個結果集,來獲得我們想要的結果。

SELECT DEPTNO, COUNT(*)

FROM EMP

GROUP BY DEPTNO

HAVING COUNT(*) > 2

    AND AVG(SAL) <4000;

1. 既然已經根據DEPTNO分組了,那在SELECT後,就應該有分組欄位DEPTNO。

2. 如果只根據DEPTNO分組,那分組後的結果集,每行就是一個唯一的DEPTNO。

3. 在HAVING中,無論是COUNT(*)還是AVG(SAL)都是組的屬性,COUNT(*)是每組中數據的行數,AVG(SAL)是每組的平均工資。

Ⅸ sql執行順序

我們先執行from,join來確定表之間的連接關系,得到初步的數據where對數據進行普通的初步的篩選group by 分組各組。

電腦:華為MateBook14

系統:Windows10

軟體:本地設置1.0MySql資料庫

1、from

先確定從哪個表中取數據,所以最先執行from tab。存在多表連接,from tab1,tab2。可以對表加別名,方便後面的引用。

Ⅹ SQL執行順序

查詢語句中select from where group by having order by的執行順序

1.查詢中用到的關鍵詞主要包含六個,並且他們的順序依次為 

select--from--where--group by--having--order by 

其中select和from是必須的,其他關鍵詞是可選的,這六個關鍵詞的執行順序 

與sql語句的書寫順序並不是一樣的,而是按照下面的順序來執行 

from--where--group by--having--select--order by, 

from:需要從哪個數據表檢索數據 

where:過濾表中數據的條件 

group by:如何將上面過濾出的數據分組 

having:對上面已經分組的數據進行過濾的條件  

select:查看結果集中的哪個列,或列的計算結果 

order by :按照什麼樣的順序來查看返回的數據

2.from後面的表關聯,是自右向左解析的 

而where條件的解析順序是自下而上的。 

也就是說,在寫SQL文的時候,盡量把數據量大的表放在最右邊來進行關聯, 

而把能篩選出大量數據的條件放在where語句的最下面。

SQL Select語句完整的 執行順序 【從DBMS使用者角度】:

1、from子句組裝來自不同數據源的數據;

2、where子句基於指定的條件對記錄行進行篩選;

3、group by子句將數據劃分為多個分組;

4、使用聚集函數進行計算;

5、使用having子句篩選分組;

6、計算所有的表達式;

7、使用order by對結果集進行排序 。

from 子句--執行順序為從後往前、從右到左

表名(最後面的那個表名為驅動表,執行順序為從後往前, 所以數據量較少的表盡量放後)

oracle 的解析器按照從右到左的順序處理,FROM 子句中的表名,FROM 子句中寫在最後的表(基礎表 driving

table)將被最先處理,即最後的表為驅動表,在FROM 子句中包含多個表的情況下,你必須選擇記錄條數最少的表作為基礎表。如果有3

個以上的表連接查詢, 那就需要選擇交叉表(intersection table)作為基礎表, 交叉表是指被其他表所引用的表

多表連接時,使用表的別名並把別名前綴於每個Column上。可以減少解析的時間並減少那些由Column 歧義引起的語法錯誤.

where子句--執行順序為自下而上、從右到左

ORACLE 採用自下而上從右到左的順序解析Where 子句,根據這個原理,表之間的連接必須寫在其他Where 條件之前, 可以過濾掉最大數量記錄的條件必須寫在Where 子句的末尾。

group by--執行順序從左往右分組

提高GROUP BY 語句的效率, 可以通過將不需要的記錄在GROUP BY 之前過濾掉。即在GROUP BY前使用WHERE來過慮,而盡量避免GROUP BY後再HAVING過濾。

having 子句----很耗資源,盡量少用

避免使用HAVING 子句, HAVING 只會在檢索出所有記錄之後才對結果集進行過濾. 這個處理需要排序,總計等操作.

如果能通過Where 子句在GROUP BY前限制記錄的數目,那就能減少這方面的開銷.

(非oracle 中)on、where、having 這三個都可以加條件的子句中,on 是最先執行,where 次之,having 最後,因為on 是先把不符合條件的記錄過濾後才進行統計,它就可以減少中間運算要處理的數據,按理說應該速度是最快的,

where 也應該比having 快點的,因為它過濾數據後才進行sum,在兩個表聯接時才用on 的,所以在一個表的時候,就剩下where 跟having比較了。

在這單表查詢統計的情況下,如果要過濾的條件沒有涉及到要計算欄位,那它們的結果是一樣的,只是where 可以使用rushmore 技術,而having 就不能,在速度上後者要慢。

如果要涉及到計算的欄位,就表示在沒計算之前,這個欄位的值是不確定的,where 的作用時間是在計算之前就完成的,而having 就是在計算後才起作用的,所以在這種情況下,兩者的結果會不同。

在多表聯接查詢時,on 比where 更早起作用。系統首先根據各個表之間的聯接條件,把多個表合成一個臨時表後,再由where 進行過濾,然後再計算,計算完後再由having 進行過濾。

由此可見,要想過濾條件起到正確的作用,首先要明白這個條件應該在什麼時候起作用,然後再決定放在那裡。

select子句--少用*號,盡量取欄位名稱 。

ORACLE 在解析的過程中, 會將依次轉換成所有的列名, 這個工作是通過查詢數據字典完成的, 使用列名意味著將減少消耗時間。

sql 語句用大寫的;因為 oracle 總是先解析 sql 語句,把小寫的字母轉換成大寫的再執行

order by子句--執行順序為從左到右排序,很耗資源