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

mysql数据库学习之常用函数(五)

文章目录

  • 一、字符串函数
    • 1.1 concat (str1.str2,......)
    • 1.2 lower(str)
    • 1.3 upper(str)
    • 1.4 lpad(str,n,pad)
    • 1.5 rpad(str,n,pad)
    • 1.6 trim(str)
    • 1.7 substring(str,start,len)
    • 1.8 示例
  • 二、数值函数
    • 2.1 ceil(x)
    • 2.2 floor(x)
    • 2.3 mod(x,y)
    • 2.4 rand()
    • 2.5 round(x,y)
    • 2.6 示例
  • 三、日期函数
    • 3.1 curdate()
    • 3.2 curtime()
    • 3.3 new()
    • 3.4 YEAR(date)
    • 3.5 MONTH(date)
    • 3.6 DAY(date)
    • 3.7 date_add(date,INTERVAL expr type)
    • 3.8 DATEDIFF(date1,date2)
    • 3.9 示例
  • 四、流程函数
    • 4.1 if(value,t,f)
    • 4.2 ifnull(value1,value2)
    • 4.3 case when then else end
    • 4.4 示例

一、字符串函数

  • MySQL中内置了很多字符串函数,常用的几个如下:函数功能

    函数功能
    concat(S1,S2,…Sn)字符串拼接,将S1,S2,…Sn拼接成一个字符串
    lower(str)将字符串str全部转为小写
    upper(str)将字符串str全部转为大写
    lpad(str,n,pad)左填充,用字符串pad对str的左边进行填充,达到n个字符串长度
    rpad(str,n,pad)右填充,用字符串pad对str的右边进行填充,达到n个字符串长度
    trim(str)去掉字符串头部和尾部的空格
    substring(str,start,len)返回从字符串str从start位置起的len个长度的字符串

1.1 concat (str1.str2,…)

-- 字符串拼接,将S1,S2,...Sn拼接成一个字符串
mysql> select concat('Hello','World');
+-------------------------+
| concat('Hello','World') |
+-------------------------+
| HelloWorld              |
+-------------------------+
1 row in set (0.00 sec)

1.2 lower(str)

  -- 将字符串str全部转为小写mysql> select lower('Hello');+----------------+| lower('Hello') |+----------------+| hello          |+----------------+1 row in set (0.00 sec)

1.3 upper(str)

-- 将字符串str全部转为大写
mysql> select upper('Hello');
+----------------+
| upper('Hello') |
+----------------+
| HELLO          |
+----------------+
1 row in set (0.00 sec)

1.4 lpad(str,n,pad)

-- 左填充,用字符串pad对str的左边进行填充,达到n个字符串长度
mysql> select lpad('01', 5, '0');
+--------------------+
| lpad('01', 5, '0') |
+--------------------+
| 00001              |
+--------------------+
1 row in set (0.00 sec)

1.5 rpad(str,n,pad)

-- 右填充,用字符串pad对str的右边进行填充,达到n个字符串长度
mysql> select rpad('01', 5, '=');
+--------------------+
| rpad('01', 5, '=') |
+--------------------+
| 01===              |
+--------------------+
1 row in set (0.00 sec)

1.6 trim(str)

-- 去掉字符串头部和尾部的空格(字符中间的空格不受影响)
mysql> select trim(' Hello World ');
+-----------------------+
| trim(' Hello World ') |
+-----------------------+
| Hello World           |
+-----------------------+
1 row in set (0.00 sec)

1.7 substring(str,start,len)

-- 返回从字符串str从start位置起的len个长度的字符串(索引是从1开始)
mysql> select substring('Hello MySQL',1,5);
+------------------------------+
| substring('Hello MySQL',1,5) |
+------------------------------+
| Hello                        |
+------------------------------+
1 row in set (0.00 sec)

1.8 示例

