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

文章目录

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

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

1.2 lower(str)

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

1.3 upper(str)

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

1.4 lpad(str,n,pad)

sql 复制代码
-- 左填充,用字符串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)

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

1.6 trim(str)

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

1.7 substring(str,start,len)

sql 复制代码
-- 返回从字符串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 示例

sql 复制代码
-- 由于业务需求变更,企业员工的工号,统一为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: 0

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)

二、数值函数

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

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

2.1 ceil(x)

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

2.2 floor(x)

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

2.3 mod(x,y)

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

2.4 rand()

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

2.5 round(x,y)

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

2.6 示例

sql 复制代码
-- 通过数据库的两函数,生成一个六位数的随机验证码
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()

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

    3.2 curtime()

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

    3.3 new()

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

    3.4 YEAR(date)

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

    3.5 MONTH(date)

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

    3.6 DAY(date)

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

    3.7 date_add(date,INTERVAL expr type)

    sql 复制代码
    -- 返回一个日期/时间值加上一个时间间隔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)

    sql 复制代码
    -- 返回起始时间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 示例

    sql 复制代码
    -- 案例:查询所有员工的入职天数,并根据入职天数倒字排序
    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)

    sql 复制代码
    -- 如果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)

    sql 复制代码
    -- 如果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

    sql 复制代码
    -- 如果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 示例

    sql 复制代码
    -- 案例:统计班级各个学员的成绩,尼示的规则如下:
    -- >=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)
相关推荐
牛奶2 小时前
2026年大模型怎么选?前端人实用对比
前端·人工智能·ai编程
牛奶2 小时前
前端人为什么要学AI?
前端·人工智能·ai编程
KEEN的创享空间9 小时前
AI编程从0到1之10X提效(Vibe Coding 氛围式编码 )09篇
openai·ai编程
AlienZHOU9 小时前
为 AI Agent 编写高质量 Skill:Claude 官方指南
agent·ai编程·claude
倔强的石头_9 小时前
kingbase备份与恢复实战(二)—— sys_dump库级逻辑备份与恢复(Windows详细步骤)
数据库
恋猫de小郭10 小时前
移动端开发稳了?AI 目前还无法取代客户端开发,小红书的论文告诉你数据
前端·flutter·ai编程
KaneLogger11 小时前
【翻译】打造 Agent Skills 的最佳实践
agent·ai编程·claude
王小酱11 小时前
Everything Claude Code 文档
openai·ai编程·aiops
雮尘12 小时前
如何在非 Claude IDE (TARE、 Cursor、Antigravity 等)下使用 Agent Skills
前端·agent·ai编程
刘贺同学12 小时前
Day12-龙虾哥打工日记:OpenClaw 子 Agent 到底看到了什么?
aigc·ai编程