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

寫出sql查詢語句的執行順序

發布時間: 2023-06-16 16:26:14

⑴ 請教一條sql語句的執行順序

這個我正好有收藏O(∩_∩)O哈哈~

1、FROM:對FROM子句中的前兩個表執行笛卡爾積(Cartesian proct)(交叉聯接),生成虛擬表VT1
2、ON:對VT1應用ON篩選器。只有那些使<join_condition>為真的行才被插入VT2。
3、outer(JOIN):如 果指定了OUTER JOIN(相對於CROSS JOIN 或(INNER JOIN),
保留表(preserved table:左外部聯接把左表標記為保留表,右外部聯接把右表標記為保留表,
完全外部聯接把兩個表都標記為保留表)
中未找到匹配的行將作為外部行添加到 VT2,生成VT3.如果FROM子句包含兩個以上的表,
則對上一個聯接生成的結果表和下一個表重復執行步驟1到步驟3,直到處理完所有的表為止。
4、WHERE:對VT3應用WHERE篩選器。只有使<where_condition>為true的行才被插入VT4.
5、 group by:按GROUP BY子句中的列列表對VT4中的行分組,生成VT5.
6、CUBE|ROLLUP:把超組(Suppergroups)插入VT5,生成VT6.
7、HAVING:對VT6應用HAVING篩選器。只有使<having_condition>為true的組才會被插入VT7.
8、SELECT:處理SELECT列表,產生VT8.
9、DISTINCT:將重復的行從VT8中移除,產生VT9.
10、order by:將VT9中的行按ORDER BY 子句中的列列表排序,生成游標(VC10).
TOP:從VC1

⑵ 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



⑶ sql執行順序

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

電腦:華為MateBook14

系統:Windows10

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

1、from

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

⑷ SQL語句的執行順序是怎麼樣的

結果是不一樣的,因為SQL執行這類條件判斷時是有先後順序的,具體順序如下:
(按最優先到最後,從左至右排列)
()、not、and、or
最優先執行的是()內的判斷條件,然後到not,再到and,最後才判斷or

⑸ 在 sql中 多行sql語句怎麼執行,是從上往下 還是從下往上求解

SQL不同於其他編程語言的最明顯特徵是處理代碼的順序。在大多資料庫語言中, 代碼按編碼順序被處理。但在SQL語句中,第一個被處理的子句式FROM,而不是第 一出現的SELECT。SQL查詢處理的步驟序號:(8) SELECT (9) DISTINCT (11) <TOP_specification> <select_list>
2 (1) FROM <left_table>
3 (3) <join_type> JOIN <right_table>
4 (2) ON <join_condition>
5 (4) WHERE <where_condition>
6 (5) GROUP BY <group_by_list>
7 (6) WITH {CUBE | ROLLUP}
8 (7) HAVING <having_condition>
9 (10) ORDER BY <order_by_list>
以上每個步驟都會產生一個虛擬表,該虛擬表被用作下一個步驟的輸入。這 些虛擬表對調用者(客戶端應用程序或者外部查詢)不可用。只有最後一步生成的 表才會會給調用者。如果沒有在查詢中指定某一個子句,將跳過相應的步驟。
邏輯查詢處理階段簡介:
1、 FROM:對FROM子句中的前兩個表執行笛卡爾積(交叉聯接),生成虛擬表 VT1。
2、 ON:對VT1應用ON篩選器,只有那些使為真才**入到TV2。
3、 OUTER (JOIN):如果指定了OUTER JOIN(相對於CROSS JOIN或INNER JOIN) ,保留表中未找到匹配的行將作為外部行添加到VT2,生成TV3。如果FROM子句包 含兩個以上的表,則對上一個聯接生成的結果表和下一個表重復執行步驟1到步驟 3,直到處理完所有的表位置。
4、 WHERE:對TV3應用WHERE篩選器,只有使為true的行才插入TV4。
5、 GROUP BY:按GROUP BY子句中的列列表對TV4中的行進行分組,生成TV5 。
6、 CUTE|ROLLUP:把超組插入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的開始處選擇指定數量或比例的行,生成表TV11,並返回給 調用者。
此文轉載:中國IT實驗室

⑹ 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子句--執行順序為從左到右排序,很耗資源

⑺ SQL的執行順序,如:( Select,From,Where Group By , Order By)如何的順序

最後是order 倒數第二是select

⑻ sql語句執行順序、

順序如下:

8、SELECT(9)DISTINCT10、<TopNum><selectlist>

1、FROM[left_table]

3、<join_type>JOIN<right_table>

2、 ON<join_condition>

4、WHERE<where_condition>

5、GROUPBY<group_by_list>

6、WITH<CUBE|RollUP>

7、HAVING<having_condition>

9、ORDERBY<order_by_list>

⑼ SQL語句在資料庫中是怎樣執行的(sql怎麼執行語句)

第一步:應用程序把查枯運做詢SQL語句發給伺服器端執行

我們在數據層執行SQL語句時,應用程序會連接到相應的資料庫伺服器,把SQL語句發送給伺服器處理。

第二步:伺服器解析請求的SQL語句

SQL計劃緩存,經常用查詢分析器的朋友大概都知道這樣一個事實,往往一個查詢語句在第一次運行的時候需要執行特別長的時間,但是如果你馬上或悄絕者在一定時間內運行同樣的語句,會在很短的時間內返回查詢結果。原因是:

伺服器在接收到查詢請求後,並不會馬上去資料庫查詢,而是在資料庫中的計劃緩存中找是否有相對應的執行計劃。如果存在,就直接調用已經編譯好的執行計劃,節省了執行計劃的編譯時間。

如果所查詢的行已經存在於數據緩沖存儲區中,就不用查詢物理文件了,而是從緩存中取數據,這樣從內存中取數據就會比從硬碟上讀取數據快很多,提高了查詢效率。數據緩沖存儲區會在後面提到。

如果在SQL計劃緩存中沒有對應的執行計劃,伺服器首先會對用戶請求的SQL語句進行語法效驗,如果有語法錯誤,伺服器會結束查詢操作,並用返回相應的錯誤信息給調用它的應用程序。

注意:此時返回的錯誤信息中,只會包含基本的語法錯誤信息,例如select寫成selec等,錯誤信息中如果包含一列表中本沒有的列,此時伺服器是不會檢查出來的,因為只是語法驗證,語義是否正確放在下一步進行。

語法符合後,就開始驗證它的語義是否正確。例如,表名、列名、存儲過程等等資料庫對象是否真正存在,如果發現有不存在的,就會報錯給應用程序,同時結束查詢。

接下來就是獲得對象的解析鎖,我們在查詢一個表時,首先伺服器會對這個對象加鎖,這是為了保證數據的統一性,如果不加鎖,此時有數據插入,但因為沒有加鎖的原因,查詢已經將這條記錄讀入,而有的插入會因為事務的失敗會回滾,就會形成臟讀的現象。

接下來就是對資料庫用戶許可權的驗證。SQL語句語法,語義都正確,此時並不一定能夠得到查詢結果,如果資料庫用戶沒有相應的訪問許可權,伺服器會報出許可權不足的錯誤給應用程序,在稍大的項目中,往往一個項目裡面會包含好幾個資料庫連接串,這些資料庫用戶具有不同的許可權,有的是只讀許可權,有的是只寫許可權,有的是可讀可寫,根據不同的操作選取不同的用戶來執行。稍微不注意,無論你的SQL語句寫的多麼完善,完美無缺都沒用。

解析的最後一步,就是確定最終的執行計劃。當語法、語義、許可權都驗證後,伺服器並不會馬上給你返回結果,而是會針對你的SQL進行優化,選擇不同的查詢演算法以最高效的形式返回給應用程序。例如在做表聯合查詢時,伺服器會根據開沒衡銷成本來最終決定採用hashjoin,mergejoin,還是loopjoin,採用哪一個索引會更高效等等。不過它的自動化優化是有限的,要想寫出高效的查詢SQL還是要優化自己的SQL查詢語句。

當確定好執行計劃後,就會把這個執行計劃保存到SQL計劃緩存中,下次在有相同的執行請求時,就直接從計劃緩存中取,避免重新編譯執行計劃。

第三步:語句執行

伺服器對SQL語句解析完成後,伺服器才會知道這條語句到底表態了什麼意思,接下來才會真正的執行SQL語句。

此時分兩種情況:

如果查詢語句所包含的數據行已經讀取到數據緩沖存儲區的話,伺服器會直接從數據緩沖存儲區中讀取數據返回給應用程序,避免了從物理文件中讀取,提高查詢速度。

如果數據行沒有在數據緩沖存儲區中,則會從物理文件中讀取記錄返回給應用程序,同時把數據行寫入數據緩沖存儲區中,供下次使用。

說明:SQL緩存分好幾種,這里有興趣的朋友可以去搜索一下。有時因為緩存的存在,使得我們很難馬上看出優化的結果,因為第二次執行因為有緩存的存在,會特別快速,所以一般都是先消除緩存,然後比較優化前後的性能表現,這里有幾個常用的方法:

1DBCC

2從緩沖池中刪除所有清除緩沖區。

3DBCC

4從過程緩存中刪除所有元素。

5DBCC

6從所有緩存中釋放所有未使用的緩存條目。

SQLServer2005資料庫引擎會事先在後台清理未使用的緩存條目,以使內存可用於當前條目。但是,可以使用此命令從所有緩存中手動刪除未使用的條目。

這只能基本消除SQL緩存的影響,目前好像沒有完全消除緩存的方案,如果大家有,請指教。

執行順序:

FROM子句返回初始結果集。

WHERE子句排除不滿足搜索條件的行。

GROUPBY子句將選定的行收集到GROUPBY子句中各個唯一值的組中。

選擇列表中指定的聚合函數可以計算各組的匯總值。

此外,HAVING子句排除不滿足搜索條件的行。

計算所有的表達式;

使用orderby對結果集進行排序。

查找你要搜索的欄位。