mysql有四种函数
- 单行函数
- 多行函数
- 流程函数
- 窗口函数
单行函数
1.1 数值函数
-- 取绝对值
abs(-98) #98
-- 向上取整
ceil(9.00004) #10
-- 向下取整
floor(9.00001) #9
-- 四舍五入
round(9.66414172,2) #9.76
1.2 字符串函数
upper 将字母转化为大写
upper('gjjg') #GJJG
lower 将字母转化为小写
lower('GHjl') #ghjl
length 计算字节长度
length('fjhhjkv') #7
substring 截取部分字符串
string('ahigjg',2,4) #higj
-- string(要截取的字符串,从第几个字符开始截取,截取多少个字符)
concat 字符串拼接
concat('aa','hh','kk') #aahhkk
-- concat可以添加多个字符串
1.3 日期与时间函数
-- curdate()年月日 current date
SELECT curdate()
-- curtime()时分秒 current time
SELECT curtime()
-- now()年月日时分秒 当前语句执行的时间
SELECT now()
-- sysdate()年月日时分秒 当前函数执行的时间
SELECT sysdate()
-- sleep()表示暂停,括号内写数值,单位为秒
select sleep(3)
-- date_format(date, "%Y-%m-%d") h i s 时分秒,将日期改为自己想要的类型
date_format(date,'%y-%m')
-- date_add(date, interval expr type) 原时间加一个日期
-- expr 数值 type 时间类型
date_add(date,interval 7 day)
-- date_sub(date, interval expr type) 原时间减一个日期
-- expr 数值 type 时间类型
date_sub(date,interval 2 month)
-- datediff(date1, date2) 两日期之间相隔天数
-- 计算方式:date1-date2
datediff(now(),date2)
多行函数
多行函数有5个,max()最大值,min()最小值,count()计数,sum()求和,avg()平均数
count(*),count(1)的结果是一样的
如果非要对某一类的非空值/某一类型进行计数,可以用count(if(判断条件,1,null))
流程函数
条件判断函数
1. if分支结构
if(判断条件,条件成立结果,条件不成立结果)
2. case多分支结构
-- 判断内容为区间时
select * ,
case
when 播放量>10000 then '还不错'
when 播放量>5000 then '一般'
else '不行'
end 评价
from 表;
-- 判断内容为等值时
select *,
case 类型
when '火锅' then '喜欢'
when '甜品' then '最爱'
when '小吃' then '一般'
else '不喜欢'
end 喜爱度
from 表;
窗口函数
<窗口函数> over( partition by <用于分组的列名> order by<用于排序的列名>)
rank函数:如果有并列名词的行,会占用下一次名词的位置,正常是1,2,3,4,rank函数是1,1,3,4,4,6
SELECT *,
rank() over(
partition by cid
order by score desc
) rabking
from sc;
dense_rank函数:如果有并列名次的行,不占用下一名次的位置。比如正常排名是1,2,3,4,但是现在前3名是并列的名次,结果是:1,1,1,2,3
SELECT *,
dense_rank() over(
partition by cid
order by score desc
) rabking
from sc;
row_number函数:不考虑并列名次的情况。排名按顺次递增
SELECT *,
ROW_NUMBER() over(
partition by cid
order by score desc
) rabking
from sc;
score | rank | dense_rank | row_number |
---|---|---|---|
100 | 1 | 1 | 1 |
100 | 1 | 1 | 2 |
100 | 1 | 1 | 3 |
95 | 4 | 2 | 4 |
聚合函数作窗口函数
聚合函数作为窗口函数时,()括号里要填入参数
SELECT *,
sum(score) over(
partition by sid
order by score
) as 排名
from sc;