当前位置: 首页 > news >正文

MySQL常用函数

一 字符串函数

函数函数说明
conv(n,from_base,to_base)进制转换,对from_base进制的数n,转成to_base进制的表示方式
concat(str1,str2,…)将多个参数拼接成一个字符串,只要有一个为null,就返回null
concat_ws(separator,str1,str2,…)使用指定的separator连接符,将后续的参数拼接起来
group_concat(column_name [SEPARATOR separator ])将每组中的指定字段的多个值拼接起来,默认使用逗号隔开,可以指定分隔符
lpad(str,len,padstr)、rpad(str,len,padstr)用字符串padstr填补str左端/右端直到字串长度为len并返回
left(str,len) 、right(str,len)返回字符串str的左端/右端的len个字符
substring(str,pos[,len])返回字符串str的位置pos起len个字符,此函数的下标是从1开始
length(str)、octet_length(str)返回参数对应的默认字符集的所有字节数
char_length(str)、character_length(str)返回字符串str的字符长度
ltrim(str)、rtrim(str)、trim(str)返回删除了左空格/右空格的字符串str
lcase(str)、lower(str)、ucase(str)、upper(str)返回str的大小写
replace(str,oldsub,newsub)用字符串newsub替换字符串str中的子串oldsub并返回
insert(str,pos,len,newstr)把字符串str由位置pos起len个字符长的子串替换为字符串newstr并返回
find_in_set(element,“ele1,ele2…”)查找指定元素element是否在第二个参数中,返回0表示没找到,元素下标从1开始。

二 数值函数

函数函数说明
pow(x,y)/power(x,y)返回x的y次幂
sqrt(n)返回非负数n的平方根
pi()返回圆周率
rand()、rand(n)返回在范围0到1.0内的随机浮点值(可以使用数字n作为初始值)
truncate(n,d)保留数字n的d位小数并返回
least(x,y,…)、greatest(x,y,…)求最小值或最大值
mod(n,m)取模运算,返回n被m除的余数
ceil(n)、ceiling(n)、floor(n)向上/向下取整函数
round(n[,d])返回n的四舍五入值,保留d位小数(d的默认值为0)

三 日期函数

函数函数说明
curdate()\curtime()\now()\sysdate()\current_timestamp()获取系统时间
dayofweek(date) \weekday(date) \dayname(date)获取星期几
dayofmonth(date) \dayofyear(date) \monthname(date)获取第几天
year(date)\month(date)\day(date) \ hour(date) \minute(date) \second(date)获取时间分量
date_format(date,format) (%Y年 %m月 %d日 %h时 %i分 %s秒 %p上下午 %W星期)日期格式化,根据format字符串格式化date的值
date_add(date,interval value unit) \date_sub(date,interval value unit)日期运算
adddate(date,interval value unit) \subdate(date,interval value unit)日期运算

四 其他函数

DROP TABLE IF EXISTS tb_score;CREATE TABLE tb_score(id INT(11) NOT NULL auto_increment,userid VARCHAR(20) NOT NULL COMMENT '用户id',subject VARCHAR(20) COMMENT '科目',score DOUBLE COMMENT '成绩',PRIMARY KEY(id)
)ENGINE = INNODB DEFAULT CHARSET = utf8;INSERT INTO tb_score(userid,subject,score) VALUES ('001','语文',90);
INSERT INTO tb_score(userid,subject,score) VALUES ('001','数学',92);
INSERT INTO tb_score(userid,subject,score) VALUES ('001','英语',80);
INSERT INTO tb_score(userid,subject,score) VALUES ('002','语文',88);
INSERT INTO tb_score(userid,subject,score) VALUES ('002','数学',90);
INSERT INTO tb_score(userid,subject,score) VALUES ('002','英语',75.5);
INSERT INTO tb_score(userid,subject,score) VALUES ('003','语文',70);
INSERT INTO tb_score(userid,subject,score) VALUES ('003','数学',85);
INSERT INTO tb_score(userid,subject,score) VALUES ('003','英语',90);
INSERT INTO tb_score(userid,subject,score) VALUES ('003','政治',82);

