数据库MYSQL笔记8——函数

这篇博客详细介绍了MYSQL数据库中各类函数的使用,包括数值型数学计算(如ABS, EXP)、数值型聚合计算(如COUNT, SUM)、日期时间型函数(如NOW, CURDATE)、字符串操作(如CONCAT, SUBSTRING_INDEX)以及窗口函数的应用。还提到了一些特殊函数,如随机数RAND、日期偏移DATE_ADD以及百分位计算等。" 90485591,8160100,生化危机:安全路径判断,"['算法', '图论', '数据结构', '路径查找']

数值型数学计算

  • 绝对值ABS
  • 指数函数EXP
  • 四舍五入ROUND( , 保留位数)
  • 圆周率PI
  • 余数MOD
    • MOD(5,2)=1
  • 向上取整CEIL
    • CEIL(5.1)=6
  • 向下取整FLOOR
    • FLOOR(5.1)=5
  • 0-1之间随机函数RAND
  • 幂运算POWER
    • POWER(2,3)=8
  • 平方根:SQRT

数值型聚合计算

  • 计数
    COUNT(*)/(任意常数)——计算表的行数,包括NULL
    COUNT(col)——计算某列,跳空
    COUNT(DISTINCT col1,col2…)——(多列)去重计数,类比group by 多列分组
  • 求和
    SUM(col)
    不跳空:四则运算a+b(NULL)+c=NULL;
    跳空:SUM(a,b,c)=SUM(a,c)
  • 均值
    AVG(col)
    与SUM跳空
  • 最大值
    MAX
    可排序的都可计算MAX;忽略NULL
  • 最小值
    MIN
    可排序的都可计算MIN;忽略NULL

