SQL執(zhí)行順序

查詢語(yǔ)句中select from where group by having order by的執(zhí)行順序

1.查詢中用到的關(guān)鍵詞主要包含六個(gè),并且他們的順序依次為?

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

其中select和from是必須的,其他關(guān)鍵詞是可選的,這六個(gè)關(guān)鍵詞的執(zhí)行順序?

與sql語(yǔ)句的書寫順序并不是一樣的,而是按照下面的順序來(lái)執(zhí)行?

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

from:需要從哪個(gè)數(shù)據(jù)表檢索數(shù)據(jù)?

where:過(guò)濾表中數(shù)據(jù)的條件?

group by:如何將上面過(guò)濾出的數(shù)據(jù)分組?

having:對(duì)上面已經(jīng)分組的數(shù)據(jù)進(jìn)行過(guò)濾的條件??

select:查看結(jié)果集中的哪個(gè)列,或列的計(jì)算結(jié)果?

order by :按照什么樣的順序來(lái)查看返回的數(shù)據(jù)

2.from后面的表關(guān)聯(lián),是自右向左解析的?

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

也就是說(shuō),在寫SQL文的時(shí)候,盡量把數(shù)據(jù)量大的表放在最右邊來(lái)進(jìn)行關(guān)聯(lián),?

而把能篩選出大量數(shù)據(jù)的條件放在where語(yǔ)句的最下面。

SQL Select語(yǔ)句完整的執(zhí)行順序【從DBMS使用者角度】:

1、from子句組裝來(lái)自不同數(shù)據(jù)源的數(shù)據(jù);

2、where子句基于指定的條件對(duì)記錄行進(jìn)行篩選;

3、group by子句將數(shù)據(jù)劃分為多個(gè)分組;

4、使用聚集函數(shù)進(jìn)行計(jì)算;

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

6、計(jì)算所有的表達(dá)式;

7、使用order by對(duì)結(jié)果集進(jìn)行排序。

from 子句--執(zhí)行順序?yàn)閺暮笸?、從右到?/b>

表名(最后面的那個(gè)表名為驅(qū)動(dòng)表,執(zhí)行順序?yàn)閺暮笸? 所以數(shù)據(jù)量較少的表盡量放后)

oracle 的解析器按照從右到左的順序處理,F(xiàn)ROM 子句中的表名,F(xiàn)ROM 子句中寫在最后的表(基礎(chǔ)表 driving

table)將被最先處理,即最后的表為驅(qū)動(dòng)表,在FROM 子句中包含多個(gè)表的情況下,你必須選擇記錄條數(shù)最少的表作為基礎(chǔ)表。如果有3

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

多表連接時(shí),使用表的別名并把別名前綴于每個(gè)Column上。可以減少解析的時(shí)間并減少那些由Column 歧義引起的語(yǔ)法錯(cuò)誤.

where子句--執(zhí)行順序?yàn)樽韵露?、從右到?/b>

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

group by--執(zhí)行順序從左往右分組

提高GROUP BY 語(yǔ)句的效率, 可以通過(guò)將不需要的記錄在GROUP BY 之前過(guò)濾掉。即在GROUP BY前使用WHERE來(lái)過(guò)慮,而盡量避免GROUP BY后再HAVING過(guò)濾。

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

避免使用HAVING 子句,?HAVING 只會(huì)在檢索出所有記錄之后才對(duì)結(jié)果集進(jìn)行過(guò)濾. 這個(gè)處理需要排序,總計(jì)等操作.

如果能通過(guò)Where 子句在GROUP BY前限制記錄的數(shù)目,那就能減少這方面的開(kāi)銷.

(非oracle 中)on、where、having 這三個(gè)都可以加條件的子句中,on 是最先執(zhí)行,where 次之,having 最后,因?yàn)閛n 是先把不符合條件的記錄過(guò)濾后才進(jìn)行統(tǒng)計(jì),它就可以減少中間運(yùn)算要處理的數(shù)據(jù),按理說(shuō)應(yīng)該速度是最快的,

where 也應(yīng)該比having 快點(diǎn)的,因?yàn)樗^(guò)濾數(shù)據(jù)后才進(jìn)行sum,在兩個(gè)表聯(lián)接時(shí)才用on 的,所以在一個(gè)表的時(shí)候,就剩下where 跟having比較了。

在這單表查詢統(tǒng)計(jì)的情況下,如果要過(guò)濾的條件沒(méi)有涉及到要計(jì)算字段,那它們的結(jié)果是一樣的,只是where 可以使用rushmore 技術(shù),而having 就不能,在速度上后者要慢。

如果要涉及到計(jì)算的字段,就表示在沒(méi)計(jì)算之前,這個(gè)字段的值是不確定的,where 的作用時(shí)間是在計(jì)算之前就完成的,而having 就是在計(jì)算后才起作用的,所以在這種情況下,兩者的結(jié)果會(huì)不同。

在多表聯(lián)接查詢時(shí),on 比where 更早起作用。系統(tǒng)首先根據(jù)各個(gè)表之間的聯(lián)接條件,把多個(gè)表合成一個(gè)臨時(shí)表后,再由where 進(jìn)行過(guò)濾,然后再計(jì)算,計(jì)算完后再由having 進(jìn)行過(guò)濾。

由此可見(jiàn),要想過(guò)濾條件起到正確的作用,首先要明白這個(gè)條件應(yīng)該在什么時(shí)候起作用,然后再?zèng)Q定放在那里。

select子句--少用*號(hào),盡量取字段名稱

ORACLE 在解析的過(guò)程中, 會(huì)將依次轉(zhuǎn)換成所有的列名, 這個(gè)工作是通過(guò)查詢數(shù)據(jù)字典完成的, 使用列名意味著將減少消耗時(shí)間。

sql 語(yǔ)句用大寫的;因?yàn)?oracle 總是先解析 sql 語(yǔ)句,把小寫的字母轉(zhuǎn)換成大寫的再執(zhí)行

order by子句--執(zhí)行順序?yàn)閺淖蟮接遗判?很耗資源

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容