??窗口函數(shù)(window functions),也叫分析函數(shù)和OLAP函數(shù),MySQL在8.0之后開始支持窗口函數(shù)。窗口函數(shù)可以用來對數(shù)據(jù)進行實時分析處理,和group by有類似之處,其區(qū)別在于窗口會對每個分組之后的數(shù)據(jù)按行進行分別操作,而group by一般對分組之后的函數(shù)使用聚合函數(shù)匯總,做不到對不同的group中的行數(shù)據(jù)進行分別操作。這就簡單介紹幾種常見的MySQL窗口函數(shù)。下表中列出了幾種常見的窗口函數(shù),并對其基本功能進行了描述。接下來我們會以一段示例,來展示MySQL中窗口函數(shù)的用途和效果。
創(chuàng)新互聯(lián)-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設、高性價比道縣網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式道縣網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設找我們,業(yè)務覆蓋道縣地區(qū)。費用合理售后完善,十年實體公司更值得信賴。
??假設我們存在一張如下的員工工資表,接下來我們將以這張表對窗口函數(shù)的使用方法進行簡單的演示。
??窗口函數(shù)的語法如下,所有的窗口函數(shù)均遵循以下語法:
其中 frame_clause 語法如下。
接下來我們將展示一些場景的窗口函數(shù)的用法和效果。
示例: 對所有員工按照薪資降序排序,并給出對應的row_number、rank和dense_rank的排名
示例: 對每個部門的員工按照薪資降序排序,并給出對應的row_number、rank和dense_rank的排名
示例: 對所有員工按照薪資降序排序,并給出對應的row_number、rank和dense_rank的排名,最終結果按照員工號進行排序輸出。
示例: 找出每個部門工資最高的人。
示例: a.將所有員工按照工資遞增的順序分成4組。b.根據(jù)員工入職日期升序分成7組。
示例: 獲取每個部門,按工資從低到高得累計和。
示例: 獲取每個部門得工資累計和。
示例: 獲取整個公司的薪資按照薪資遞增的累計和。
示例: 獲取整個公司的薪資按照薪資遞增的前兩行和后一行范圍內的薪資和。
示例: 每個部門的平均工資。
示例: 獲取整個公司的薪資按照薪資遞增的前兩行和后一行范圍內的薪資平均值。
示例: 根據(jù)薪資排序,獲取CUME_DIST()和PERCENT_RANK()
示例: a. 獲取每個人入職前一行的數(shù)據(jù),默認值為"2021-01-01";b. 獲取每個人入職前兩行的數(shù)據(jù),不設置默認值;c. 獲取每個人入職后一行的數(shù)據(jù),默認值為"2022-01-01";d. 獲取每個人入職后兩行的數(shù)據(jù),不設置默認值;
示例: a. 按照入職日期順序排序,找出當前每個部門最先入職的人的薪資。b. 按照入職日期順序排序,找出當前每個部門最后入職的人的薪資。
示例: a.獲取截至當前工資第二高的人的工資。b.獲取第二個入職的人的工資。
查詢數(shù)據(jù)庫中的存儲過程和函數(shù)
select `name` from mysql.proc where db = 'xx' and `type` = 'PROCEDURE' //存儲過程
select `name` from mysql.proc where db = 'xx' and `type` = 'FUNCTION' //函數(shù)
show procedure status; //存儲過程
show function status; //函數(shù)
查看存儲過程或函數(shù)的創(chuàng)建代碼
show create procedure proc_name;
show create function func_name;
查看視圖
SELECT * from information_schema.VIEWS //視圖
SELECT * from information_schema.TABLES //表
查看觸發(fā)器
SHOW TRIGGERS [FROM db_name] [LIKE expr]
SELECT * FROM triggers T WHERE trigger_name=”mytrigger” \G
應用
MySQL
時,會遇到不能創(chuàng)建函數(shù)的情況。出現(xiàn)如下錯誤信息:
復制代碼
代碼如下:
ERROR
1418
:
This
function
has
none
of
DETERMINISTIC,
NO
SQL,
or
READS
SQL
DATA
in
its
declaration
and
binary
logging
is
enabled
(you
*might*
want
to
use
the
less
safe
log_bin_trust_function_creators
variable)
那是因為沒有將功能開啟。
開啟MySQL函數(shù)功能:
復制代碼
代碼如下:
SET
GLOBAL
log_bin_trust_function_creators=1;
關閉MySQL函數(shù)功能:
復制代碼
代碼如下:
SET
GLOBAL
log_bin_trust_function_creators=0;
查看狀態(tài):
復制代碼
代碼如下:
show
variables
like
'%func%';