MySQL(四)——常用函数

文章目录

函数

函数,是指一段可以直接被另一段程序调用的程序或代码。

MySQL中内置了许多函数,我们只需在合适的场景下调用它们即可,调用函数查询结果直接使用SELECT即可,并且可以嵌套使用:

sql 复制代码
SELECT functions(parameters);
  • functions:函数
  • parameters:参数

为了避免多张截图堆叠的问题,我们在直接演示环节使用代码块并使用注释来展示函数结果。


字符串函数

常用字符串函数:

函数 功能
CONCAT(S1, S2, ...Sn) 字符串拼接,将S1,S2,... Sn拼接成一个字符串
LOWER(str) 将字符串 str 全部转为小写
UPPER(str) 将字符串 str 全部转为大写
LPAD(str, len, pad) 左填充,用字符串 pad 对 str 的左边进行填充,达到 len 个字符串长度
RPAD(str, len, pad) 右填充,用字符串 pad 对 str 的右边进行填充,达到 len 个字符串长度
TRIM(str) 去掉字符串头部和尾部的空格
SUBSTRING(str, start, len) 返回字符串 str 从 start 位置起的 len 个长度的字符串,第一个字符的位置是1
  • 对于字符串函数,MySQL能够自动处理非字符串类型的参数,并将它们转换为字符串后再进行指定操作

直接演示

sql 复制代码
SELECT CONCAT('Hello', ' MySQL!');
SELECT CONCAT(123, 12.5);
/* 
结果1:Hello MySQL!
结果2:12312.5
*/

SELECT LOWER('Hello MySQL!');
SELECT LOWER(123);
/*
结果1:hello mysql!
结果2:123
*/

SELECT UPPER('Hello MySQL!');
SELECT UPPER(12.3);
/*
结果1:HELLO MYSQL!
结果2:12.3
*/

SELECT LPAD(1, 5, 0);
SELECT LPAD('ok', 3, 'o');
/*
结果1:00001
结果2:ook
*/

SELECT RPAD(1, 5, 0);
SELECT RPAD('ok', 3, 'o');
/*
结果1:10000
结果2:oko
*/

SELECT TRIM('  i am fine.  ');
/*
结果:i am fine.
*/

SELECT SUBSTRING('Hello MySQL!', 1, 5);
SELECT SUBSTRING(123456, 2, 4);
/*
结果1:Hello
结果2:2345
*/

场景演示

对于下表,修改id数据列的格式:3位数,不够的左边填充0:


数值函数

常用数值函数:

函数 功能
CEIL(x) 向上取整
FLOOR(x) 向下取整
MOD(x, y) 返回 x/y 的模
RAND() 返回 0~1 内的随机数
ROUND(x, y) 求参数 x 的四舍五入的值,保留 y 位小数

直接演示

sql 复制代码
SELECT CEIL(1.1);
# 结果:2

SELECT FLOOR(1.9);
# 结果:1

SELECT MOD(5, 11);
# 结果:5

SELECT RAND();
# 结果:0~1的随机数,例如,某次执行的结果为0.9047801484398359

SELECT ROUND(12.55, 1);
# 结果:12.6

场景演示

查询所有人的成绩,要求查询结果中成绩没有小数位,四舍五入:


日期函数

常用日期函数:

函数 功能
CURDATE() 返回当前日期 YYYY-MM-DD
CURTIME() 返回当前时间 HH:MM:SS
NOW() 返回当前日期和时间 YYYY-MM-DD HH:MM:SS
YEAR(date) 获取指定 date 的年份
MONTH(date) 获取指定 date 的月份
DAY(date) 获取指定 date 的日期
DATE_ADD(date, INTERVAL expr type) 返回一个日期/时间值加上一个时间间隔 expr 后的时间值
DATEDIFF(date1, date2) 返回起始时间 date1 和结束时间 date2 之间间隔的天数
  • DATE_ADD(date, INTERVAL expr type) 的参数含义如下:
    1. date这是你想要添加时间间隔的原始日期。 它可以是一个日期或日期时间表达式,比如一个 DATEDATETIMETIMESTAMP 类型的列,或者是一个日期字符串(在能够被MySQL解析为有效日期的情况下)。
    2. INTERVAL:这是一个关键字,用于指示接下来的参数是一个时间间隔。 它告诉MySQL你想要对前面的日期进行加法操作,并且接下来的参数将定义这个加法操作的具体内容。
    3. expr这是你想要添加到原始日期上的时间间隔的数量。 它应该是一个整数或整数表达式。例如,如果你想要添加3天,那么 expr 就是 3
    4. type这是时间间隔的单位。 它告诉MySQL你想要以什么单位来添加时间间隔。type 可以是多种不同的值,比如 DAYMONTHYEARHOURMINUTESECOND 等。这个参数决定了 expr 的具体含义。例如,如果 typeDAY,那么 expr 就是天数;如果 typeMONTH,那么 expr 就是月数。

直接演示

sql 复制代码
SELECT CURDATE();           -- 输出当前日期,本次运行时日期为2024-08-18

SELECT CURTIME();           -- 输出当前时间,本次运行时时间为20:49:44

SELECT NOW();               -- 输出当前日期和时间,本次运行时为2024-08-18 20:50:17

