MySQL内置函数:字符串函数,数值函数,日期函数,流程控制函数
目录
字符串函数
CONCAT(str_1,str_2,...str_n)-拼接-例子
LOWER(str)-全转换为小写-例子
UPPER(str)-全转换为大写-例子
LPAD(str, len, str_2)-左填充-例子
RPAD(str, len, str_2)-右填充-例子
TRIM(str)-去除前后空格-例子
SUBSTRING(str, start, len)-字符串切片-例子
案例
数值函数
CEIL(x)-向上取整-例子
FlOOR(x)-向下取整-例子
MOD(x, y)-取模-例子
RAND()-生成随机数(0~1)-例子
ROUND(x, y)-四舍五入保留y位小数-例子
案例
日期函数
CURDATE()-返回当前日期-例子
CURTIME()-返回当前时间-例子
NOW()-返回当前日期和时间-例子
YEAR(date)-返回指定date的年份-例子
MONTH(date)-返回指定date的月份-例子
DAY(date)-返回指定date的day-例子
DATE_ADD(date, INTERVAL expr type)-指定日期加上时间间隔-例子
DATEDIFF(date1, date2)-间隔天数-例子
案例
流程控制函数
IF(value, t, f)-例子
IFNULL(value1, value2)-例子
CASE WHEN [val1] THEN [res1]...ELSE [default] END-例子
CASE [expr] WHEN [val1] THEN [res1]...ELSE [default] END-例子
案例
函数:指一段可以直接被另一段程序调用的程序或代码。
字符串函数
MySQL内置了很多字符串函数,常用的如下:
函数 | 功能 |
CONCAT(str_1,str_2,...str_n) | 字符串拼接,将str_1,str_2,...str_n拼接成一个字符串 |
LOWER(str) | 将字符串str全部转换为小写 |
UPPER(str) | 将字符串str全部转换为大写 |
LPAD(str, len, str_2) | 左填充,用字符串str_2在str的左边填充至长度为len 若str的长度大于len,则截断str至长度len返回 |
RPAD(str, len, str_2) | 右填充,用字符串str_2在str的右边填充至长度为len 若str的长度大于len,则截断str至长度len返回 |
TRIM(str) | 去除字符串头部和尾部的空格 |
SUBSTRING(str, start, len) | 返回字符串str从start位置(start从1开始)起到长度为len的字符串切片 |
示例如下:
CONCAT(str_1,str_2,...str_n)-拼接-例子
将字符串“Hello”和字符串“World”拼接起来
代码:
SELECT CONCAT('Hello', 'World') AS '拼接结果';
运行结果
LOWER(str)-全转换为小写-例子
将字符串“Hello”全部转换为小写
代码:
SELECT LOWER('Hello') AS '转换结果';
运行结果
UPPER(str)-全转换为大写-例子
将字符串“Hello”全部转换为大写
代码:
SELECT UPPER('Hello') AS '转换结果';
运行结果
LPAD(str, len, str_2)-左填充-例子
左填充
- 用字符“-”在“Hello”的左边填充至长度为7;
- 若“Hello”的长度大于3,则截断“Hello”至长度3返回
代码:
-- 1.用字符“-”在“Hello”的左边填充至长度为7
-- 2.若“Hello”的长度大于3,则截断“Hello”至长度3返回
SELECT LPAD('Hello', 7, '-') '结果1', LPAD('Hello', 3, '-') '结果2';
运行结果
RPAD(str, len, str_2)-右填充-例子
右填充
- 用字符串“-”在“Hello”的右边填充至长度为8
- 若“Hello”的长度大于2,则截断“Hello”至长度2返回
代码:
# 1.用字符串“-”在“Hello”的右边填充至长度为8
# 2.若“Hello”的长度大于2,则截断“Hello”至长度2返回
SELECT RPAD('Hello', 8, '-') AS '结果1', RPAD('Hello', 2, '-') AS '结果2';
运行结果
TRIM(str)-去除前后空格-例子
去除字符串“ Hello World! ”的前后空格
代码:
-- 去除字符串“ Hello World! ”的前后空格
SELECT TRIM(' Hello World! ') '去除空格后';
运行结果
SUBSTRING(str, start, len)-字符串切片-例子
返回字符串“Hello World”从2位置起到长度为4的字符串
代码:
# 返回字符串“Hello World”从2位置起到长度为8的字符串
SELECT SUBSTRING('Hello World', 2, 8) '字符串切片为';
运行结果
案例
使用test数据库中的emp表,表中数据如下:
现在的需求是:统一员工的工号(work_no)为5位数,如果不满5位数就在前面补0
代码:
# 左填充,不足5位,在工号前补0
UPDATE emp SET work_no = LPAD(work_no, 5, '0');
运行结果
数值函数
常见的数值函数
函数 | 功能 |
CEIL(x) | 向上取整 |
FlOOR(x) | 向下取整 |
MOD(x, y) | 返回x/y的模,即求模运算 |
RAND() | 返回0~1内的随机数 |
ROUND(x, y) | 求参数x四舍五入的值,保留y位小数 |
示例如下:
CEIL(x)-向上取整-例子
数值1.23向上取整
代码:
# 数值1.23向上取整
SELECT CEIL(1.23) AS '结果';
运行结果
FlOOR(x)-向下取整-例子
数值1.983向下取整
代码:
-- 数值1.983向下取整
SELECT FLOOR(1.983) '结果';
运行结果
MOD(x, y)-取模-例子
返回9/2的模
代码:
-- 返回9/2的模
SELECT MOD(9, 2) AS '结果';
运算结果
RAND()-生成随机数(0~1)-例子
随机生成一个0~1之间的数值
代码:
SELECT RAND() AS '结果';
运算结果
ROUND(x, y)-四舍五入保留y位小数-例子
求数值8.50646四舍五入的值,保留4位小数
代码:
SELECT ROUND(8.50646, 4) AS '结果';
运行结果
案例
需求:生成一个六位数的随机验证码
代码:
# 生成一个六位数的随机验证码
SELECT RPAD(ROUND(RAND() * 1000000, 0), 6, '0') AS '随机验证码';
运行结果
日期函数
常见日期函数如下:
函数 | 功能 |
CURDATE() | 返回当前日期(CURDATE实际上是current date) |
CURTIME() | 返回当前时间 |
NOW() | 返回当前日期和时间 |
YEAR(date) | 返回指定date的年份 |
MONTH(date) | 返回指定date的月份 |
DAY(date) | 返回指定date的day |
DATE_ADD(date, INTERVAL expr type) | 返回一个日期/时间值加上一个时间间隔expr后的时间值
|
DATEDIFF(date1, date2) | 返回起始时间date1和结束时间date2之间的天数。间隔天数=date1-date2 |
示例如下:
CURDATE()-返回当前日期-例子
返回当前日期
代码:
SELECT CURDATE() '当前日期';
运行结果
CURTIME()-返回当前时间-例子
返回当前时间
代码:
SELECT CURTIME() '当前时间';
运行结果
NOW()-返回当前日期和时间-例子
返回当前日期和时间
代码:
SELECT NOW() '当前日期和时间';
运行结果
YEAR(date)-返回指定date的年份-例子
返回“2022-03-22”的年份
代码:
SELECT YEAR('2022-03-22') '年份';
运行结果
MONTH(date)-返回指定date的月份-例子
返回“2022-03-22”的月份
代码:
SELECT MONTH('2022-03-22') '月份';
运行结果
DAY(date)-返回指定date的day-例子
返回“2022-03-22”的day
代码:
SELECT DAY('2022-03-22') 'day';
运行结果
DATE_ADD(date, INTERVAL expr type)-指定日期加上时间间隔-例子
返回“2022-03-22”加上70天的日期
SELECT DATE_ADD('2022-03-22', INTERVAL 70 DAY) AS '结果';
DATEDIFF(date1, date2)-间隔天数-例子
返回“2024-03-14”和“2022-03-22”的间隔天数
代码:
-- 返回“2024-03-14”和“2022-03-22”的间隔天数
SELECT DATEDIFF('2024-03-14', '2022-03-22') AS '间隔天数';
运行结果
案例
使用test数据库中的emp表,表中数据如下:
现在的需求是:查询所有员工的入职天数(入职日期为entry_date),并根据入职天数倒序排序。
代码:
# 查询所有员工的入职天数,并根据入职天数倒序排序
SELECT DATEDIFF(NOW(), entry_date) AS entry_days, emp_name FROM emp ORDER BY entry_days DESC;
注意:entry_days是入职天数
运行结果
流程控制函数
流程控制函数:可以在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表达式的值等于val1,返回res1,...否则返回default默认值 |
示例如下:
IF(value, t, f)-例子
调用IF流程控制函数,设第一个参数为TRUE或FALSE,第二个参数为“ok”,第三个参数为“error”
代码:
SELECT IF(TRUE, 'ok', 'error') '结果1', IF(FALSE, 'ok', 'error') '结果2';
运行结果
IFNULL(value1, value2)-例子
调用IFNULL流程控制函数,设第一个参数为“你好”或NULL,第二个参数为“世界”
SELECT IFNULL('你好', '世界') AS '结果1', IFNULL(NULL, '世界') AS '结果2';
运行结果
CASE WHEN [val1] THEN [res1]...ELSE [default] END-例子
使用test数据库中的emp表,emp表数据如下:
需求:查询emp表的员工姓名和工作地址是几线城市(上海或杭州是一线,其他的是二线城市)
代码:
-- 方式1:查询emp表的员工姓名和工作地址是几线城市(上海或杭州是一线,其他的是二线城市)
SELECT emp_name,
CASE WHEN work_address IN('上海', '杭州') THEN CONCAT('一线城市_', work_address)
ELSE CONCAT('二线城市_', work_address) END AS '工作地址' FROM emp;
-- 方式2:查询emp表的员工姓名和工作地址是几线城市(上海或杭州是一线,其他的是二线城市)
-- 使用IF流程控制函数
SELECT emp_name,
IF(work_address IN('上海', '杭州'), CONCAT('一线城市_', work_address), CONCAT('二线城市_', work_address)) '工作地址'
FROM emp;
运行结果
CASE [expr] WHEN [val1] THEN [res1]...ELSE [default] END-例子
使用test数据库中的emp表,emp表数据如下:
需求:查询emp表的员工姓名和工作地址是几线城市(上海或杭州是一线,其他的是二线城市)
代码:
-- :查询emp表的员工姓名和工作地址是几线城市(上海或杭州是一线,其他的是二线城市)
SELECT emp_name,
CASE work_address WHEN '上海' THEN CONCAT('一线城市_', work_address) WHEN '杭州' THEN CONCAT('一线城市_', work_address)
ELSE CONCAT('二线城市_', work_address) END AS '工作地址' FROM emp;
运行结果
案例
使用test数据库的orders订单表,数据如下:
需求:
统计每一笔订单的销售额,展示规则如下:
>= 2000,展示“level3”
>=1000,展示“level2”
否则,展示“level1”
代码:
SELECT order_id AS '订单id',
CASE WHEN sales >= 2000 THEN 'level3'
WHEN sales >= 1000 THEN 'level2'
ELSE 'level1' END '销售等级'
FROM orders;
运行结果