
窗口函数(window functions),也叫分析函数和OLAP函数,MySQL在8.0之后开始支持窗口函数。窗口函数可以用来对数据进行实时分析处理,和group by有类似之处,其区别在于窗口会对每个分组之后的数据按行进行分别 *** 作,而group by一般对分组之后的函数使用聚合函数汇总,做不到对不同的group中的行数据进行分别 *** 作。这就简单介绍几种常见的MySQL窗口函数。下表中列出了几种常见的窗口函数,并对其基本功能进行了描述。接下来我们会以一段示例,来展示MySQL中窗口函数的用途和效果。
假设我们存在一张如下的员工工资表,接下来我们将以这张表对窗口函数的使用方法进行简单的演示。
窗口函数的语法如下,所有的窗口函数均遵循以下语法:
其中 frame_clause 语法如下。
接下来我们将展示一些场景的窗口函数的用法和效果。
示例: 对所有员工按照薪资降序排序,并给出对应的row_number、rank和dense_rank的排名
示例: 对每个部门的员工按照薪资降序排序,并给出对应的row_number、rank和dense_rank的排名
示例: 对所有员工按照薪资降序排序,并给出对应的row_number、rank和dense_rank的排名,最终结果按照员工号进行排序输出。
示例: 找出每个部门工资最高的人。
示例: a.将所有员工按照工资递增的顺序分成4组。b.根据员工入职日期升序分成7组。
示例: 获取每个部门,按工资从低到高得累计和。
示例: 获取每个部门得工资累计和。
示例: 获取整个公司的薪资按照薪资递增的累计和。
示例: 获取整个公司的薪资按照薪资递增的前两行和后一行范围内的薪资和。
示例: 每个部门的平均工资。
示例: 获取整个公司的薪资按照薪资递增的前两行和后一行范围内的薪资平均值。
示例: 根据薪资排序,获取CUME_DIST()和PERCENT_RANK()
示例: a. 获取每个人入职前一行的数据,默认值为"2021-01-01"b. 获取每个人入职前两行的数据,不设置默认值c. 获取每个人入职后一行的数据,默认值为"2022-01-01"d. 获取每个人入职后两行的数据,不设置默认值
示例: a. 按照入职日期顺序排序,找出当前每个部门最先入职的人的薪资。b. 按照入职日期顺序排序,找出当前每个部门最后入职的人的薪资。
示例: a.获取截至当前工资第二高的人的工资。b.获取第二个入职的人的工资。
应用MySQL
时,会遇到不能创建函数的情况。出现如下错误信息:
复制代码
代码如下:
ERROR
1418
:
This
function
has
none
of
DETERMINISTIC,
NO
SQL,
or
READS
SQL
DATA
in
its
declaration
and
binary
logging
is
enabled
(you
*might*
want
to
use
the
less
safe
log_bin_trust_function_creators
variable)
那是因为没有将功能开启。
开启MySQL函数功能:
复制代码
代码如下:
SET
GLOBAL
log_bin_trust_function_creators=1
关闭MySQL函数功能:
复制代码
代码如下:
SET
GLOBAL
log_bin_trust_function_creators=0
查看状态:
复制代码
代码如下:
show
variables
like
'%func%'
运行在行组上,计算和返回单个值的函数。
AVG() 通过对表中行数计数并计算特定列值之和,求得该列的平均值。 AVG() 可用来返回所有列的平均值,也可以用来返回特定列或行的平均值。
COUNT() 函数进行计数。可利用 COUNT() 确定表中行的数目或符合特定条件的行的数目。
MAX() 返回指定列中的最大值, MAX() 要求指定列名。
返回指定列的最小值,要求指定列名。
用来返回指定列值的和(总计)。
以上提到的聚集函数都可以如下使用:
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)