Oracle中窗口函數over()的學習
近一個月沒有寫博客了,今天學習了一下Oracle中窗口函數的使用,所以將自己的學習心得分享給大家。
使用窗口函數可以解決一些問題。比如說如果我們有兩張表,一張教師的表,一張系的表,如果我們想查詢每個系的老師的平均工資,這當然沒什麼問題,但是如果加上同時把老師的信息查詢出來,那麼就麻煩了,我們需要將每個系的老師的平均工資看成一張臨時表,來和原先的老師的表進行連接查詢;或者說查詢每個系工資最高的老師的信息,有些的時候,像這種分組的,多表的,統計的,經常涉及查詢每個查詢的具體信息,寫的時候增加了我們的難度,如果使用窗口函數,再配合一些其他的函數使用,很簡單的就可以解決這個問題。
有時候查詢,我們需要將我們的結果顯示在每條記錄裏,oracle中的這個窗口函數就可以解決這個問題。
窗口函數的名字是over()函數,常用的有兩個屬性partition by和order by,partition by類似於group by,我們通常將group by叫做分組,而partition by稱作分區,分組返回通常是一行,partition by返回的是多行。
如果將Oracle中的這個over()函數和其他的函數聯合使用將會發揮更大的作用,比如最值的問題,獲取其他行的數據等。
1、和統計函數(聚合函數)使用
可以和count() 、sum() 、avg() 、min() 、max()這些函數使用,這樣在查詢市,還可以顯示每條記錄的信息,比如說查詢每個系的老師的平均工資和老師的信息,如圖所示:
2、和排名函數使用
有時在後臺查詢數據庫時,需要向前臺那樣顯示序號,oracle提供了三個函數,搭配over()函數更有用。如圖所示:
3、和錯行的函數使用
Oracle中有兩個類似於錯行的行數,在本行可以取到其他行的數據。lead 函數和lag函數。如圖所示:
4、取最值的函數first_value()
通過和該函數的聯合使用,可以解決最值問題。常用的有兩外的屬性值。
無論是那種方式都會在查詢的記錄上添加一列的信息,有時候需要這種需求,使用這個函數還可以解決使用group by時,只能查詢分組的字段值的問題。