MySQL —— 函数

本文详细介绍了MySQL中的函数,特别是窗口函数的使用。包括序号函数如row_number、rank和dense_rank,窗口聚合函数如sum、avg等在指定窗口内的计算,分布函数如cume_dist和percent_rank,以及前后函数lag和lead,还有头尾函数first_value和last_value的应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概述

在MySQL中,为了提高代码重用性和隐藏实现细节,MySQL提供了很多函数,函数可以理解为别人封装好的模板代码

分类

在MySQL中,函数非常多,主要可以分为以下几类:

  • 聚合函数
  • 数学函数
  • 字符串函数
  • 日期函数
  • 控制流函数
  • 窗口函数

聚合函数

在MySQL中聚合函数主要是:count、sum、min、max、avg…在前面的学习中都有学习过,还有一个特殊的函数,是没有学习过的 —— group_concat(),该函数用于实现行的合并,group_concat()函数首先根据 group by指定的列进行分组,并且用分隔符分隔,将同一组中的值连接起来,返回一个字符串结果
格式:

gropy_concat([distinct] 字段名 [order by 排序字段 asc/desc] [separator '分隔符']) 

说明:

  • 使用distinct可以排除重复值
  • 如果需要对结果中的值进行排序,可以使用order by子句
  • separator是一个字符串值,默认为逗号

数学函数

函数名描述实例
abs(x)返回x的绝对值select abs(-1) – 返回1
ceil(x)返回大于或等于x的最小整数select ceil(1.5) – 返回2
floor(x)返回小于或等于x的最大整数select floor(1.5) – 返回1
greatest(expr1,expr2,expr3,…)返回列表中的最大值select greatest(3,12,34,8,25) – 返回34
least(expr1,expr2,expr3,…)返回列表中的最小值select least(3,12,34,8,25) – 返回3
max(expression)返回expression中的最大值select max(price) from product
min(expression)返回expression中的最小值select min(price) from product
mod(x,y)返回x除以y以后的余数select mod(5,2) – 返回1
pi()返回圆周率select pi() – 返回3.141593
power(x,y)返回x的y次方select power(2,3) – 返回8
rand()返回0到1的随机数select rand() – 0.93099315644334
round(x)返回离x最近的整数(遵循四舍五入)select round(1.23456) – 返回1
round(x,y)返回指定位数的小数(遵循四舍五入)select round(1.23456,3) – 返回1.235
truncate(x,y)返回数值x保留到小数点后y位的值(与round最大的区别是不会进行四舍五入)select truncate(1.23456,3) – 返回1.234

字符串函数

函数描述实例
char_length(s)返回字符串s的字符数select char_length(‘runoob’) – 返回6
character_length(s)返回字符串s的字符数select character_length(‘runoob’) – 返回6
concat(s1,s2,s3…)将字符串s1,s2,s3…等多个字符串合并为一个字符串select concat(‘hello’,‘world’) – 返回helloworld
concat_ws(x,s1,s2…)同concat函数一样,但每个字符串之间会加上x,x可以是分隔符select concat_ws(’,’,‘hello’,‘world’) – 返回hello,world
field(s,s1,s2…)返回第一个字符串s在字符列表(s1,s2…)中的位置select field(‘c’,‘a’,‘b’,‘c’) – 返回3
trim(x)去除字符串s开始和结尾的空格select trim(’ a ') – 返回a
mid(s,n,len)从字符串s的n位置截取长度为len的子字符串,同substring(s,n,len)select mid(‘runoob’,2,3) – 返回 uno
position(s1 in s)从字符串s中获取s1的开始位置select position(‘b’ in ‘abc’) – 返回2
replace(s,s1,s2)将字符串s2替换字符串s中的字符串s1select replace(‘abc’,‘a’,‘x’) – 返回xbc
reverse(s)将字符串s的顺序反过来select reverse(‘abc’) – 返回cba

控制流函数

函数描述实例
if(expr,v1,v2)如果表达式expr成立,返回结果v1,反之返回结果v2select if(1>0,‘正确’,‘错误’) – 返回正确
ifnull(v1,v2)如果的值不为null,则返回v1,反之返回v2select ifnull(null,‘helloworld’) – 返回helloworld
isnull(expression))判断表达式是否为nullselect isnull(null) – 返回1
nullif(expr1,expr2)比较两个字符串,如果字符串expr1与expr2相等,返回null,否则返回expr1select nullif(24,25) 返回24

case when语句

case expression
	when condition1 then result1
	when condition2 then result2
	...
	when conditionN then resultN
	else result
end

解释:
case表示函数开始,end表示函数结束,如果expression比较condition1成立,则返回result1,如果condition2成立,则返回result2,如果全部都不成立,则返回reslut,而当有一个expression比较condition成立,则后面的condition都不执行

窗口函数

MySQL8.0新增窗口函数,窗口函数又称开窗函数,与Oracle窗口函数类似,属于MySQL的一大特点
窗口函数相对于聚合函数来说,聚合函数是对一组数据计算后返回单个值(即分组),窗口函数一次只会处理一行数据,窗口函数在行记录上计算某个字段的结果时,可将窗口范围内的数据输入到聚合函数中,并不改变行数
语法结构:

window_function(expr) over(
	partition by ...
	order by ...
	frame_clause
)

解释:
window_function是窗口函数的名称,expr是参数,有些函数不需要参数,over子句包含三个选项:

  • 分区(partition by)是用于将数据行拆分成多个分区(组),它的作用类似于group by分组,如果省略了partition by,所有的数据作为一个组进行计算
  • 排序(order by)是用于指定分区内的排序方式,与order by子句的作用类似
  • 窗口大小(frame_clause)是用于在当前分区内指定一个计算窗口,也就是一个与当前行相关的数据子集
#创建表employee
create table employee(
	dname varchar(20), -- 部门名
	eid varchar(20), 
	ename varchar(20),
	hiredate date, -- 入职日期
	salary double -- 薪资
)

1 序号函数

序号函数有三个:row_number()、rank()、dense_rank()可以用来实现分组排序,并添加序号
格式:

row_number() | rank() | dense_rank() over(
	partition by ...
	order by ...
)

操作:

#对每个部门的员工按照薪资排序,并给出排名
select dname,ename,salary row_number() over (partition by dname order by salary desc) as rn from employee

注意: row_number()、rank()、dense_rank()使用起来区别在于添加的序号规则不同,其他用法均相同

2 窗口聚合函数

在窗口中每条记录动态的应用聚合函数(sum()、avg()、max()、min()、count()),可以动态计算在指定窗口内的各种聚合函数值

select dname,ename,salary,sum(salary) over(partition by dname order by hiredate) as pv1 from employee

注意: 使用窗口聚合函数时,over中加order by的话,默认显示结果为累加的效果,如果没有order by的话,默认把分组内的所有数据进行sum操作统一显示

3 分布函数

  • cume_dist:分组内小于、等于当前rank值得行数/分组内总行数,常用于获取比例
  • percent_rank:每行按照公式(rank-1)/(rows-1)进行计算,其中rank为rank()函数产生的序号,rows为当前窗口的记录总行数,这个函数不常用

4 前后函数

lag和lead
用途:返回位于当前行的前n行lag(exor,n)或后n行lead(expr,n)的expr的值
应用场景:查询前一名同学的成绩和当前同学成绩的差值

5 头尾函数

first_value和last_value
用途:返回第一个first_value(expr)或最后一个last_value(expr)expr的值
应用场景:截止到当前,按照日期排序查询第1个入职和最后一个入职员工的薪资

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值