4.1 条件分支函数

4.1.1 单条件分支函数:if

  1. 语法:if(express,value1,value2):

​ 解析:如果express表达式成立,就返回value1,否则返回value2.

  1. 需求:查询每一行的uid和语文成绩,如果不是语文,就显示-1.
select userid,if(subject='语文',score,-1) from tb_score;
  1. 需求: 行转列, (一个人的数据是多行,转成一个人的数据是一行多列形式)
多行数据:
1        001        语文        90
2        001        数学        92
3        001        英语        80
4        002        语文        88
5        002        数学        90
6        002        英语        75.5UID     语文     数学    英语
001     90       92     80
002     88       90     75.5
.....
select userid,
max(if(subject='语文',score,0)) 语文,
max(if(subject='数学',score,0)) 数学,
max(if(subject='英语',score,0)) 英语,
max(if(subject='政治',score,0)) 政治
from tb_score group by userid;

4.1.2 多条件分支函数:case

  1. 语法:

    1. 写法1: 等值比较
      case  column_name when value1 then returnValue1  when value2 then returnValue2 ...else returnValueN end;
    
    1. 写法2:
      case  when condition1 then returnValue1  when condition2 then returnValue2 ...else returnValueN end;
    
  2. 案例1:有职位的年终奖发放工资的1.5倍,没有职位的发放1.2倍。查询每个人的姓名,职位,工资以及年终奖。

      select enam,job,sal,if(job is not null,sal*1.5,sal*1.2) from emp;
    
  3. 案例2:年终发奖金,职位’MANAGER’ 发放月薪的1.2倍,‘SALESMAN’ 发放月薪的1.1倍 'CLERK’发放月薪的1.05倍。其他职位发送月薪作为奖金。查询每个人的姓名,职位,工资以及年终奖。

      select enam,job,sal,(case when job = 'manager' then sal*1.2when job = 'salesman' then sal*1.1when job = 'clerk' then sal*1.05else sal end) 年终奖from emp;
    
  4. 案例3:职位’MANAGER’的给予SVIP会员,职位’SALESMAN’ 的给予VIP会员,其他职位为普通用户USER,统计每个身份的人数。

      select count(1), (case job when 'manager' then 'svip' when 'salesman' then 'vip' else 'user' end) 身份from emp e group by (case job when 'manager' then 'svip' when 'salesman' then 'vip' else 'user' end);
    

4.1.3 列转行

多列转多行: 一个人的数据由多列转成多行的形式。

UID     语文     数学    英语
001     90       92     80
002     88       90     75.5想要如下結果:1        001        语文        90
2        001        数学        92
3        001        英语        80
4        002        语文        88
5        002        数学        90
6        002        英语        75.5
select userid,score,subject from (select userid, chinese score,'语文' subject from s1001
union all
select userid, math score,'数学' subject  from s1001
union all
select userid, english score ,'英语' subject from s1001
union all
select userid, zhengzhi score,'政治' subject  from s1001
order by userid) t
where score <> 0 and score is not null;

4.2 窗口函数

4.2.1 窗口函数介绍

窗口函数,也被称为分析函数,是 MySQL 8.0 引入的一项强大功能 ,它能够在查询结果集中对数据进行分组、排序和计算,而无需使用临时表或自连接。窗口函数的语法结构如下:

window_function(expr) 
OVER ([PARTITION BY partition_expression, ...][ORDER BY sort_expression [ASC | DESC], ...])

window_function有如下分类:

能类型函数名应用场景
聚合类SUM, AVG, COUNT、max、min对窗口内的数据进行聚合计算
排名类ROW_NUMBER, RANK, DENSE_RANK对数据进行排序并生成排名
分布类PERCENT_RANK, CUME_DIST计算分布情况
偏移类LAG, LEAD获取上下行数据

4.2.2 over函数解析

