博客
关于我
MySQL I 有福啦,窗口函数大大提高了取数的效率!
阅读量:796 次
发布时间:2023-02-10

本文共 2000 字,大约阅读时间需要 6 分钟。

MySQL从8.0版本开始,引入了类似Sql Server和Oracle的窗口函数功能。窗口函数可以用来在查询中对数据进行分组排序,以下将通过实例详细介绍窗口函数的使用。

以下是用于学生分数的表格和相关查询语句:

DROP TABLE IF EXISTS Marks;CREATE TABLE Marks(    学生 VARCHAR(10),    科目 CHAR(2),    分数 INT);INSERT INTO Marks VALUES    ('赵四', '语文', 88),    ('赵四', '数学', 48),    ('赵四', '英语', 75),    ('张三', '语文', 30),    ('张三', '数学', 75),    ('张三', '英语', 75),    ('王五', '语文', 90),    ('王五', '数学', 94),    ('王五', '英语', 70),    ('李四', '语文', 82),    ('李四', '数学', 69),    ('李四', '英语', 90);
SELECT * FROM Marks;

窗口函数的分类

窗口函数可以大致分为两大类:

  • 聚合窗口函数:如SUM、AVG、COUNT、MAX、MIN等。
  • 排序窗口函数:如RANK、DENSE_RANK、ROW_NUMBER等。
  • 以下以SUM函数为例,展示窗口函数和聚合函数的使用差异。

    -- 窗口函数SELECT 学生, 科目, 分数,        SUM(分数) OVER (PARTITION BY 学生) AS '总分' FROM Marks;
    -- 聚合函数SELECT 学生, SUM(分数) AS '总分' FROM Marks GROUP BY 学生;

    在上述两个查询中,窗口函数和聚合函数的结果一致,但窗口函数保留了原始数据的详细信息,可能会出现重复的总分结果。

    窗口函数的语法

    窗口函数的语法格式如下:

    window_function_name(expression) OVER (    [partition_defintion]     [order_definition]     [frame_definition])
    • partition_defintion:根据指定的表达式对数据进行分区。例如,PARTITION BY 学生会根据学生的姓名进行分区。
    • order_definition:为分区内的数据进行排序。例如,ORDER BY 分数 DESC会对每个学生的分数进行降序排序。
    • frame_definition:定义窗口的范围。默认情况下,窗口范围包括所有数据。如果需要限制范围,可以使用ROWSRANGE来指定。

    窗口函数的分区和排序

    以下是通过窗口函数实现的分区和排序操作示例。

    SELECT 学生, 科目, 分数,        MAX(分数) OVER (PARTITION BY 学生 ORDER BY 分数 DESC) AS '最高分' FROM Marks;

    窗口函数的框架定义

    窗口框架的作用是限制分区中的数据范围。以下是使用框架定义的示例。

    SELECT 学生, 科目, 分数,        AVG(分数) OVER (PARTITION BY 学生                        ORDER BY 分数 ASC                        ROWS 2 preceding) AS moving_avgFROM Marks;

    常用的排序窗口函数

    除了聚合窗口函数,以下是一些常用的排序窗口函数:

  • ROW_NUMBER:为分区内的数据生成行号。
  • RANK:按降序或升序对分区内数据进行跳跃排序。
  • DENSE_RANK:为分区内数据生成连续密集排名。
  • NTILE:将分区内数据按指定数量分成若干组。
  • 以下是使用这些窗口函数的示例:

    SELECT 学生, 科目, 分数,        ROW_NUMBER() OVER (PARTITION BY 科目 ORDER BY 分数 DESC) AS "Row_Number",         RANK() OVER (PARTITION BY 科目 ORDER BY 分数 DESC) AS 'Rank',         DENSE_RANK() OVER (PARTITION BY 科目 ORDER BY 分数 DESC) AS "Dense_Rank",         NTILE(4) OVER (PARTITION BY 科目 ORDER BY 分数 DESC) AS 'Quartile' FROM Marks;

    通过这些窗口函数,可以对数据进行排序、分组和分区操作,从而实现复杂的数据分析需求。

    转载地址:http://qhffk.baihongyu.com/

    你可能感兴趣的文章
    MySQL中interactive_timeout和wait_timeout的区别
    查看>>
    mysql中int、bigint、smallint 和 tinyint的区别、char和varchar的区别详细介绍
    查看>>
    mysql中json_extract的使用方法
    查看>>
    mysql中json_extract的使用方法
    查看>>
    mysql中kill掉所有锁表的进程
    查看>>
    mysql中like % %模糊查询
    查看>>
    MySql中mvcc学习记录
    查看>>
    mysql中null和空字符串的区别与问题!
    查看>>
    MySQL中ON DUPLICATE KEY UPDATE的介绍与使用、批量更新、存在即更新不存在则插入
    查看>>
    MYSQL中TINYINT的取值范围
    查看>>
    MySQL中UPDATE语句的神奇技巧,让你操作数据库如虎添翼!
    查看>>
    Mysql中varchar类型数字排序不对踩坑记录
    查看>>
    MySQL中一条SQL语句到底是如何执行的呢?
    查看>>
    MySQL中你必须知道的10件事,1.5万字!
    查看>>
    MySQL中使用IN()查询到底走不走索引?
    查看>>
    Mysql中使用存储过程插入decimal和时间数据递增的模拟数据
    查看>>
    MySql中关于geometry类型的数据_空的时候如何插入处理_需用null_空字符串插入会报错_Cannot get geometry object from dat---MySql工作笔记003
    查看>>
    mysql中出现Incorrect DECIMAL value: '0' for column '' at row -1错误解决方案
    查看>>
    mysql中出现Unit mysql.service could not be found 的解决方法
    查看>>
    mysql中出现update-alternatives: 错误: 候选项路径 /etc/mysql/mysql.cnf 不存在 dpkg: 处理软件包 mysql-server-8.0的解决方法(全)
    查看>>