MySQL窗口函數(shù)簡介
MySQL從8.0開始支持窗口函數(shù),這個功能在大多商業(yè)數(shù)據(jù)庫和部分開源數(shù)據(jù)庫中早已支持,有的也叫分析函數(shù)。
什么叫窗口?
窗口的概念非常重要,它可以理解為記錄集合,窗口函數(shù)也就是在滿足某種條件的記錄集合上執(zhí)行的特殊函數(shù)。對于每條記錄都要在此窗口內執(zhí)行函數(shù),有的函數(shù)隨著記錄不同,窗口大小都是固定的,這種屬于靜態(tài)窗口;有的函數(shù)則相反,不同的記錄對應著不同的窗口,這種動態(tài)變化的窗口叫滑動窗口。
窗口函數(shù)和普通聚合函數(shù)也很容易混淆,二者區(qū)別如下:
聚合函數(shù)是將多條記錄聚合為一條;而窗口函數(shù)是每條記錄都會執(zhí)行,有幾條記錄執(zhí)行完還是幾條。
聚合函數(shù)也可以用于窗口函數(shù)中,這個后面會舉例說明。
一、mysql5.0
例如:我們要計算銷售人員的銷售額,結果按從高到低排序,查詢結果中要包含銷售的排名。
![](/d/20211018/c5560e961b8ebc1c9c007abbdd518c8a.gif)
1、計算銷售人員的銷售額,結果按從高到低排序
這一部分我們可以直接使用group by對銷售人員分組,使用聚合函數(shù)sum對銷售額進行求和,結果對銷售額使用order by 排序就可以。語句如下:
SELECT sales_name, sum( profit ) FROM spm_order GROUP BY sales_name ORDER BY sum( profit ) DESC
![](/d/20211018/53acccd8538d0c50739af026aac899db.gif)
2、如果查詢結果要包含銷售的排名。
在mysql5.0中, 我們要定義一個排序自增的變量,讓它實現(xiàn)自動+1來作為一個新的列。語句如下:
SET @rank = 0;
SELECT
A.*,
@rank := @rank + 1 AS rank_no
FROM
( SELECT sales_name, sum( profit ) FROM spm_order GROUP BY sales_name ORDER BY sum( profit ) DESC ) A
這里的:=就是賦值的意思 這里的A就是把子查詢取一個別名方便前面調用。
結果如下:
![](/d/20211018/7647d5954c471a182dada5a1ef2bfa09.gif)
二、mysql8.0
對于這個問題,在mysql8.0中有專門的的窗口函數(shù)可以調用,復雜問題簡單化。
語句如下:
SELECT
sales_name,
sum( sales ),
row_number ( ) over ( ORDER BY sum( sales ) DESC ) AS ‘rank'
FROM
spm_order
GROUP BY
sales_name
結果:
![](/d/20211018/5881b4bf91ac8f6ddc914f4eb536610a.gif)
在這里我們使用了[ row_number() over () ]
,在over()里面直接寫上我們要排序的內容。
工作中企業(yè)基本都是用的5.0版本,所以多學習一下吧。
總結
以上所述是小編給大家介紹的Mysql8.0使用窗口函數(shù)解決排序問題,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
如果你覺得本文對你有幫助,歡迎轉載,煩請注明出處,謝謝!
您可能感興趣的文章:- MySQL8.0窗口函數(shù)入門實踐及總結
- PostgreSQL數(shù)據(jù)庫中窗口函數(shù)的語法與使用
- SQL2005 學習筆記 窗口函數(shù)(OVER)
- SQL 窗口函數(shù)實現(xiàn)高效分頁查詢的案例分析