暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

(九)MySQL高级函数

统计美学 2021-09-17
902



和Python类似,MySQL中的函数可以分为两大类:内置函数和自定义函数;内置函数即程序设计语言预先定义好的函数,我们可以直接调用这些API来实现一些功能,如使用Concat()函数将各个字段拼接起来、使用聚集函数COUNT()统计各个分组的数据量等等;鉴于函数的强大功能与便利性,除了内置函数,程序设计语言允许用户自定义一些函数,已完成更加复杂、更加个性化的功能,数据库语言MySQL当然也不例外!

函数
类别
细分
内置函数
数据处理函数
文本处理函数
数值处理函数
时间日期处理函数
聚集函数
高级函数
窗口函数
其他内置函数

自定义函数



备注:expr = expression, v = value;SELECT关键字除了用来检索数据之外(搭配FROM等子句),还可以用于方便的测试和试验函数与计算(省略FROM子句),如SELECT 2*3;将返回6,SELECT Now();将返回当前日期和时间。


常用高级函数

1、IF(expr, v1, v2):若表达式expr为真,则返回v1,否则返回v2;

2、IFNULL(v1, v2):若v1不为NULL,则返回v1,否则返回v2;

3、ISNULL(expr):判断expr是否为空,为空返回1(真),否则返回0(假);

4、USER():返回当前用户名,DATABASE():返回当前数据库名,VERSION():返回MySQL版本号;


窗口函数


窗口函数,也叫OLAP函数(Online Anallytical Processing,联机分析处理),可以对数据库数据进行实时分析处理,可以分为:

1、专用窗口函数:Rank(), Dense_rank(), Row_number(),用于求基于某字段的排序值;

2、聚集函数:SUM(), AVG(), COUNT(), STD(), MAX(), MIN();

窗口函数的执行顺序位于WHERE子句之后,故只能在SELECT语句中使用,基本语法如下:

    SELECT <窗口函数> Over (PARTITION BY <用于分组的列名>
                    ORDER BY <用于排序的列名> ASC[DESC]) AS 'alias'

    注意:

    1、PARTITION BY子句并不是必须的,ORDER BY子句通常是必须的,因为要求排名;

    2、关于函数名大小写问题:MySQL是不区分大小写的,但通常遵循以下规则关键字全大写、函数名首字母大写并采用驼峰规则(当函数名由多个词构成时,如RTrim())、库表字段名用全小写并用下划线连接多个词;

    3、不同于ORDER BY子句仅对结果集进行排序,专用窗口函数还返回排序值并作为一个新计算字段出现在结果集中,在求排名时还可以进行分区PARTITION BY操作,用于在某个组内部进行排序;

    4、聚集函数通常与GROUP BY子句搭配进行数据统计分析,当它作为窗口函数时通常省略PATITION BY子句以在每一行的数据里直观的看到,截止到本行数据,统计数据是多少(最大值、最小值等),同时可以看出每一行数据,对整体统计数据的影响。


    窗口函数的应用:

    1、班级排名(分区)

    SELECT *, Rank() Over(PARTITION BY class_id ORDER BY grade DESC) AS ranking, 

    Dense_rank() Over(PARTITION BY class_id ORDER BY grade DESC) AS dense_ranking,

    Row_number() Over(PARTITION BY class_id ORDER BY grade DESC) AS row_numbering

    FROM grades;

    2、年级排名(不分区)

    SELECT *, Rank() Over(ORDER BY grade DESC) AS ranking, 

    Dense_rank() Over(ORDER BY grade DESC) AS dense_ranking,

    Row_number() Over(ORDER BY grade DESC) AS row_numbering

    FROM grades;

    从上面这个例子也可以很好的看出三个专用窗口函数的区别:

    1、rank(): 对作用域中指定字段进行排序,相等值排名相同且下一值的排名为所处行号;

    2、dense_rank(): 对作用域中指定字段进行排序,相等值排名相同但排序值是连续的正整数;

    3、row_number(): 对作用域中指定字段进行排序,返回的排名是所处行号,排名值是连续的正整数。





    END



    文章转载自统计美学,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

    评论