今天向大家介紹Oracle Having子句,可能好多人還不了解Where子句,沒有關系,看完本文你肯定學會SQL子句,希望本文能教會你更多東西。以下是用Where子句替換Oracle Having子句:
避免使用Oracle Having子句,Having只會在檢索出任何記錄之後才對結果集進行過濾。這個處理需要排序,總計等操作。假如能通過WHERE子句限制記錄的數目,那就能減少這方面的開銷。(非 Oracle中)on、where、Having這三個都能夠加條件的子句中,on是最先執行,where次之,Having最後,因為on是先把不符合條件的記錄過濾後才進行統計,他就能夠減少中間運算要處理的數據,按理說應該速度是最快的,where也應該比Having快點的,因為他過濾數據後才進行sum,在兩個表聯接時才用on的,所以在一個表的時候,就剩下where跟Oracle Having子句比較了。
在這單表查詢統計的情況下,假如要過濾的條件沒有涉及到要計算字段,那他們的結果是相同的,只是where能夠使用rushmore技術,而Having就不能,在速度上後者要慢假如要涉及到計算的字段,就表示在沒計算之前,這個字段的值是不確定的,根據上篇寫的工作流程,where的作用時間是在計算之前就完成的,而Having就是在計算後才起作用的,所以在這種情況下,兩者的結果會不同。在多表聯接查詢時,on比where更早起作用。
系統首先根據各個表之間的聯接條件,把多個表合成一個臨時表後,再由where進行過濾,然後再計算,計算完後再由Having進行過濾。由此可見,要想過濾條件起到正確的作用,首先要明白這個條件應該在什麼時候起作用,然後再決定放在那裡。
減少對表的查詢:
在含有子查詢的SQL語句中,要特別注意減少對表的查詢。例子:
SELECT TAB_NAME FROM TABLES WHERE (TAB_NAME,DB_VER) = ( SELECTTAB_NAME,DB_VER FROM TAB_COLUMNS WHERE VERSION = 604)
通過內部函數提高SQL效率:
復雜的SQL往往犧牲了執行效率。能夠掌控上面的運用函數解決問題的方法在實際工作中是很有意義的。
使用表的別名(Alias):
當在SQL語句中連接多個表時, 請使用表的別名並把別名前綴於每個Column上。這樣一來,就能夠減少解析的時間並減少那些由Column歧義引起的語法錯誤。
用EXISTS替代IN、用NOT EXISTS替代NOT IN:
在許多基於基礎表的查詢中,為了滿足一個條件,往往需要對另一個表進行聯接。在這種情況下,使用EXISTS(或NOT EXISTS)通常將提高查詢的效率。在子查詢中,NOT IN子句將執行一個內部的排序和合並。無論在哪種情況下,NOT IN都是最低效的 (因為他對子查詢中的表執行了一個全表遍歷)。為了避免使用NOT IN ,我們能夠把他改寫成外連接(Outer Joins)或NOT EXISTS。例子:
- SELECT * FROM EMP (基礎表) WHERE EMPNO > 0 AND EXISTS
(SELECT ‘X' FROM DEPT WHERE DEPT.DEPTNO = EMP.DEPTNO AND LOC = ‘MELB')
(低效)SELECT * FROM EMP (基礎表) WHERE EMPNO > 0 AND DEPTNO IN
(SELECT DEPTNO FROM DEPT WHERE LOC = ‘MELB')