sql over函数_SQL 高级函数
今天是高端局,都是超級高大上的內容,慣例上目錄
今天覺得紅黑配色好好看呀今天沒有什么具體的栗子合集,大家的應用場景都很不一樣,so,到具體知識點,我們再具體舉栗子。
窗口函數
概念: 窗口函數,也叫OLAP函數(Online Anallytical Processing,聯機分析處理),可以對數據庫數據進行實時分析處理。
基礎語法
?窗口函數? over (partition by ?用于分組的列名? order by ?用于排序的列名?)關于這個語法點,下文會有詳細的介紹
窗口函數分類
窗口函數總共分兩類,一類是專用窗口函數,另一類是聚合函數
專用窗口函數
專用窗口函數大致又三個,rank(),, dense_rank(), row_number()三個,我們來一個一個看。
首先來看rank(),認真講,這個大家應該很熟悉,作為窗口函數的用法,其實就是把rank()直接套進基礎語法里面就可以了。
舉個具體例子
班級表我們要再每個班級內進行排名。
我們先來看看code怎么寫
select *,rank() over (partition by 班級 order by 成績 desc) as ranking from 班級表我們再來看看這個code里面的語法點。
先說不認識的,之前沒見過的partition by,這個的作用跟group by差不多,就是對數據進行分組,我們的栗子里,就是對數據按照班級列進行分組。那partition by和group by有什么區別呢?我們為什么要學習兩個功能相同的函數呢?
這是因為,group by匯總分組后,改變了表原有的行數,一行只有一個類別。而partition by和rank 函數,則不會改變原表的行數。
dense_rank,其實也是對函數進行排名。而row_number則是顯示出每一行的行號。
舉個栗子
select *, rank() over (order by 成績 desc) as ranking,dense_rank() over (order by 成績 desc) as dese_rank,row_number() over (order by 成績 desc) as row_numfrom 班級表;橘色框框的地方,其實就是重點顯示它們三者不同之處的地方。說完了專用窗口函數,我們再來說說聚合窗口函數
聚合窗口函數
我們常說的聚合函數,其實就是,sum(), avg(),count(),min(),max()這些,這波又是一個code幫你搞定聚合窗口函數系列
select *, sum(成績) over (order by 學號) as current_sum,avg(成績) over (order by 學號) as current_avg, count(成績) over (order by 學號) as current_count, max(成績) over (order by 學號) as current_max, min(成績) over (order by 學號) as current_min from 班級表;輸出結果
如果想要知道所有人成績的總和、平均等聚合結果,看最后一行即可。
這樣使用窗口函數有什么用呢?聚合函數作為窗口函數,可以在每一行的數據里直觀的看到,截止到本行數據,統計數據是多少(最大值、最小值等)。同時可以看出每一行數據,對整體統計數據的影響。
avg()作為窗口函數時,如果我們想對返回數據做出限制的時候,一般情況下,我們會想到使用where語句。例如,我們要返回,比平均成績高的學生。
select *, avg(成績) over (partition by 科目) as avg_score from 成績表 where 成績 ? avg_score;但是這么寫,SQL會出現錯誤,為什么呢?
記得我們之前重復了無數次的,SQL運行順序嘛?再來復習一次。
在我們,運行到,where語句的時候,我們在select里面求的平均值,根本都還沒有運行,所以這個where條件沒有辦法執行。
解決方法:子查詢
select * from (select *, avg(成績) over (partition by 科目) as avg_score from 成績表) as b where 成績 ? avg_score;窗口函數的移動平均
select *, avg(成績) over (order by 學號 rows 2 preceding) as current_avg from 班級表;出現了新的關鍵詞!!!rows 2 preceding,歡迎大家來到英語翻譯訓練營,在這里rows 2 preceding 是說,之前兩行。用在這里就是表明,結果就是自身記錄及其前兩行記錄的平均。
注意事項
- 在上述的這三個專用窗口函數中,函數后面的括號不需要任何參數,保持()空著就可以,但是()不可省略。
- 窗口函數原則上只能寫在select子句中。
- partition子句可是省略,就僅是按照成績進行排序。
- 窗口函數,不減少原表的行數,所以經常用來在每組內排名。但是group by會減少原表行數(例如,同一組內兩個最高分均為80,我們如果用group by就會只篩選出來一個。)
窗口函數使用場景
SQL存儲過程
概念: 這個存儲過程,本質上就是記錄記錄和呼叫重復行為的語句。
分類 : 無參數存儲過程,有參數存儲過程以及默認參數存儲過程
無參數存儲過程
定義過程
create procedure 存儲過程名稱() begin ?sql語句? ; end;呼叫過程
call 存儲過程名稱();有參數存儲過程
定義過程
create procedure 存儲過程名稱(參數1,參數2,...) begin ?sql語句? ; end;呼叫過程同上。
這個舉個栗子,
比如,我要找到,學號為0001的學生姓名,這個過程,我不能直接定義學號0001叭,那萬一,我下次要找學號為0002的學生呢?如果只能用一次,這個存儲過程不久沒意義了嘛!所以這個定義過程,應該是
create procedure getNum(num varchar(100)) begin select 姓名 from 學生表 where 學號=num; end;getNum后面定義值和值的類型。
然后,呼叫函數的時候,可以直接寫成
call getNum(0001);就可以找到學號為0001的學生的姓名啦。
默認參數的儲存過程
最后我們來說說,默認參數存儲過程。
依然還是分三種,IN, OUT, INOUT(我沒有在跳健身操,真的。)
IN 輸入參數:參數初始值在存儲過程前被指定為默認值,在存儲過程中修改該參數的值不能被返回
總結下來就是,我不管你怎么改,但是我改不認同,就是不認,最開始是多少就是多少。
OUT輸出參數:參數初始值為空,該值可在存儲過程內部被改變,并可返回
該改還是得改的OUT。
INOUT輸入輸出參數:參數初始值在存儲過程前被指定為默認值,并且可在存儲過程中被改變和在調用完畢后可被返回
注意事項
- 定義存儲過程語法里的SQL語句代碼塊必須是完整的sql語句,必須用“;”結尾
- 定義的儲存過程的名字,不可重復,否則會引起系統報錯
- 存儲過程和視圖在實際應用中有什么區別
- 視圖只是一段固定的sql語句,方便重復查詢;
- 存儲過程約等于編程,可以實現復雜的操作,例如傳參、建表、寫入、數據同步等過程。業務比較復雜、重復性工作比較多,存儲過程會比較實用。
- 把重復要做的事情整理成一步一步的業務步驟,然后把業務步驟寫成sql語句,然后再把sql語句寫到存儲過程的語法里。就像自動駕駛一樣,把可能遇到的狀況提前規劃好,就不需要自己操縱方向盤,車子就按照我們寫的步驟向前開了。
優缺點:
優點: 執行速度非常非常快,效率很高
缺點: 很難遷移到別的數據庫。
鑒于這個缺點,所以這個存儲過程的知識點,做個了解就好啦!不是太常用~今天的分享就到這里啦!
總結
以上是生活随笔為你收集整理的sql over函数_SQL 高级函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 全球油价今年已涨50% 石油巨头放话:未
- 下一篇: 【数据库】关系数据库理论学习