SELECT YEAR('2023-04-01');  -- 输出: 2023  
SELECT YEAR('20230401');    -- 输出: 2023(注意:这取决于MySQL的SQL模式,有时需要确保字符串能被正确解析为日期)  
SELECT YEAR(CURDATE());     -- 输出当前日期的年份  本次运行为2024
SELECT YEAR(NOW());         -- 输出当前日期和时间的年份(仅提取年份部分),本次运行为2024

SELECT MONTH('2023-04-01');  -- 输出: 4  
SELECT MONTH('20230401');    -- 输出: 4(注意:这取决于MySQL的SQL模式,有时需要确保字符串能被正确解析为日期)  
SELECT MONTH(CURDATE());     -- 输出当前日期的月份  本次运行为8
SELECT MONTH(NOW());         -- 输出当前日期和时间的月份(仅提取年份部分),本次运行为8

SELECT DAY('2023-04-01');  -- 输出: 1 
SELECT DAY('20230401');    -- 输出: 1(注意:这取决于MySQL的SQL模式,有时需要确保字符串能被正确解析为日期)  
SELECT DAY(CURDATE());     -- 输出当前日期的'日期'  本次运行为18
SELECT DAY(NOW());         -- 输出当前日期和时间的'日期'(仅提取年份部分),本次运行为18

SELECT DATE_ADD('2021-11-10', INTERVAL 5 DAY);     -- 结果为:2021-11-15
SELECT DATE_ADD('2021-11-10', INTERVAL 5 MONTH);   -- 结果为:2022-04-10
SELECT DATE_ADD(NOW(), INTERVAL 5 YEAR);           -- 此次结果为:2029-08-18 21:03:18

SELECT DATEDIFF('2011-03-30', '2010-01-12');       -- 结果为:442
SELECT DATEDIFF('2011-03-30', '2012-01-12');       -- 结果为:-288(所以实际上是左参数'减去'右参数,早 - 晚 = 负数)

场景演示

比如有张学生信息表,其中有个入学时间的字段,我们想查询学生的入学了多长时间,并按照时间降序排序,就会写出类似如下语句:

sql 复制代码
SELECT name, DATEDIFF(NOW(), en_time) 时间 FROM student ORDER BY 时间 DESC;

流程函数

常用流程函数:

函数 功能
IF(value, t, f) 如果 value 为 true,返回 t,否则返回 f
IFNULL(value1, value2) 如果 value 不为空,返回 value1,否则返回 value2
CASE WHEN [val1] THEN [ret1]... ELSE [default] END 如果 val1 为 true,返回 ret1,... 否则返回 default
CASE [expr] WHEN [val1] THEN [ret1]... ELSE [default] END 如果 expr 的值等于 val1,返回 ret1,... 否则返回 default
  • 在SQL的CASE语句中,条件是从上到下依次评估的,一旦找到满足条件的分支,就会执行该分支的语句并结束CASE表达式的评估。

直接演示

sql 复制代码
SELECT IF(20 > 11, 'OK', 'NO');   -- 结果为:OK
SELECT IF(20 < 11, 20, 11);       -- 结果为:11

SELECT IFNULL(NULL, 12);          -- 结果为:12
SELECT IFNULL(10, 12);            -- 结果为:10

SELECT CASE WHEN 66 > 90 THEN 'one' WHEN 66 > 80 THEN 'two' ELSE 'default' END;   -- 结果为:default
SELECT CASE WHEN 66 > 60 THEN 'one' WHEN 66 > 50 THEN 'two' ELSE 'default' END;   -- 结果为:one

SELECT CASE 43 WHEN 20 THEN 1 WHEN 43 THEN 2 ELSE 3 END;             -- 结果为:2
SELECT CASE 'mysql' WHEN 'nosql' THEN 1 WHEN 43 THEN 2 ELSE 3 END;   -- 结果为:3 

场景演示

查询学生成绩,要求:1. >= 90 显示优秀 2. >= 60 显示及格 3. 否则,显示不及格,如下:


相关推荐
武昌库里写JAVA几秒前
Java成长之路(一)--SpringBoot基础学习--SpringBoot代码测试
java·开发语言·spring boot·学习·课程设计
sdaxue.com14 分钟前
帝国CMS:如何去掉帝国CMS登录界面的认证码登录
数据库·github·网站·帝国cms·认证码
ZSYP-S36 分钟前
Day 15:Spring 框架基础
java·开发语言·数据结构·后端·spring
yuanbenshidiaos39 分钟前
c++------------------函数
开发语言·c++
程序员_三木1 小时前
Three.js入门-Raycaster鼠标拾取详解与应用
开发语言·javascript·计算机外设·webgl·three.js
o(╥﹏╥)1 小时前
linux(ubuntu )卡死怎么强制重启
linux·数据库·ubuntu·系统安全
是小崔啊1 小时前
开源轮子 - EasyExcel01(核心api)
java·开发语言·开源·excel·阿里巴巴
tianmu_sama1 小时前
[Effective C++]条款38-39 复合和private继承
开发语言·c++
黄公子学安全1 小时前
Java的基础概念(一)
java·开发语言·python
liwulin05061 小时前
【JAVA】Tesseract-OCR截图屏幕指定区域识别0.4.2
java·开发语言·ocr