MySQL 常用函數(shù)實(shí)操攻略之從基礎(chǔ)到實(shí)戰(zhàn)案例
在 MySQL 數(shù)據(jù)庫(kù)操作中,函數(shù)是提升數(shù)據(jù)處理效率的核心工具。無(wú)論是日期計(jì)算、字符串拼接,還是數(shù)據(jù)加密,掌握常用函數(shù)能讓復(fù)雜需求變得簡(jiǎn)單。本文將從實(shí)際場(chǎng)景出發(fā),梳理日期、字符串、數(shù)學(xué)及其他高頻函數(shù)的用法,每個(gè)函數(shù)都附帶可直接運(yùn)行的代碼案例,幫你快速上手。
一、日期函數(shù):處理時(shí)間維度數(shù)據(jù)
日期函數(shù)是業(yè)務(wù)開(kāi)發(fā)中的 “高頻工具”,比如統(tǒng)計(jì)近 7 天訂單、篩選 2 分鐘內(nèi)的新留言等場(chǎng)景都離不開(kāi)它。以下是最常用的 6 類日期函數(shù)及實(shí)操案例。
1. 獲取當(dāng)前時(shí)間信息
無(wú)需手動(dòng)輸入時(shí)間,用函數(shù)直接獲取系統(tǒng)當(dāng)前時(shí)間,避免人工錄入誤差。
獲取年月日:current_date(),返回格式YYYY-MM-DD
select current_date(); -- 結(jié)果:2024-10-01
獲取時(shí)分秒:current_time(),返回格式HH:MM:SS
select current_time(); -- 結(jié)果:14:25:30
獲取完整時(shí)間:current_timestamp() 或 now(),兩者功能一致,返回YYYY-MM-DD HH:MM:SS
select now(); -- 結(jié)果:2024-10-01 14:26:15
2. 日期 / 時(shí)間增減:date_add()與date_sub()
在指定日期上增加或減少時(shí)間,支持天、分鐘、秒等單位,靈活應(yīng)對(duì) “有效期計(jì)算”“超時(shí)判斷” 等場(chǎng)景。
加時(shí)間:date_add(原始日期, interval 數(shù)值 單位)
-- 給2024-10-01加5天
select date_add('2024-10-01', interval 5 day);
-- 結(jié)果:2024-10-06
-- 給2024-10-01 12:00:00加30分鐘
select date_add('2024-10-01 12:00:00', interval 30 minute);
-- 結(jié)果:2024-10-01 12:30:00減時(shí)間:date_sub(原始日期, interval 數(shù)值 單位)
-- 給2024-10-01減7天
select date_sub('2024-10-01', interval 7 day);
-- 結(jié)果:2024-09-243. 計(jì)算日期差:datediff()
統(tǒng)計(jì)兩個(gè)日期之間的天數(shù)差,結(jié)果為 “前日期 - 后日期”,正數(shù)表示前者晚,負(fù)數(shù)表示前者早。
-- 計(jì)算2024-10-01與2024-09-20的天數(shù)差
select datediff('2024-10-01', '2024-09-20');
-- 結(jié)果:11(10月1日比9月20日晚11天)
select datediff('2024-09-20', '2024-10-01');
-- 結(jié)果:-11(9月20日比10月1日早11天)4. 實(shí)戰(zhàn)案例:篩選 2 分鐘內(nèi)的新留言
需求:從msg留言表中,找出 “發(fā)布時(shí)間 + 2 分鐘” 仍在當(dāng)前時(shí)間之前的記錄(即 2 分鐘內(nèi)發(fā)布的留言)。
先創(chuàng)建msg表并插入數(shù)據(jù):
create table msg(
id int primary key auto_increment,
content varchar(30) not null,
sendtime datetime
);
-- 插入3條留言,sendtime為當(dāng)前時(shí)間
insert into msg (content, sendtime) values
('MySQL函數(shù)真好用', now()),
('今天學(xué)到新技巧了', now()),
('這是1小時(shí)前的舊留言', date_sub(now(), interval 1 hour));篩選 2 分鐘內(nèi)的留言:
select * from msg where date_add(sendtime, interval 2 minute) > now(); -- 結(jié)果:只顯示前2條剛插入的新留言,舊留言被過(guò)濾
二、字符串函數(shù):處理文本類數(shù)據(jù)
字符串函數(shù)常用于數(shù)據(jù)格式化(如 “XXX 的語(yǔ)文成績(jī)是 XXX 分”)、內(nèi)容匹配、空格清理等場(chǎng)景,以下是開(kāi)發(fā)中最常用的 8 類函數(shù)。
1. 查看字符集:charset()
確認(rèn)字符串或字段的字符集,避免因編碼不一致導(dǎo)致亂碼。
-- 查看字符串的字符集
select charset('MySQL學(xué)習(xí)');
-- 結(jié)果:utf8
-- 查看表中字段的字符集(以student表的name字段為例)
select charset(name) from student;
-- 結(jié)果:所有行均返回utf82. 拼接字符串:concat()
將多個(gè)字符串 / 字段拼接成一個(gè),支持文本與數(shù)字混合拼接。
-- 拼接固定文本和數(shù)字
select concat('Hello', 'MySQL', 2024);
-- 結(jié)果:HelloMySQL2024
-- 實(shí)戰(zhàn)場(chǎng)景:格式化顯示學(xué)生成績(jī)(exam_result表含name、chinese、math字段)
select concat(name, '的語(yǔ)文是', chinese, '分,數(shù)學(xué)是', math, '分') as 成績(jī)?cè)斍?
from exam_result;
-- 結(jié)果:唐三藏的語(yǔ)文是134分,數(shù)學(xué)是98分3. 計(jì)算字節(jié)數(shù):length()
統(tǒng)計(jì)字符串占用的字節(jié)數(shù),注意:UTF8 編碼下,1 個(gè)中文占 3 字節(jié),1 個(gè)英文 / 數(shù)字占 1 字節(jié)。
-- 計(jì)算中文+英文的字節(jié)數(shù)
select length('MySQL學(xué)習(xí)');
-- 結(jié)果:9(MySQL是5個(gè)字母,占5字節(jié);“學(xué)習(xí)”是2個(gè)中文,占6字節(jié),合計(jì)5+6=11?此處修正:MySQL是5字符,占5字節(jié),“學(xué)習(xí)”2字符占6字節(jié),總計(jì)11,此前示例有誤,以實(shí)際計(jì)算為準(zhǔn))
-- 查看學(xué)生姓名的字節(jié)數(shù)(student表)
select name, length(name) as 姓名字節(jié)數(shù) from student;
-- 結(jié)果:張三 → 6字節(jié)(2個(gè)中文×3)4. 查找子串位置:instr()
判斷子串是否在主串中,返回子串的起始下標(biāo)(從 1 開(kāi)始),若不存在則返回 0。
-- 查找“函數(shù)”在主串中的位置
select instr('MySQL常用函數(shù)指南', '函數(shù)');
-- 結(jié)果:6(“函數(shù)”從第6個(gè)字符開(kāi)始)
-- 查找不存在的子串
select instr('MySQL常用函數(shù)指南', 'SQL Server');
-- 結(jié)果:05. 大小寫(xiě)轉(zhuǎn)換:ucase()與lcase()
將字符串統(tǒng)一轉(zhuǎn)為大寫(xiě)或小寫(xiě),常用于不區(qū)分大小寫(xiě)的查詢場(chǎng)景。
-- 轉(zhuǎn)為大寫(xiě)
select ucase('mysql');
-- 結(jié)果:MYSQL
-- 轉(zhuǎn)為小寫(xiě)
select lcase('MYSQL FUNCTION');
-- 結(jié)果:mysql function6. 截取字符串:left()、right()、substring()
left(主串, 長(zhǎng)度):從左側(cè)截取指定長(zhǎng)度的字符right(主串, 長(zhǎng)度):從右側(cè)截取指定長(zhǎng)度的字符substring(主串, 起始下標(biāo), 長(zhǎng)度):從指定下標(biāo)開(kāi)始,截取指定長(zhǎng)度(下標(biāo)從 1 開(kāi)始)
-- 左側(cè)截取3個(gè)字符
select left('MySQL函數(shù)', 3);
-- 結(jié)果:MyS
-- 右側(cè)截取2個(gè)字符
select right('MySQL函數(shù)', 2);
-- 結(jié)果:函數(shù)
-- 從第4個(gè)字符開(kāi)始,截取3個(gè)字符
select substring('MySQL函數(shù)指南', 4, 3);
-- 結(jié)果:QL函7. 替換字符:replace()
將主串中的指定子串替換為新字符,常用于敏感詞過(guò)濾、內(nèi)容修正。
-- 將“MySQL”替換為“數(shù)據(jù)庫(kù)”
select replace('學(xué)習(xí)MySQL很重要', 'MySQL', '數(shù)據(jù)庫(kù)');
-- 結(jié)果:學(xué)習(xí)數(shù)據(jù)庫(kù)很重要
-- 實(shí)戰(zhàn)場(chǎng)景:將emp表ename字段中的“S”替換為“上?!?
select replace(ename, 'S', '上海') as 替換后姓名 from emp;
-- 結(jié)果:SMITH → 上海MITH8. 清理空格:ltrim()、rtrim()、trim()
ltrim(字符串):清除左側(cè)空格rtrim(字符串):清除右側(cè)空格trim(字符串):清除兩側(cè)空格
-- 清除左側(cè)空格
select ltrim(' 左側(cè)有空格 ') as 結(jié)果;
-- 結(jié)果:左側(cè)有空格
-- 清除兩側(cè)空格
select trim(' 兩側(cè)有空格 ') as 結(jié)果;
-- 結(jié)果:兩側(cè)有空格三、數(shù)學(xué)函數(shù):處理數(shù)值計(jì)算
數(shù)學(xué)函數(shù)主要用于數(shù)值的計(jì)算與格式化,如絕對(duì)值、取整、隨機(jī)數(shù)生成等,以下是 4 類常用函數(shù)。
1. 絕對(duì)值:abs()
返回?cái)?shù)值的絕對(duì)值,常用于計(jì)算差值(如距離、誤差)。
select abs(-100); -- 結(jié)果:100 select abs(25.5); -- 結(jié)果:25.5
2. 取整:ceiling()與floor()
ceiling(數(shù)值):向上取整(無(wú)論小數(shù)部分是多少,都進(jìn) 1)floor(數(shù)值):向下取整(無(wú)論小數(shù)部分是多少,都舍掉)
-- 向上取整 select ceiling(3.1); -- 結(jié)果:4 select ceiling(-2.9); -- 結(jié)果:-2 -- 向下取整 select floor(3.9); -- 結(jié)果:3 select floor(-2.1); -- 結(jié)果:-3
3. 保留小數(shù):format()
按指定位數(shù)保留小數(shù),自動(dòng)四舍五入,返回字符串格式(常用于金額、成績(jī)格式化)。
-- 保留2位小數(shù) select format(123.456, 2); -- 結(jié)果:123.46(四舍五入) select format(78.9, 2); -- 結(jié)果:78.90(補(bǔ)0)
4. 隨機(jī)數(shù):rand()
生成 0~1 之間的隨機(jī)小數(shù)(左閉右開(kāi)),可通過(guò)乘法擴(kuò)展到指定范圍。
-- 生成0~1的隨機(jī)數(shù) select rand(); -- 結(jié)果:0.78956(每次運(yùn)行結(jié)果不同) -- 生成1~10的隨機(jī)整數(shù)(先×10,再保留0位小數(shù)) select format(rand()*10, 0) as 1到10的隨機(jī)數(shù); -- 結(jié)果:5(每次運(yùn)行結(jié)果不同)
四、其他高頻函數(shù):用戶、加密與空值處理
除了上述三類函數(shù),還有一些 “特殊功能” 函數(shù),在用戶管理、數(shù)據(jù)安全場(chǎng)景中非常實(shí)用。
1. 查看當(dāng)前用戶:user()
返回當(dāng)前登錄 MySQL 的用戶名及主機(jī),用于權(quán)限排查。
select user(); -- 結(jié)果:root@localhost(root是用戶名,localhost是主機(jī))
2. 密碼加密:md5()
對(duì)字符串進(jìn)行 MD5 加密,生成 32 位的十六進(jìn)制字符串,常用于密碼存儲(chǔ)(避免明文泄露)。
實(shí)戰(zhàn)場(chǎng)景:創(chuàng)建用戶表并加密存儲(chǔ)密碼
創(chuàng)建user_info表:
create table user_info( id int primary key auto_increment, username varchar(20) not null, password char(32) not null -- MD5加密后是32位,用char(32)存儲(chǔ) );
插入加密后的密碼(原始密碼為 123456):
insert into user_info (username, password)
values ('zhangsan', md5('123456'));驗(yàn)證密碼(查詢時(shí)需對(duì)輸入的密碼也進(jìn)行 MD5 加密):
select id, username from user_info
where password = md5('123456');
-- 結(jié)果:返回zhangsan的記錄(密碼匹配)3. 空值處理:ifnull()
如果第一個(gè)值為null,則返回第二個(gè)值;否則返回第一個(gè)值,常用于避免null導(dǎo)致的計(jì)算錯(cuò)誤。
-- 第一個(gè)值為null,返回第二個(gè)值 select ifnull(null, '空值時(shí)顯示這個(gè)'); -- 結(jié)果:空值時(shí)顯示這個(gè) -- 第一個(gè)值不為null,返回第一個(gè)值 select ifnull(100, '空值時(shí)顯示這個(gè)'); -- 結(jié)果:100 -- 實(shí)戰(zhàn)場(chǎng)景:計(jì)算學(xué)生總分(若math字段為null,按0分計(jì)算) select name, chinese + ifnull(math, 0) as 語(yǔ)文數(shù)學(xué)總分 from exam_result;
到此這篇關(guān)于MySQL 常用函數(shù)實(shí)操攻略之從基礎(chǔ)到實(shí)戰(zhàn)案例的文章就介紹到這了,更多相關(guān)mysql常用函數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SQL大表關(guān)聯(lián)優(yōu)化全攻略及常見(jiàn)問(wèn)題
在數(shù)據(jù)驅(qū)動(dòng)的時(shí)代,SQL作為數(shù)據(jù)庫(kù)交互的核心語(yǔ)言,其重要性不言而喻,這篇文章主要介紹了SQL大表關(guān)聯(lián)優(yōu)化全攻略及常見(jiàn)問(wèn)題的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2025-11-11
MySQL內(nèi)存使用率高且不釋放問(wèn)題排查與總結(jié)
這篇文章主要給大家介紹了MySQL內(nèi)存使用率高且不釋放問(wèn)題排查與總結(jié),文中通過(guò)代碼示例和圖文結(jié)合的方式給大家講解的非常詳細(xì),對(duì)大家解決問(wèn)題有一定的幫助,需要的朋友可以參考下2024-09-09
MySQL中隨機(jī)排序的幾種方法實(shí)現(xiàn)
MySQL實(shí)現(xiàn)隨機(jī)排序有多種方法,包括使用RAND()、UUID()函數(shù),排序字段的哈希值以及自定義函數(shù),文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2025-01-01
詳解數(shù)據(jù)庫(kù)多表連接查詢的實(shí)現(xiàn)方法
這篇文章主要介紹了詳解數(shù)據(jù)庫(kù)多表連接查詢的實(shí)現(xiàn)方法的相關(guān)資料,希望通過(guò)本文大家能夠掌握數(shù)據(jù)庫(kù)多表查詢的方法,需要的朋友可以參考下2017-09-09
linux系統(tǒng)ubuntu18.04安裝mysql 5.7
這篇文章主要為大家詳細(xì)介紹了linux系統(tǒng)ubuntu18.04安裝mysql 5.7,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-09-09
簡(jiǎn)單聊一聊SQL中的union和union?all
在寫(xiě)SQL的時(shí)候,偶爾會(huì)用到兩個(gè)表的數(shù)據(jù)結(jié)合在一起返回的,就需要用到UNION 和 UNION ALL,這篇文章主要給大家介紹了關(guān)于SQL中union和union?all的相關(guān)資料,需要的朋友可以參考下2023-02-02
MySQL入門(一) 數(shù)據(jù)表數(shù)據(jù)庫(kù)的基本操作
這類文章記錄我看MySQL5.6從零開(kāi)始學(xué)》這本書(shū)的過(guò)程,將自己覺(jué)得重要的東西記錄一下,并有可能幫助到你們,在寫(xiě)的博文前幾篇度會(huì)非?;A(chǔ),只要?jiǎng)邮智茫覍?xiě)的例子全部實(shí)現(xiàn)一遍,基本上就搞定了,前期很難理解的東西基本沒(méi)有2018-07-07
MySQL高效導(dǎo)入多個(gè).sql文件方法詳解
MySQL有多種方法導(dǎo)入多個(gè).sql文件,常用的有兩個(gè)命令:mysql和source,如何提高導(dǎo)入速度,在導(dǎo)入大的sql文件時(shí),建議使用mysql命令2018-10-10

