最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Mysql 8 新特性 window functions 的作用

 更新時(shí)間:2017年11月30日 11:03:59   作者:性能與架構(gòu)  
MySQL是眾多網(wǎng)站技術(shù)棧中的標(biāo)準(zhǔn)配置,是廣受歡迎的開源數(shù)據(jù)庫(kù),已經(jīng)推出了8.0的第一個(gè)候選發(fā)行版本。接下來(lái)通過本文給大家分享Mysql 8 新特性 window functions 的作用,需要的朋友參考下吧

MySQL 8.0的新特性包括:

  • 對(duì)Unicode 9.0的開箱即用的完整支持
  • 支持窗口函數(shù)和遞歸SQL語(yǔ)法,這在以往是不可能或者很難才能編寫這樣的查詢語(yǔ)句
  • 對(duì)原生JSON數(shù)據(jù)和文檔存儲(chǔ)功能的增強(qiáng)支持
  • MySQL 8.0的發(fā)布,跳過了多個(gè)版本號(hào)(從5.5開始),由于6.0修改和7.0是用來(lái)保留做MySQL的集群版本,因此采用了8.0的版本號(hào)。

1. 問題

Mysql 8.0.2 中新增加了一個(gè)主要功能 - 窗口函數(shù) window function

這個(gè)功能具體是解決什么問題?下面先看一個(gè)SQL查詢的場(chǎng)景,看一下平時(shí)我們是怎么做的,然后再看一下如何使用窗口函數(shù)來(lái)更方便的解決

(1)準(zhǔn)備測(cè)試表和數(shù)據(jù)

建一個(gè)簡(jiǎn)單的電影信息表,字段有:

ID
release_year(發(fā)行年份)
category_id(所屬分類ID)
rating(評(píng)分)
CREATE TABLE films (
 id int(11),
 release_year int(11),
 category_id int(11),
 rating decimal(3,2)
)

插入測(cè)試數(shù)據(jù)

insert into films2 values
(1,2015,1,8.00),
(2,2015,2,8.50),
(3,2015,3,9.00),
(4,2016,2,8.20),
(5,2016,1,8.40),
(6,2017,2,7.00);

整體形式如下

(2)查詢需求

查詢每一年中的平均評(píng)分,要求每條記錄后面都顯示當(dāng)年的平均評(píng)分

例如 2015 年,有3條記錄,8.00, 8.50, 9.00 的平均分是 8.5,2016年有2條記錄,平均分是 8.3,2017年有1條記錄,平均分為 7.00

最終結(jié)果的形式如下:

我們可以使用子查詢來(lái)計(jì)算各年的平均分,然后使用 join 把結(jié)果連接回去

SELECT
 f.id, f.release_year, 
 f.rating, years.year_avg
FROM films f
LEFT JOIN (
 SELECT f.release_year, 
  AVG(rating) AS year_avg
 FROM films f
 GROUP BY f.release_year
) years 
ON f.release_year = years.release_year

是不是有點(diǎn)復(fù)雜,下面看下窗口函數(shù)的處理方式

2. window functions 的解決方案

什么是 window functions

window functions 是對(duì)一組數(shù)據(jù)進(jìn)行計(jì)算,與使用 group by 時(shí)不同,不會(huì)進(jìn)行單行的結(jié)果輸出,而是與每條記錄相關(guān)聯(lián)

語(yǔ)法示例:

SELECT
function_name OVER ( window_definition )
FROM (...)

window_definition 是定義要計(jì)算的記錄集合,就像是一個(gè)小窗口,在整體數(shù)據(jù)集合上顯示出一部分

function_name 指定了對(duì)于窗口中的數(shù)據(jù)集合執(zhí)行什么計(jì)算

回頭看下上面的那個(gè)查詢,需要計(jì)算每部電影所在年份的所有電影平均評(píng)分,下面使用窗口函數(shù)來(lái)處理

SELECT
 f.id, f.release_year, 
 f.category_id, f.rating,
 AVG(rating) OVER 
 (PARTITION BY release_year) AS year_avg
FROM films f

window_definition 部分使用了 PARTITION BY 從句,它告訴數(shù)據(jù)庫(kù)把結(jié)果數(shù)據(jù)集合分割成更小的部分,把 release_year 相同的放在一起,函數(shù) AVG(rating) 會(huì)對(duì)每個(gè)窗口數(shù)據(jù)進(jìn)行計(jì)算,然后把結(jié)果放到每一行中

查詢示例1

計(jì)算每部電影在所屬年份中的評(píng)分排行位置

查詢語(yǔ)句

SELECT
 f.id, f.release_year, 
 f.category_id, f.rating,
 RANK() OVER (PARTITION BY release_year 
  ORDER BY rating DESC) AS year_rank
FROM films f

window_definition 部分使用 PARTITION BY 來(lái)根據(jù) release_year 劃分窗口,使用 ORDER BY 在窗口內(nèi)排序

RANK() 函數(shù)可以返回一行數(shù)據(jù)在本窗口中的位置

查詢結(jié)果

查詢示例2

查看每部電影在總排行榜中的位置