日期时间型

  • 当前日期+时间:NOW

  • 当前日期+时间:SYSDATE

  • 当前年月日:CURDATE

  • 当前时分秒:CURTIMECURRENT_TIME

  • 等待时间 (秒):SLEEP()

  • 日期格式

    • 【年】%Y,4位;%y,2位;
    • 【月】%M 英文;%m 数值;
    • 【日】D% 带英文后缀的顺序数,如1st,2nd;d% 仅数值
  • 文本格式转年月日格式: str_to_date

    • select str_to_date(‘08/09/2008’, ‘%m/%d/%Y’);
  • 日期转自定义日期格式 date_format

    • select date_format(now(),‘%Y-%M-%d %H’) ; – 2020-May-23 17
  • 提取时间

    • 年月日的日期:DATE
    • 时分秒的日期:TIME
    • 年 月 季度 周 日:YEAR、MONTH、QUARTER、 WEEK、DAY
    • 时分秒:HOUR、MINUTES、SECOND
    • EXTRACT(YEAR FROM 2020-09-08)
  • 偏移日期

    • 时间增加/ 减少:DATE_ADD / SUB(时间, INTERVAL [间隔] [偏移单位]
  • 时间差

    • 天数差:DATEDIFF(‘DAY’,‘BEGIN’,‘END’) 遵循后-前
      示例: DATEDIFF(DAY,‘2008-12-29’,‘2008-12-30’)
    • 时分秒差:TIMEDIFF(‘BEGIN’,‘END’) 遵循前-后 支持time、datetime格式
    • 返回指定格式的时间差:TIMESTAMPDIFF(‘时间单位’,‘BEGIN’,‘END’) 遵循后-前

字符间拼接

  • CONCAT(str1,str2,…)
  • CONCAT_WS(x, s1,s2…sn)
  • GROUP_CONCAT(x, s1,s2…sn) --分组后的对某字段的拼接
    每个字符串之间要加上 x,x 可以是分隔符

字符切分

  • SUBSTRING、MID(s, start, length)
    从字符串 s 的 start 位置截取长度为 length 的子字符串
  • SUBSTRING_INDEX(s, delimiter, number)
    取第N个隔符左/右边的字符。 如果 N是正数,取左边字符。 如负数,返回右边字符
    例子:SUBSTRING_INDEX(SUBSTRING_INDEX(‘a_b_c_d_e’,‘‘,3),’’,-1) 结果是c
  • LEFT(s,n)
    返回字符串 s 的前 n 个字符,从左边数
  • RIGHT(s,n)
    返回字符串 s 的后 n 个字符,也就是从右边数

字符串变换

  • 字符长度:CHARLENGTH
  • 字节长度 :LENGTH
  • 去除左/右/两边空值:LTRIM / RTRIM/TRIM
  • 大小写字母转换:UPPER / LOWER
  • REPLACE(str,from_str,to_str)指定字符串替换新的字符串
  • INSERT(str,pos,len,newstr)
    返回字符串str,在位置pos起始的子串且len个字符长的子串由字符串newstr替换
  • 颠倒字符顺序REVERSE(str)
  • 复制n次REPEAT(str,count)
    返回由重复count次的字符串str组成的一个字符串。如果count <= 0,返回一个空字符串。如果str或count是NULL,返回NULL。
  • 左边填充LPAD(s1,len,s2)
    :在字符串 s1 的左边开始处填充字符串 s2,使字符串长度达到 len。如果s2不够则重复填充多个s2,如果s2过长则优先取左边的字符使得达到len长度。
  • 右边填充RPAD

窗口函数

排序

  • RANK OVER (partition by … order by…)

    • 有相同记录时过之后的位次
  • DENSE_RANK OVER (partition by … order by…)

    • 有相同记录时不跳过之后的位次
  • ROW_NUMBER OVER (partition by … order by…)

    • 赋予唯一连续位次

聚合

  • SUM、AVG、COUNT、MAX、MIN ( …) OVER(partion by …order by …)****

      select v1,v2,sum(v2) over(**order by** v2) as sum     --仅排序,累计当前行及上面的行
      select v1,v2,sum(v2) over(**partition by** v1) as sum    --仅填充相同聚合值
      select v1,v2,sum(v2) over(**partition by** v1 **order by** v2) as sum     --先分组,后排序,再累加
      select v1,v2,sum(v2) over(**partition by v1 order by v1)** as sum   ---分组后,组内顺序按原表不变,累加
      select v1,v2,sum(v2) over(**partition by v1 order by v1 ROWS BETWEEN 6 PRECEDING AND CURRENT ROW)** as sum   ---分组后,组内顺序按原表不变,向上移动平均7行的聚合计算
    

在这里插入图片描述

偏移

  • LAG / LEAD (exp_str, n ,default) over(partition by …order by …)
    取出当前行 前 / 后 面第n行数据
    default是超出记录窗口时的默认值;不填,默认为NULL
    例子:
    在这里插入图片描述

在这里插入图片描述

百分位(0-1)

PERCENT_RANK() OVER (
[PARTITION BY partition_expression, … ]
ORDER BY sort_expression [ASC | DESC], …)
例子:
在这里插入图片描述
求百分位的其他两个方法见https://blog.csdn.net/weixin_33329305/article/details/113472520

2.percentile(字段,百分位)
返回某个字段从小到大排序后的百分比排位

例子:
求某主体小程序dau从小到大的百分位在80%的dau(dau从小到大)
在这里插入图片描述
结果:在这里插入图片描述
验证:从小到大排,45名的dau是92
在这里插入图片描述
举一反三:
(1)如果是想求dau排位在top10%的那个dau,
则应该是1-10%=90%,percentile(dau,0.9)
即第 57*0.9=50.4 取整后第51名。(从小到大)

(2)PERCENT_RANK 与percentile 的区别

PERCENT_RANKpercentile
功能1可间接求某个百分位的数值 (要加where rank=百分位%)直接返回某个百分位的数值
功能2可直接返回每行的所在百分位(升/降序均可)

正则

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值