OVER() 函数是 窗口函数(Window Function) 的一部分,用于在查询中执行基于一组的行计算,同时保留这些行的原始记录。这与传统的聚合函数(如 SUM()、AVG() 等)不同,后者通常会将多行合并为一行输出。

  • PARTITION BY: 将数据划分为多个逻辑分区(类似GROUP BY),每个分区独立计算
  • ORDER BY: 定义窗口内行的排序方式,影响如累计、排名等计算顺序

4.2.3 排名函数

1)场景介绍

张三 10000      1     1      1
李四 10000      1     1      2
王五 10000      1     1      3
小六 10000      1     1      4
小七 9000       2     5      5
小红 8000       3     6      6
小明 7000       4     7      7三种排名的特点:
1.   排名的名次可能重复,名次不同的情况下是连续的自然数
2.   排名的名次可能重复, 名次不同的情况下可能出现跳跃情况。
3.   排名的名次不重复,名次不同的情况下是连续的自然数

2)row_number()

给排序过的表记录分配行号,从1开始的连续自然数

3)rank()

给排序过的表记录分配名次。 相同的值名次一样,后续的排名出现跳跃情况

4)dense_rank()

给排序过的表记录分配名次。 相同的值名次一样,后续的排名不出现跳跃情况

-- 需求:整个公司做工资降序排名
select * 
from 
(select ename,sal,row_number() over(order by sal desc) rk from emp )t where rk between 3 and 5;select deptno,ename,sal,row_number() over(partition by deptno order by sal desc) rk from emp;select deptno,ename,sal,rank() over(partition by deptno order by sal desc) rk from emp;
select deptno,ename,sal,dense_rank() over(partition by deptno order by sal desc) rk from emp;select *,max(sal) over(partition by deptno order by sal desc) rk from emp;
select *,sum(sal) over(partition by deptno order by sal desc) rk from emp;
select *,count(sal) over(partition by deptno order by sal desc) rk from emp;
http://www.dtcms.com/a/340029.html

相关文章:

  • 首届机器人足球运动会技术复盘:从赛场表现看智能机器人核心技术突破
  • Wireshark获取数据传输的码元速率
  • 中科米堆CASAIM提供机加工件来料自动化测量尺寸方案
  • Origin绘制气泡图|科研论文图表教程(附数据格式模板)
  • 【HarmonyOS】H5 实现在浏览器中正常跳转 AppLinking 至应用
  • Java基础 8.19
  • 基于SpringBoot的停车场管理系统【2026最新】
  • C文件/Linux内核级文件理解
  • 软考网工选择题-1
  • 路由器详解
  • Windows 8.1 补丁 KB2919355 安装方法 详细步骤
  • 【Netty4核心原理⑫】【异步处理双子星 Future 与 Promise】
  • 【AI】算法环境-显卡、GPU、Cuda、NVCC和cuDNN的区别与联系
  • Stimulsoft 发布 2025.3 版本:支持在报表计算中解释运行 C# 脚本
  • Apache ShenYu网关与Nacos的关联及如何配合使用
  • 基于Envoy的AI Gateway测试环境搭建
  • 基于决策树模型的汽车价格预测分析
  • DAY 50 预训练模型+CBAM模块
  • CiA402 伺服驱动标准与控制模式详解
  • STL——string的使用(快速入门详细)
  • 12.3.2设置背景色12.3.3 创建设置类12.4 添加飞船图像 12.4.1 创建Ship 类 12.4.2 在屏幕上绘制飞船
  • 【语法糖】什么是语法糖
  • RK3568 Linux驱动学习——Linux设备树
  • bun + vite7 的结合,孕育的 Robot Admin 【靓仔出道】(十四)
  • for-else 流程控制结构介绍
  • AVL树、红黑树理解
  • 人脸识别智慧检测算法在人群聚集场景应用
  • 关于less/sass两个css预处理器的总结
  • C++常用容器详解:原理、适用场景与代码示例
  • CentOS上安装Docker的完整流程