
和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;

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




