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

Mysql 8 新特性 window functions 的作用

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

MySQL 8.0的新特性包括:

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

1. 問題

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

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

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

建一個簡單的電影信息表,字段有:

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

插入測試數(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)查詢需求

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

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

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

我們可以使用子查詢來計算各年的平均分,然后使用 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 是對一組數(shù)據(jù)進(jìn)行計算,與使用 group by 時不同,不會進(jìn)行單行的結(jié)果輸出,而是與每條記錄相關(guān)聯(lián)

語法示例:

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

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

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

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

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ù)庫把結(jié)果數(shù)據(jù)集合分割成更小的部分,把 release_year 相同的放在一起,函數(shù) AVG(rating) 會對每個窗口數(shù)據(jù)進(jìn)行計算,然后把結(jié)果放到每一行中

查詢示例1

計算每部電影在所屬年份中的評分排行位置

查詢語句

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 來根據(jù) release_year 劃分窗口,使用 ORDER BY 在窗口內(nèi)排序

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

查詢結(jié)果

查詢示例2

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

查詢語句

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

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

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

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

查詢結(jié)果

3. 小結(jié)

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

相關(guān)文章

  • Mysql如何查看表的索引

    Mysql如何查看表的索引

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

    MySQL分庫分表的幾種方式

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

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

    本文主要介紹了MySQL按月自動設(shè)置表分區(qū)的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(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錯誤日志中出現(xiàn)got timeout reading communication packets,一般情況因?yàn)椴糠猪撁嫔捎袉栴}導(dǎo)致,這里簡單分享一下解決方法
    2019-05-05
  • mysql批量更新多條記錄的同一個字段為不同值的方法

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

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

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

    這篇文章主要為大家詳細(xì)介紹了mysql中字符串轉(zhuǎn)為數(shù)字的三種常用方法,文中的示例代碼講解詳細(xì),具有一定的借鑒價值,感興趣的小伙伴可以跟隨小編一起學(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)先級為:未做過的題目>只做錯的題目>做錯又做對的題目>只做對的題目。
    2010-08-08
  • 一文帶你學(xué)會Mysql表批量添加字段

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

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

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

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

最新評論

泰来县| 和平县| 泾源县| 红原县| 长兴县| 南安市| 绵竹市| 义马市| 句容市| 弥渡县| 永城市| 克东县| 密山市| 池州市| 横山县| 张家港市| 渭南市| 奉新县| 遂宁市| 井研县| 凤冈县| 乌鲁木齐县| 建瓯市| 武陟县| 天等县| 昭通市| 天峻县| 股票| 通辽市| 和静县| 衡水市| 大安市| 霍山县| 顺昌县| 原平市| 邳州市| 枞阳县| 辽阳县| 安庆市| 长乐市| 尼玛县|