查詢語句中select from where group by having order by的執(zhí)行順序
1.查詢中用到的關(guān)鍵詞主要包含六個,并且他們的順序依次為?
select--from--where--group by--having--order by?
其中select和from是必須的烦粒,其他關(guān)鍵詞是可選的棕孙,這六個關(guān)鍵詞的執(zhí)行順序?
與sql語句的書寫順序并不是一樣的,而是按照下面的順序來執(zhí)行?
from--where--group by--having--select--order by,?
from:需要從哪個數(shù)據(jù)表檢索數(shù)據(jù)?
where:過濾表中數(shù)據(jù)的條件?
group by:如何將上面過濾出的數(shù)據(jù)分組?
having:對上面已經(jīng)分組的數(shù)據(jù)進行過濾的條件??
select:查看結(jié)果集中的哪個列播掷,或列的計算結(jié)果?
order by :按照什么樣的順序來查看返回的數(shù)據(jù)
2.from后面的表關(guān)聯(lián),是自右向左解析的?
而where條件的解析順序是自下而上的。?
也就是說拒啰,在寫SQL文的時候,盡量把數(shù)據(jù)量大的表放在最右邊來進行關(guān)聯(lián)完慧,?
而把能篩選出大量數(shù)據(jù)的條件放在where語句的最下面谋旦。
SQL Select語句完整的執(zhí)行順序【從DBMS使用者角度】:
1、from子句組裝來自不同數(shù)據(jù)源的數(shù)據(jù)屈尼;
2册着、where子句基于指定的條件對記錄行進行篩選;
3脾歧、group by子句將數(shù)據(jù)劃分為多個分組甲捏;
4、使用聚集函數(shù)進行計算鞭执;
5司顿、使用having子句篩選分組;
6兄纺、計算所有的表達式大溜;
7、使用order by對結(jié)果集進行排序估脆。
from 子句--執(zhí)行順序為從后往前钦奋、從右到左
表名(最后面的那個表名為驅(qū)動表,執(zhí)行順序為從后往前, 所以數(shù)據(jù)量較少的表盡量放后)
oracle 的解析器按照從右到左的順序處理,F(xiàn)ROM 子句中的表名锨苏,F(xiàn)ROM 子句中寫在最后的表(基礎(chǔ)表 driving
table)將被最先處理疙教,即最后的表為驅(qū)動表,在FROM 子句中包含多個表的情況下,你必須選擇記錄條數(shù)最少的表作為基礎(chǔ)表伞租。如果有3
個以上的表連接查詢, 那就需要選擇交叉表(intersection table)作為基礎(chǔ)表, 交叉表是指被其他表所引用的表
多表連接時贞谓,使用表的別名并把別名前綴于每個Column上】可以減少解析的時間并減少那些由Column 歧義引起的語法錯誤.
where子句--執(zhí)行順序為自下而上裸弦、從右到左
ORACLE 采用自下而上從右到左的順序解析Where 子句,根據(jù)這個原理,表之間的連接必須寫在其他Where 條件之前,?可以過濾掉最大數(shù)量記錄的條件必須寫在Where 子句的末尾。
group by--執(zhí)行順序從左往右分組
提高GROUP BY 語句的效率, 可以通過將不需要的記錄在GROUP BY 之前過濾掉作喘。即在GROUP BY前使用WHERE來過慮理疙,而盡量避免GROUP BY后再HAVING過濾。
having 子句----很耗資源泞坦,盡量少用
避免使用HAVING 子句,?HAVING 只會在檢索出所有記錄之后才對結(jié)果集進行過濾. 這個處理需要排序,總計等操作.
如果能通過Where 子句在GROUP BY前限制記錄的數(shù)目,那就能減少這方面的開銷.
(非oracle 中)on窖贤、where、having 這三個都可以加條件的子句中贰锁,on 是最先執(zhí)行赃梧,where 次之,having 最后豌熄,因為on 是先把不符合條件的記錄過濾后才進行統(tǒng)計授嘀,它就可以減少中間運算要處理的數(shù)據(jù),按理說應(yīng)該速度是最快的锣险,
where 也應(yīng)該比having 快點的蹄皱,因為它過濾數(shù)據(jù)后才進行sum,在兩個表聯(lián)接時才用on 的芯肤,所以在一個表的時候巷折,就剩下where 跟having比較了。
在這單表查詢統(tǒng)計的情況下崖咨,如果要過濾的條件沒有涉及到要計算字段盔几,那它們的結(jié)果是一樣的,只是where 可以使用rushmore 技術(shù)掩幢,而having 就不能,在速度上后者要慢上鞠。
如果要涉及到計算的字段际邻,就表示在沒計算之前,這個字段的值是不確定的芍阎,where 的作用時間是在計算之前就完成的世曾,而having 就是在計算后才起作用的,所以在這種情況下,兩者的結(jié)果會不同轮听。
在多表聯(lián)接查詢時骗露,on 比where 更早起作用。系統(tǒng)首先根據(jù)各個表之間的聯(lián)接條件血巍,把多個表合成一個臨時表后萧锉,再由where 進行過濾,然后再計算述寡,計算完后再由having 進行過濾柿隙。
由此可見,要想過濾條件起到正確的作用鲫凶,首先要明白這個條件應(yīng)該在什么時候起作用禀崖,然后再決定放在那里。
select子句--少用*號螟炫,盡量取字段名稱波附。
ORACLE 在解析的過程中, 會將依次轉(zhuǎn)換成所有的列名, 這個工作是通過查詢數(shù)據(jù)字典完成的, 使用列名意味著將減少消耗時間。
sql 語句用大寫的昼钻;因為 oracle 總是先解析 sql 語句掸屡,把小寫的字母轉(zhuǎn)換成大寫的再執(zhí)行
order by子句--執(zhí)行順序為從左到右排序,很耗資源