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)
相关推荐
TDengine (老段)3 小时前
TDengine 时序函数 MAVG 用户手册
大数据·数据库·物联网·性能优化·时序数据库·iot·tdengine
hqwest3 小时前
QT肝8天16--加载动态菜单
开发语言·数据库·qt·ui·sqlite
序属秋秋秋3 小时前
《C++进阶之C++11》【智能指针】(下)
c++·笔记·学习·面试·c++11·智能指针·新特性
你好龙卷风!!!3 小时前
mac | Windows 本地部署 Seata1.7.0,Nacos 作为配置中心、注册中心,MySQL 存储信息
windows·mysql·macos
Mingze03143 小时前
考研408之栈与队列学习
开发语言·c++·学习·考研·算法
从前慢,现在也慢4 小时前
【STL学习】(9)priority_queue
c++·学习
序属秋秋秋4 小时前
《C++进阶之C++11》【智能指针】(上)
c++·笔记·学习·面试·c++11·智能指针·新特性
Yupureki4 小时前
从零开始的C++学习生活 3:类和对象(中)
c语言·c++·学习·visual studio
数据知道4 小时前
Go基础:用Go语言操作MySQL详解
开发语言·数据库·后端·mysql·golang·go语言