一,常用的函数
1,日期时间函数
【1】,date_add()/date_sub()-日期加减
-- 格式,n 表示变化的时间,负数则表示相反的变化
date_add(date,interval n [day,month,year])
date_sub(date,interval n [day,month,year])-- 案例
select date_add('2025-12-27',interval 3 day); -- 2025-12-30
select date_sub('2025-12-27',interval -1 month); --2026-01-27
【2】,date_formate()-日期格式化
-- 格式,%Y-%m-%d %H:%i:%s 表示 2025-12-27 16:52:46
date_formate(date,'%Y-%m-%d %H:%i:%s')-- 案例
select date_formate(noww(),'%Y-%m'); -- 2025-12
select date_formate(now(),'%Y年%m月%d日') -- 2025年12月27日
select date_formate(now(),'%H:%i:%s') -- 10:44:34
【3】,now()/curdate()/curtime()-当前的时间
-- 例子
select now(); -- 2025-12-27 10:46:25
select curdate(); -- 2025-12-27
select curtime(); -- 10:46:25
【4】,date()/time()/YEAR()/MONTH()/DAY()-日期提取/时间提取/年提取/月提取/日提取
-- 格式
DATE(date);
TIME(date);
YEAR(DATE);
MONTH(date);
DAY(date);-- 案例
select DATE(now()); -- 2025-12-27
SELECT TIME(now()); -- 10:46:25
SELECT YEAR(now()); -- 2025
SELECT MONTH(now()); -- 12
SELECT DAY(now()); -- 27
2,字符串函数
【1】,concat()-字符串连接函数
-- 格式
CONCAT(str1,str2,...)-- 案例
select CAONCAT('welcome to','my blogs!'); -- welcome to my blogs!
【2】,substr()/substring()-字符串截取
-- 格式;str-截取的字符串,pos-表示起始的位置,len-截取的字符串数量
SUBSTR(str,pos,len);
SUBSTRING(str,pos,len);
SUBSTRING_INDEX(str, delim, count);-- 案例
select substr('welcome to my blogs!',1,7); -- welcome
-- 当count为负数的时候,从右往左截取;为正数的时候,从左往右截取,并且不属于贪婪模式。
SELECT SUBSTRING_INDEX('/www/user/uploads/photo.jpg', '/', -1); -- 'photo.jpg'
【3】,length()/char_length()-字符串长度
-- 例子
-- 返回字节数
select length('你好'); -- 6(utf8格式,默认一个中文3个字节)
-- 返回字符数
select char_length('你好'); -- 2
【4】,upper()/lower()-大小转换
-- 案例
SELECT UPPER('hello'); -- 'HELLO'
SELECT LOWER('WORLD'); -- 'world'-- 当在查询字符串的时候希望区分大小写,可以在查询之前加上 binary,因为binary 会触发二元比较,但不会修改储存值。
-- 这个查询结果会严格按照大小写查询出来,不会存在col='wm',或者col='wM'的情况
select * from tmp_table where binary col='Wm';
【5】,TRIM()/LTRIM()/RTRIM()-去除空格
-- 案例
select trim(' welcome '); -- 'welcome'
select ltrim(' welcome'); -- 'welcome'
select rtrim('welcome '); -- 'welcome'
【6】,replace()-替换字符串
-- 案例
SELECT REPLACE('Hello my blogs', 'my blogs', 'MySQL'); -- 'Hello MySQL'
【7】,instr()/LOCATE()-查找字符串位置
-- 格式
INSTR(主字符串, 子串)
-- 起始位置可选
LOCATE(子串, 主字符串 [,起始位置])-- 案例
SELECT INSTR('Hello World', 'World'); -- 返回:7
SELECT INSTR('hello world', 'abc'); -- 返回:0(未找到)SELECT LOCATE('World', 'Hello World'); -- 返回:7-- 可以指定起始位置(这是LOCATE独有的优势)
SELECT LOCATE('o', 'Hello World', 5); -- 返回:8(从第5个字符开始找)
SELECT LOCATE('o', 'Hello World', 9); -- 返回:0(从第9个字符开始没找到)
【8】,LPAD() / RPAD() - 填充字符串
-- 案例
SELECT LPAD('123', 5, '0'); -- '00123'
SELECT RPAD('123', 5, '*'); -- '123**'
3,数值函数
【1】,ROUND() - 四舍五入
-- 案例
SELECT ROUND(123.4567, 2); -- 123.46
SELECT ROUND(123.4567, 0); -- 123
SELECT ROUND(123.4567, -2); -- 100
【2】,CEIL() / CEILING() - 向上取整
-- 案例
SELECT CEIL(123.45); -- 124
SELECT CEILING(123.01); -- 124
【3】,ABS()-绝对值
-- 案例
select ABS('-124'); -- 124
【4】,MOD() / % - 取模运算
-- 案例
SELECT MOD(10, 3); -- 1
SELECT 10 % 3; -- 1
4,条件函数
【1】,IF() - 简单条件判断
-- 案例
SELECT IF(ABS('-89') >= 60, '及格', '不及格'); -- '及格'
【2】,CASE WHEN - 复杂条件判断
-- 案例
SELECTscore,CASEWHEN score >= 90 THEN '优秀'WHEN score >= 80 THEN '良好'WHEN score >= 60 THEN '及格'ELSE '不及格'END AS grade
FROM exam_results;
【3】,IFNULL() / NULLIF()-空判断
-- 案例
-- IFNULL():如果第一个参数为NULL,返回第二个参数
SELECT IFNULL(bonus, 0) AS bonus FROM salaries;-- NULLIF():如果两个参数相等,返回NULL
SELECT NULLIF(salary, 0) AS salary FROM employees; -- 工资为0时显示NULL
【4】,COALESCE() - 返回第一个非NULL值
-- 案例
select COALESCE(null,null,'a'); -- a