原創|其它|編輯:郝浩|2009-04-27 11:52:49.000|閱讀 2353 次
概述:在Oracle數據庫系統中,對于這兩個統計子句做了比較嚴格的使用限制。數據庫管理員必須對這些使用閑置銘記在心,否則的話很容易在統計的過程中遇到錯誤。具體來說,有如下幾個使用限制。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
如果在一個查詢語句中,同時含有Group By(分組語句)、Having(分組語句下的條件函數)、Order By(排序語句)三個共存的話,則需要注意他們有一定的書寫順序。通常情況下Order By排序語句必須放置在最后。如上面的案例中,筆者就把這個排序語句放在最末尾的地方。如果不這么處理的話,系統編譯器是不會接受這個PL/SQL語句的。另外需要注意的是,采用Group語句會自動對紀錄進行排序。如上面的語句中,筆者并沒有對年份、月度進行排序,而只是按供應商名稱來進行排序。而現實結果的話,卻會自動按年度、月份的大小從小到大來進行排序。這主要因為Group By子句在統計之前,會先對記錄按照Group By中的參數從左到右來進行排序,然后再進行統計。如此的話,最后顯示的結果就是已經排過序來的結果。如果數據庫管理員對于這個排序結果不滿意的話,就需要通過Order By子句再來對顯示結果進行排序。不過這里需要注意的是,本身分組等子句就需要對紀錄進行排序并進行一定的業務邏輯處理,此時會耗費比較多的數據庫資源。為此從數據庫的性能考慮,在使用Order By排序子句對統計結果進行重新排序的時候,要慎重。如果想把某個字段當作第一順序排序的話,則只需要把這個字段放置在分組語句中的第一個參數即可。如在上面這個案例中,筆者完全可以通過group by p.name,extract(YEAR FROM t.dateordered),extract(MONTH FROM t.dateordered)這個分組語句來實現結果的排序,而可以不再使用Order By語句。為此只有在必要的情況下,才能夠利用Order By子句。
Group By子句與Where子句是不兼容的。也就是說,在普通的Select等語句中(不含有Group By子句)時可以利用Where子句來過濾顯示的結果。但是在上面的語句中,筆者卻是使用Having語句來過濾顯示結果的。這主要是因為Group By子句與Where子句是不兼容的。也就是說,當要顯示分組顯示結果時,數據庫管理員必須要使用Having子句,而不能夠在Where自居中使用分組函數限制分組顯示結果。如果數據庫管理員在這里觸犯這條原則話,那么數據庫系統就會拒絕接受這條語句。數據庫會提示錯誤信息,如“命令沒有正確結束”等等。另外Having語句主要用來限制分組統計結果,其跟Group By語句是雙胞胎。即Having子句必須跟在Group By語句后面使用。其中Group By子句用戶對查詢結果進行分組統計,而Having子句則用于限制分組顯示結果,即根據用戶的要求來部分顯示所需要的內容。他們是互相配合,分工合作。可以說,如果沒有Having語句的幫助,那么Group By語句會失色很多。另外,Having語句對于提高數據庫與應用服務器的性能也有很大的關系。由于采用了Having語句來過濾顯示的結果,那么其最終符合條件的結果肯定比沒有設置限制條件的要少的多。這也就意味著這個顯示結果可以減少數據在網絡中的傳輸,從而提高應用程序的性能。為此筆者建議,在使用Gropy By分組語句中,最好配上Having 條件過濾語句(雖然這并不屬于強制限制)。如在在ERP系統中生成這張報表的時候,可以提示用戶輸入參數,如需要統計幾幾年幾月份到幾幾年幾月份的采購金額。如果用戶沒有輸入相關的數據的話,則其默認為最近一年的統計數據等等。這雖然是一個小小的技巧,但是在數據量比較多或者數據分組涉及到多張表的情況下,可以非常有效的提高數據庫與應用服務器的性能。這是一個強制的條件,數據庫管理員必須無條件的遵守。
需要注意多列分組的順序問題。group by p.name,extract(YEAR FROM t.dateordered),extract(MONTH FROM t.dateordered 與group by extract(YEAR FROM t.dateordered),extract(MONTH FROM t.dateordered ,p.name這兩個分組語句有什么差別嗎?如果光從結果上來說,是沒有多大差異的。但是從其內部的處理機制上來說,有很大的差別。這主要涉及到多列分組的問題。多列分組時指在Group By子句中使用兩個或者兩個以上的列生成分組統計結果。當進行多列分組時,匯集于多個列的不同值產生數據統計結果。如上面的例子中,數據庫就會根據年份、月份、供應商來生成統計結果。如果用前者的表達方式,則其先統計每個供應商的合計金額,在分類統計年、月的統計金額。簡單的說,他們統計順序不同,但是顯示結果相同。這也是第一點所說的,要把選擇列表中的字段名、表達式等等全部放入到Group By子句中的原因。只有如此,Group By才會對這些字段進行分組統計。只有如此才能夠保證,不會因為Group By子句中的參數順序不同,而顯示不同的統計結果。
可見Group By分組語句其使用規范要比普通的Select等查詢語句要求嚴格的多。數據庫管理員在使用Group語句進行數據分組統計時,一定要注意這些使用限制。否則的話在利用這個分組語句的時候,難免會磕磕碰碰的。
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉載自:IT專家網