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