查詢語(yǔ)句

SELECT
 f.id, f.release_year, 
 f.category_id, f.rating,
 RANK() OVER (ORDER BY rating DESC) 
  AS general_rank
FROM films f order by id

主語(yǔ)句中的 order by 保證了整個(gè)數(shù)據(jù)集的排序

window_definition 中沒有使用 PARTITION BY,那么就是把整個(gè)結(jié)果集合當(dāng)做一個(gè)窗口,ORDER BY 對(duì)窗口中的數(shù)據(jù)根據(jù) rating 做降序排序,把得分最高的放前面

RANK() 函數(shù)取得每條記錄在窗口中的位置

查詢結(jié)果

3. 小結(jié)

窗口函數(shù)是 Mysql 8.0.2 中的高級(jí)特性,可以方便的執(zhí)行聚合計(jì)算,而不用對(duì)結(jié)果集進(jìn)行實(shí)際的聚合,大大增加了靈活性、可讀性,更便于維護(hù)

相關(guān)文章

  • Mysql如何查看表的索引

    Mysql如何查看表的索引

    這篇文章主要介紹了Mysql如何查看表的索引問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • MySQL分庫(kù)分表的幾種方式

    MySQL分庫(kù)分表的幾種方式

    這篇文章主要介紹了MySQL分庫(kù)分表的幾種方式,分庫(kù)分表方案是對(duì)關(guān)系型數(shù)據(jù)庫(kù)數(shù)據(jù)存儲(chǔ)和訪問機(jī)制的一種補(bǔ)充,下文更多相關(guān)介紹需要的小伙伴可以參考一下
    2022-04-04
  • MySQL按月自動(dòng)設(shè)置表分區(qū)的實(shí)現(xiàn)

    MySQL按月自動(dòng)設(shè)置表分區(qū)的實(shí)現(xiàn)

    本文主要介紹了MySQL按月自動(dòng)設(shè)置表分區(qū)的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2025-03-03
  • MySQL監(jiān)控Innodb信息工作流程

    MySQL監(jiān)控Innodb信息工作流程

    這篇文章主要為大家介紹了MySQL監(jiān)控Innodb信息工作流程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2024-02-02
  • mysql提示got timeout reading communication packets的解決方法

    mysql提示got timeout reading communication packets的解決方法

    今天發(fā)現(xiàn)mysql錯(cuò)誤日志中出現(xiàn)got timeout reading communication packets,一般情況因?yàn)椴糠猪?yè)面生成有問題導(dǎo)致,這里簡(jiǎn)單分享一下解決方法
    2019-05-05
  • mysql批量更新多條記錄的同一個(gè)字段為不同值的方法

    mysql批量更新多條記錄的同一個(gè)字段為不同值的方法

    最近在工作的時(shí)候突然想到了一個(gè)問題,就是mysql如何才能實(shí)現(xiàn)批量更新多條記錄的同一個(gè)字段為不同值,于是就動(dòng)手實(shí)踐起來(lái)了,發(fā)現(xiàn)其中的學(xué)問還是挺多的,所以想著就總結(jié)下來(lái)分享給大家,有需要的朋友們可以參考借鑒,下面來(lái)一起看看吧。
    2016-12-12
  • 詳解mysql中字符串轉(zhuǎn)為數(shù)字的三種方法

    詳解mysql中字符串轉(zhuǎn)為數(shù)字的三種方法

    這篇文章主要為大家詳細(xì)介紹了mysql中字符串轉(zhuǎn)為數(shù)字的三種常用方法,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-11-11
  • MySQL性能優(yōu)化 出題業(yè)務(wù)SQL優(yōu)化

    MySQL性能優(yōu)化 出題業(yè)務(wù)SQL優(yōu)化

    根據(jù)用戶的作答結(jié)果出練習(xí)卷,題目的優(yōu)先級(jí)為:未做過的題目>只做錯(cuò)的題目>做錯(cuò)又做對(duì)的題目>只做對(duì)的題目。
    2010-08-08
  • 一文帶你學(xué)會(huì)Mysql表批量添加字段

    一文帶你學(xué)會(huì)Mysql表批量添加字段

    本文主要介紹了MySQL表如何批量添加字段的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • MySQL主從復(fù)制不一致的原因分析以及解決

    MySQL主從復(fù)制不一致的原因分析以及解決

    這篇文章主要介紹了MySQL主從復(fù)制不一致的原因分析以及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12

最新評(píng)論

三原县| 普洱| 远安县| 岑溪市| 运城市| 汤阴县| 高尔夫| 新绛县| 河津市| 彭阳县| 贵港市| 柘城县| 睢宁县| 白城市| 临泽县| 民乐县| 古蔺县| 东台市| 甘肃省| 香格里拉县| 清河县| 阿克陶县| 永善县| 阿勒泰市| 淳安县| 临夏市| 两当县| 南开区| 长泰县| 元阳县| 登封市| 科尔| 余姚市| 京山县| 冀州市| 鹤岗市| 枝江市| 定南县| 莒南县| 东平县| 调兵山市|