-- 由于业务需求变更,企业员工的工号,统一为5位数,目前不足5位数的全部在前面补0。比如:1号员工的工号应该为000013
-- 创建emp表
CREATE TABLE  emp (`id` int(10) NOT NULL,`workno` varchar(6) DEFAULT NULL,`name` varchar(5) DEFAULT NULL,`gender` varchar(3) DEFAULT NULL,`age` int(3) DEFAULT NULL,`idcard` varchar(255) DEFAULT NULL,`workaddress` varchar(255) DEFAULT NULL,`entrydate` datetime DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;-- 插入数据
insert emp values("1","00001","张三","男",22,"12345678","北京","2000-01-01");
insert emp values("2","00002","李四","男",29,"12345679","上海","2003-01-01");
insert emp values("2","00003","王五","女",21,"12345676","深圳","2002-01-01");-- 运行结果
mysql> select * from emp;
+----+--------+------+--------+------+----------+-------------+---------------------+
| id | workno | name | gender | age  | idcard   | workaddress | entrydate           |
+----+--------+------+--------+------+----------+-------------+---------------------+
|  1 | 00001  | 张三 ||   22 | 12345678 | 北京        | 2000-01-01 00:00:00 |
|  2 | 00002  | 李四 ||   29 | 12345679 | 上海        | 2003-01-01 00:00:00 |
|  2 | 00003  | 王五 ||   21 | 12345676 | 深圳        | 2002-01-01 00:00:00 |
+----+--------+------+--------+------+----------+-------------+---------------------+
3 rows in set (0.00 sec)-- 企业员工的工号,统一为5位数,目前不足5位数的全部在前面补0
mysql> update emp set workno = lpad(workno, 5, '0');
Query OK, 0 rows affected (0.00 sec)
Rows matched: 3  Changed: 0  Warnings: 0mysql> select * from emp;
+----+--------+------+--------+------+----------+-------------+---------------------+
| id | workno | name | gender | age  | idcard   | workaddress | entrydate           |
+----+--------+------+--------+------+----------+-------------+---------------------+
|  1 | 00001  | 张三 ||   22 | 12345678 | 北京        | 2000-01-01 00:00:00 |
|  2 | 00002  | 李四 ||   29 | 12345679 | 上海        | 2003-01-01 00:00:00 |
|  2 | 00003  | 王五 ||   21 | 12345676 | 深圳        | 2002-01-01 00:00:00 |
+----+--------+------+--------+------+----------+-------------+---------------------+
3 rows in set (0.00 sec)

二、数值函数

  • 常见的数值函数如下:函数功能

    函数功能
    ceil(x)向上取整
    floor(x)向下取整
    mod(x,y)返回x/y的模
    rand()返回0~1内的随机数
    round(x,y)求参数x的四舍五入的值,保留y位小数

2.1 ceil(x)

-- 向上取整
mysql> select ceil(1.1);
+-----------+
| ceil(1.1) |
+-----------+
|         2 |
+-----------+
1 row in set (0.00 sec)

2.2 floor(x)

-- 向下取整
mysql> select floor(1.9);
+------------+
| floor(1.9) |
+------------+
|          1 |
+------------+
1 row in set (0.00 sec)

2.3 mod(x,y)

-- 返回x/y的模
mysql> select mod(7,4);
+----------+
| mod(7,4) |
+----------+
|        3 |
+----------+
1 row in set (0.00 sec)

2.4 rand()

-- 返回0~1内的随机数
mysql> select rand();
+--------------------+
| rand()             |
+--------------------+
| 0.8702676127387841 |
+--------------------+
1 row in set (0.00 sec)

2.5 round(x,y)

-- 求参数x的四舍五入的值,保留y位小数
mysql> select round(2.34,3);
+---------------+
| round(2.34,3) |
+---------------+
|         2.340 |
+---------------+
1 row in set (0.00 sec)

2.6 示例

-- 通过数据库的两函数,生成一个六位数的随机验证码
mysql> select lpad(round(rand()*1000000,0),6,'0');
+-------------------------------------+
| lpad(round(rand()*1000000,0),6,'0') |
+-------------------------------------+
| 131400                              |
+-------------------------------------+
1 row in set (0.00 sec)

三、日期函数

  • 常见的日期函数如下

    函数功能
    curdate()返回当前日期
    curtime()返回当前时间
    now()返回当前日期和时间
    YEAR(date)获取指定date的年份
    MONTH(date)获取指定date的月份
    DAY(date)获取指定date的日期
    date_add(date,INTERVAL expr type)返回一个日期/时间值加上一个时间间隔expr后的时间值
    DATEDIFF(date1,date2)返回起始时间date1和结束时间date2之间的天数

    3.1 curdate()

    -- 返回当前日期
    mysql> select curdate();
    +------------+
    | curdate()  |
    +------------+
    | 2025-09-30 |
    +------------+
    1 row in set (0.00 sec)
    

    3.2 curtime()

    -- 返回当前时间
    mysql> select curtime();
    +-----------+
    | curtime() |
    +-----------+
    | 21:44:33  |
    +-----------+
    1 row in set (0.00 sec)
    

    3.3 new()

    -- 返回当前日期和时间
    mysql> select now();
    +---------------------+
    | now()               |
    +---------------------+
    | 2025-09-30 21:45:47 |
    +---------------------+
    1 row in set (0.00 sec)
    

    3.4 YEAR(date)

    -- 获取指定date的年份
    mysql> select YEAR (now());
    +--------------+
    | YEAR (now()) |
    +--------------+
    |         2025 |
    +--------------+
    1 row in set (0.00 sec)
    

    3.5 MONTH(date)

    -- 获取指定date的月份
    mysql> select MONTH(now());
    +--------------+
    | MONTH(now()) |
    +--------------+
    |            9 |
    +--------------+
    1 row in set (0.00 sec)
    

    3.6 DAY(date)

    -- 获取指定date的日期
    mysql> select DAY(now());
    +------------+
    | DAY(now()) |
    +------------+
    |         30 |
    +------------+
    1 row in set (0.00 sec)
    

    3.7 date_add(date,INTERVAL expr type)

    -- 返回一个日期/时间值加上一个时间间隔expr后的时间值
    mysql> select date_add(now(), INTERVAL 70 YEAR );
    +------------------------------------+
    | date_add(now(), INTERVAL 70 YEAR ) |
    +------------------------------------+
    | 2095-09-30 21:50:39                |
    +------------------------------------+
    1 row in set (0.00 sec)
    

    3.8 DATEDIFF(date1,date2)

    -- 返回起始时间date1和结束时间date2之间的天数
    mysql> select datediff('2025-09-30', '2022-09-30');
    +--------------------------------------+
    | datediff('2025-09-30', '2022-09-30') |
    +--------------------------------------+
    |                                 1096 |
    +--------------------------------------+
    1 row in set (0.00 sec)
    

    3.9 示例

    -- 案例:查询所有员工的入职天数,并根据入职天数倒字排序
    mysql> select * from emp;
    +----+--------+------+--------+------+----------+-------------+---------------------+
    | id | workno | name | gender | age  | idcard   | workaddress | entrydate           |
    +----+--------+------+--------+------+----------+-------------+---------------------+
    |  1 | 00001  | 张三 ||   22 | 12345678 | 北京        | 2000-01-01 00:00:00 |
    |  2 | 00002  | 李四 ||   29 | 12345679 | 上海        | 2003-01-01 00:00:00 |
    |  2 | 00003  | 王五 ||   21 | 12345676 | 深圳        | 2002-01-01 00:00:00 |
    +----+--------+------+--------+------+----------+-------------+---------------------+
    3 rows in set (0.00 sec)mysql> select name,datediff(curdate(),entrydate) as 'entrydate' from emp order by entrydate desc;
    +------+-----------+
    | name | entrydate |
    +------+-----------+
    | 张三 |      9404 |
    | 王五 |      8673 |
    | 李四 |      8308 |
    +------+-----------+
    3 rows in set (0.00 sec)
    

四、流程函数

  • 流程函数也是很常用的一类函数,可以在SQL语句中实现条件筛选,从而提高语句的效率

    函数功能
    IF(value,t,f)如果value为true,则返回t,否则返回f
    IFNULL(value1,value2)如果value1不为空,返回value1,否则返回value2
    CASE WHEN [val1] THEN [res1]…ELSE [default] END如果val1为true,返回res1,…否则返回default默认值
    CASE [expr] WHEN [val1] THEN [res1] … ELSE [default] END如果expr的值等于vall,返回res1,…否则返回defaul默认值

    4.1 if(value,t,f)

    -- 如果value为true,则返回t,否则返回f
    mysql> select if(false,  'ok',  'Error');
    +----------------------------+
    | if(false,  'ok',  'Error') |
    +----------------------------+
    | Error                      |
    +----------------------------+
    1 row in set (0.00 sec)
    

    4.2 ifnull(value1,value2)

    -- 如果value1不为空,返回value1,否则返回value2
    -- 非空
    mysql> select ifnull('yes','default');
    +-------------------------+
    | ifnull('yes','default') |
    +-------------------------+
    | yes                     |
    +-------------------------+
    1 row in set (0.00 sec)# 空
    mysql> select ifnull(null,'default');
    +------------------------+
    | ifnull(null,'default') |
    +------------------------+
    | default                |
    +------------------------+
    1 row in set (0.00 sec)
    

    4.3 case when then else end

    -- 如果val1为true,返回res1,...否则返回default默认值
    -- 需求:查询emp表的员工姓名和工作地址:(北京/上海---->一线城市,其他---->二线城市)
    mysql> select name,(case workaddress when'北京' then '一线城市' when '上海' then '一线城市' when '深圳' then '一线城市' else '二线城市' end) as '工作地址' from emp;
    +------+----------+
    | name | 工作地址 |
    +------+----------+
    | 张三 | 一线城市 |
    | 李四 | 一线城市 |
    | 王五 | 一线城市 |
    +------+----------+
    3 rows in set (0.00 sec)

    4.4 示例

    -- 案例:统计班级各个学员的成绩,尼示的规则如下:
    -- >=85,展示优秀
    -- >= 60,展示及格
    -- 否则,展示不及格-- 数据准备
    create table score(
    id int comment 'ID',
    name varchar(20) comment '姓名',
    math int comment '数学',
    english int comment '英语',
    chinese int comment '语文'
    )comment '学员成绩表';insert into score(id, name, math, english, chinese) values(1,'Tom', 67, 88, 95), (2, 'Rose', 23, 66, 90), (3, 'Jack', 56, 98, 76);-- 案例sql命令 
    select id, name, (case when math >= 85 then '优秀' when math >=60 then '及格' else '不及格' end ),(case when english >= 85 then '优秀' when english >=60 then '及格' else '不及格' end ),(case when chinese >= 85 then '优秀' when chinese >=60 then '及格' else '不及格' end ) from score;-- 运行结果
    mysql> select id, name, (case when math >= 85 then '优秀' when math >=60 then '及格' else '不及格' end ),(case when english >= 85 then '优秀' when english >=60 then '及格' else '不及格' end ),(case when chinese >= 85 then '优秀' when chinese >=60 then '及格' else '不及格' end ) from score;
    +------+------+----------------------------------------------------------------------------------+----------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------+
    | id   | name | (case when math >= 85 then '优秀' when math >=60 then '及格' else '不及格' end ) | (case when english >= 85 then '优秀' when english >=60 then '及格' else '不及格' end ) | (case when chinese >= 85 then '优秀' when chinese >=60 then '及格' else '不及格' end ) |
    +------+------+----------------------------------------------------------------------------------+----------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------+
    |    1 | Tom  | 及格                                                                             | 优秀                                                                                   | 优秀                                                                                   |
    |    2 | Rose | 不及格                                                                           | 及格                                                                                   | 优秀                                                                                   |
    |    3 | Jack | 不及格                                                                           | 优秀                                                                                   | 及格                                                                                   |
    +------+------+----------------------------------------------------------------------------------+----------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------+
    3 rows in set (0.00 sec)
    
http://www.dtcms.com/a/426666.html

相关文章:

  • 避坑实战!京东商品详情接口开发指南:分页优化、多规格解析与数据完整性保障
  • win10(十二)Nuitka打包程序
  • 【Rust GUI开发入门】编写一个本地音乐播放器(11. 支持动态明暗主题切换)
  • 自己做网站帮公司出认证证书违法吗上海定制网站建设公司
  • [论文阅读] AI + 软件工程(Debug)| 告别 “猜 bug”:TreeMind 用 LLM+MCTS 破解 Android 不完整报告复现难题
  • ESP32 + MCP over MQTT:通过大模型控制智能硬件设备
  • 五大关系数据库(sqlserver、mysql、oracle、pgsql、sqlite)的对象名称和转义字符
  • 央企云原生PaaS建设方案及案例集锦
  • 使用Django从零开始构建一个个人博客系统
  • 工业互联网的云原生转型路径
  • 做网站需要哪些素材建筑工程 技术支持 东莞网站建设
  • Spring Boot 缓存技术
  • AI应用生成平台:数据库、缓存与存储
  • J2Cache 多级缓存配置与使用
  • 【JAVA】【BUG】经常出现的典型 bug 及解决办法
  • 做网站怎么存放视频哪个公司的室内设计公司
  • GitHub 热榜项目 - 日榜(2025-09-30)
  • Microsoft Fabric - 尝试一下Workspace中的Deployment pipeline
  • 区块链论文速读 CCF A--WWW 2025(6)
  • Bug——PaddleX人脸识别报错:Process finished with exit code -1073741819 (0xC0000005)
  • SSM基于的宠物领养管理系统ugssn(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。
  • 四种对象型创建模式:抽象工厂、 build模式、原型ProtoType与单例模式
  • 即墨网站建设公司旅游网站建设电子商务的困惑
  • 央视优购物官方网站网页制作与网站管理
  • 本地多版本 Node.js 切换指南:解决 Vue nodejs 等项目版本冲突问题
  • 阿里云 AI 中间件重磅发布,打通 AI 应用落地“最后一公里”
  • 全面解析Umi-OCR手写体识别能力:开源OCR的新标杆
  • Spring Boot整合Kafka:解决消息挤压、丢失与重复消费
  • 【系统架构师-案例分析】2025年5月份案例分析第一题-架构评估
  • OpenHarmony之Histreamer引擎深度解析:pipeline_core架构如何全面取代GStreamer,一统音视频播放与录制