亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

MySQL中的窗口函數(shù)使用及說明

 更新時間:2023年12月27日 10:08:25   作者:m0_38063172  
這篇文章主要介紹了MySQL中的窗口函數(shù)使用及說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

MySQL中的窗口函數(shù)

從version 8.0開始,MySQL支持在查詢中使用窗口函數(shù)。

這篇文章是對一篇英文資料的不完全翻譯,加上自己的一些理解。

如果有興趣可以去看看原文章。

文中的示例用到的建表語句和插值語句如下:

CREATE TABLE sales(
    sales_employee VARCHAR(50) NOT NULL,
    fiscal_year INT NOT NULL,
    sale DECIMAL(14,2) NOT NULL,
    PRIMARY KEY(sales_employee,fiscal_year)
);
 
INSERT INTO sales(sales_employee,fiscal_year,sale)
VALUES('Bob',2016,100),
      ('Bob',2017,150),
      ('Bob',2018,200),
      ('Alice',2016,150),
      ('Alice',2017,100),
      ('Alice',2018,200),
       ('John',2016,200),
      ('John',2017,150),
      ('John',2018,250);

先看一個例子:

SELECT 
    fiscal_year, 
    sales_employee,
    sale,
    SUM(sale) OVER (PARTITION BY fiscal_year) total_sales
FROM
    sales;

執(zhí)行后得到的結果如下:

+-------------+----------------+--------+-------------+
| fiscal_year | sales_employee | sale   | total_sales |
+-------------+----------------+--------+-------------+
|        2016 | Alice          | 150.00 |      450.00 |
|        2016 | Bob            | 100.00 |      450.00 |
|        2016 | John           | 200.00 |      450.00 |
|        2017 | Alice          | 100.00 |      400.00 |
|        2017 | Bob            | 150.00 |      400.00 |
|        2017 | John           | 150.00 |      400.00 |
|        2018 | Alice          | 200.00 |      650.00 |
|        2018 | Bob            | 200.00 |      650.00 |
|        2018 | John           | 250.00 |      650.00 |
+-------------+----------------+--------+-------------+
9 rows in set (0.00 sec)

這里,sum()函數(shù)充當了窗口函數(shù),得到了根據(jù)fiscal_year計算出的sale的總和total_sales列,但是又不像它作為聚合函數(shù)使用時一樣,這里的結果保留了每一行的信息。

原因就在于窗口函數(shù)的執(zhí)行順序(邏輯上的)是在FROM,JOIN,WHERE,GROUP BY,HAVING之后,在ORDER BY,LIMIT,SELECT DISTINCT之前。

它執(zhí)行時GROUP BY的聚合過程已經(jīng)完成了,所以不會再產生數(shù)據(jù)聚合。

窗口函數(shù)的語法

window_function_name(expression) 
    OVER (
        [partition_defintion]
        [order_definition]
        [frame_definition]
    )

先指定作為窗口函數(shù)的函數(shù)名,然后是OVER(…),就算OVER里面沒有內容,括號也需要保留。

窗口函數(shù)的一個概念是當前行,當前行屬于某個窗口,窗口由“[partition_defintion]”,“[order_definition]”,“[frame_definition]“確定。

1.partition_defintion

翻譯過來應該是分區(qū),語法是"PARTITION BY < expression>[{,< expression>…}]",它會根據(jù)單個或者多個表達式的計算結果來分區(qū)(列名也是一種表達式,它的結果就是列名本身)。

在前面的例子中,結果中的每一行都有自己的分區(qū),total_sales列的值就是它所屬的分區(qū)里面的sum(sale)的結果。

2.frame_definition

這里先講frame_definition,可能應該是叫幀吧。

它的作用是在分區(qū)里面再進一步細分窗口。

語法是"frame_unit {< frame_start>|< frame_between>}",frame_unit有兩種,分別是ROWS和RANGE,由ROWS定義的frame是由開始和結束位置的行確定的,由RANGE定義的frame由在某個值區(qū)間的行確定。

如果只指定了frame的開始位置,那么結束位置就默認為當前行。

frame_start有三種:

  • UNBOUNDED PRECEDING: 區(qū)間的第一行
  • N PRECEDING: 當前行之前的N行,N可以是數(shù)字,也可以是一個能計算出數(shù)字的表達式
  • CURRENT ROW: 當前行

frame_between的可以取的值如下:

  • frame_start:如前面所列
  • UNBOUNDED FOLLOWING:區(qū)間的最后一行
  • N FOLLOWING:當前行之后的N行,N可以是數(shù)字,也可以是一個能計算出數(shù)字的表達式
  • 如果沒顯式指定frame的話,MySQL會認為frame是“ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING”

這個有點復雜,看個例子:

SELECT 
   fiscal_year, 
   sales_employee,
   sale,
   SUM(sale) OVER (PARTITION BY sales_employee 
                               ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) total_sales
FROM
   sales;

執(zhí)行結果如下:

