日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

sql over函数_SQL 高级函数

發布時間:2023/12/10 数据库 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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就會只篩選出來一個。)

窗口函數使用場景

  • 組內Top N 排名問題
  • 累計求和
  • 組內比較問題(eg.查找組內大于平均值數據)
  • 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 高级函数的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。