+-------------+----------------+--------+-------------+
| fiscal_year | sales_employee | sale   | total_sales |
+-------------+----------------+--------+-------------+
|        2016 | Alice          | 150.00 |      150.00 |
|        2017 | Alice          | 100.00 |      250.00 |
|        2018 | Alice          | 200.00 |      450.00 |
|        2016 | Bob            | 100.00 |      100.00 |
|        2017 | Bob            | 150.00 |      250.00 |
|        2018 | Bob            | 200.00 |      450.00 |
|        2016 | John           | 200.00 |      200.00 |
|        2017 | John           | 150.00 |      350.00 |
|        2018 | John           | 250.00 |      600.00 |
+-------------+----------------+--------+-------------+
9 rows in set (0.00 sec)

第一行所在的區(qū)間是sales_employee為Alice的區(qū)間,所在的幀是區(qū)間第一行到當前行,只有一行,total_sales為150;

第二行所在的區(qū)間是sales_employee為Alice的區(qū)間,所在的幀是區(qū)間第一行到當前行,有兩行,total_sales為150+100=250;

第一行所在的區(qū)間是sales_employee為Alice的區(qū)間,所在的幀是區(qū)間第一行到當前行,有三行,total_sales為150+100+200=450。

3.order_definition

定義了分區(qū)內的行的排列順序,語法是“ORDER BY < expression> [ASC|DESC], [{,< expression>…}]”。沒什么好講的。

總結

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • MySQL 游標的作用與使用相關

    MySQL 游標的作用與使用相關

    這篇文章主要介紹了MySQL游標的相關資料,幫助大家更好的理解和使用MySQL數(shù)據(jù)庫,感興趣的朋友可以了解下
    2021-01-01
  • mysql如何用sql語句建立學生課程數(shù)據(jù)庫基本表

    mysql如何用sql語句建立學生課程數(shù)據(jù)庫基本表

    這篇文章主要給大家介紹了關于mysql如何用sql語句建立學生課程數(shù)據(jù)庫基本表的相關資料,學生表是一個常見的數(shù)據(jù)表,用于存儲學生的個人信息和成績等相關數(shù)據(jù),文中通過代碼示例介紹的非常詳細,需要的朋友可以參考下
    2023-12-12
  • MySQL中JSON_CONTAINS用法、語法、示例及其應用場景

    MySQL中JSON_CONTAINS用法、語法、示例及其應用場景

    這篇文章主要介紹了MySQL中JSON_CONTAINS用法、語法、示例及其應用場景的相關資料,JSON_CONTAINS函數(shù)用于檢查JSON文檔是否包含特定值或對象,這個函數(shù)非常適合于處理嵌套的JSON數(shù)據(jù)和靈活的查詢需求,需要的朋友可以參考下
    2024-10-10
  • mysql5.7大量sleep進程常規(guī)處理方式及配置示例

    mysql5.7大量sleep進程常規(guī)處理方式及配置示例

    這篇文章主要給大家介紹了關于mysql5.7大量sleep進程常規(guī)處理方式及配置的相關資料,sleep連接過多會嚴重消耗mysql服務器資源(主要是cpu,內存),并可能導致mysql崩潰,需要的朋友可以參考下
    2023-08-08
  • mac系統(tǒng)下mysql 8.0.11 安裝指南

    mac系統(tǒng)下mysql 8.0.11 安裝指南

    這篇文章主要為大家詳細介紹了mac系統(tǒng)下mysql 8.0.11 安裝指南,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • MySQL ALTER命令使用詳解

    MySQL ALTER命令使用詳解

    這篇文章主要為大家詳細介紹了MySQL ALTER命令的使用方法,簡單實用,感興趣的小伙伴們可以參考一下
    2016-05-05
  • Mysql觸發(fā)器語法解讀(附帶簡單實用例子)

    Mysql觸發(fā)器語法解讀(附帶簡單實用例子)

    這篇文章主要介紹了Mysql觸發(fā)器語法解讀(附帶簡單實用例子),具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • MySQL系列數(shù)據(jù)庫設計三范式教程示例

    MySQL系列數(shù)據(jù)庫設計三范式教程示例

    這篇文章主要為大家介紹了MySQL系列之數(shù)據(jù)庫設計三范式的教程示例講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步
    2021-10-10
  • MySql存儲引擎的作用

    MySql存儲引擎的作用

    mysql面試中最常問的問題之一:小伙子,你說一下你們公司用的存儲引擎,以及你知道有哪些存儲引擎和他們之間的區(qū)別? 所以下面這篇文章主要給大家介紹了關于Mysql存儲引擎的相關資料,需要的朋友可以參考下
    2022-09-09
  • Linux下實現(xiàn)MySQL數(shù)據(jù)備份和恢復的命令使用全攻略

    Linux下實現(xiàn)MySQL數(shù)據(jù)備份和恢復的命令使用全攻略

    這篇文章主要介紹了Linux下實現(xiàn)MySQL數(shù)據(jù)備份和恢復的命令使用全攻略,包括使用Mysqldump和LVM快照以及xtrabackup三種方法,傾力推薦!需要的朋友可以參考下
    2015-11-11

最新評論