字符串函數
1. 字符串拼接concat
-- 拼接字符串'hello'和'mysql',結果為'hellomysql'
-- 格式:concat(str1, str2, ...):拼接多個字符串
select concat('hello', 'mysql');
注意事項:若任一參數為null
,結果為null
(如concat('a', null)
返回null
)。
2. 大小寫轉換lower
/upper
-- 將字符串'HElLO'轉為全小寫,結果為'hello'
select lower('HElLO');-- 將字符串'hello'轉為全大寫,結果為'HELLO'
select upper('hello');
注意事項:僅對字母有效,非字母字符不處理(如lower('123A')
返回'123a'
)。
3. 填充函數lpad
/rpad
-- 左填充:將'01'用'-'填充至長度5,結果為'---01'
-- 格式:lpad(str, length, padstr):從左側用padstr填充str至指定長度
select lpad('01', 5, '-');-- 右填充:將'02'用'*'填充至長度5,結果為'02***'
-- 格式:rpad(str, length, padstr):從右側用padstr填充str至指定長度
select rpad('02', 5, '*');
注意事項:
- 若原字符串長度大于指定
length
,會截斷超出部分(如lpad('12345', 3, '0')
返回'123'
); padstr
可為空,但無實際意義。
4. 去除空格trim
-- 去除字符串前后的空格(默認行為),結果為'HElLO mysql *'
-- 格式:trim(str):去除str頭部和尾部的空格;也可指定去除字符(如trim('*' from '**abc**')返回'abc')
select trim(' HElLO mysql *');
注意事項:僅去除頭部和尾部的指定字符,中間的不處理(如trim(' a b c ')
返回'a b c'
)。
5. 截取子串substring
-- 從第1個字符開始,截取7個字符,結果為'HElLO m'
-- 格式:substring(str, start, length):start為起始位置(從1開始),length為截取長度
select substring('HElLO mysql', 1, 7);
注意事項:
- 起始位置
start
為負數時,表示從尾部開始計算(如substring('abcde', -3, 2)
返回'cd'
); - 若
length
超出字符串長度,返回從start
到結尾的所有字符。
練習:表數據更新(結合字符串函數)
-- 查看emp表所有數據(用于對比更新前后的workno字段)
select * from emp;-- 更新emp表的workno字段:用lpad函數將workno左填充0至5位
-- 例如原workno為'1',更新后為'00001';原workno為'10',更新后為'00010'
update emp set workno = lpad(workno, 5, 0);
注意事項:更新操作需謹慎,建議先備份數據或用select
驗證函數結果(如select lpad(workno,5,0) from emp
)。
數值函數
1. 向上取整ceil
-- 向上取整:1.1的向上取整結果為2
-- 格式:ceil(x):返回大于等于x的最小整數
select ceil(1.1); -- 結果:2
注意事項:對負數同樣生效(如ceil(-1.1)
返回-1
)。
2. 向下取整floor
-- 向下取整:-0.5的向下取整結果為-1(取小于等于該數的最大整數)
select floor(-0.5); -- 結果:-1
注意事項:與ceil
相反,floor(1.9)
返回1
,floor(-1.1)
返回-2
。
3. 取余數mod
-- 取余數:-9.5除以2的余數,結果為-1.5(余數符號與被除數一致)
-- 格式:mod(x, y):等價于x % y
select mod(-9.5, 2); -- 結果:-1.5
注意事項:若y
為 0,返回null
(除數不能為 0)。
4. 隨機數rand
-- 生成0-1之間的隨機浮點數(包含0,不包含1)
select rand(); -- 示例結果:0.847539276155328
注意事項:每次調用結果不同;若需固定隨機序列,可傳入種子(如rand(1)
,相同種子生成相同序列)。
5. 四舍五入round
-- 四舍五入:3.55936412保留5位小數,結果為3.55936
-- 格式:round(x, d):x為數值,d為保留的小數位數(默認d=0,即取整數)
select round(3.55936412, 5); -- 結果:3.55936
注意事項:d
為負數時,對整數部分四舍五入(如round(123.45, -1)
返回120
)。
練習:生成 6 位隨機驗證碼
-- 方式1:從rand()生成的隨機數中截取第3位開始的6個字符(rand()格式為0.xxxxxx...)
-- 例如rand()=0.123456789,substring從第3位取6位,結果為'123456'
select substring(rand(), 3, 6);-- 方式2:生成0-1000000的隨機整數,再用lpad左填充0至6位(確保是6位數)
-- round(rand()*1000000,0)生成0-1000000的整數,lpad確保不足6位時補0
select lpad(round(rand() * 1000000, 0), 6, 0);
注意事項:
- 方式 1 可能因
rand()
小數位數不足導致結果短于 6 位(如rand()
=0.1234,結果為 '1234'); - 方式 2 更可靠,確保始終返回 6 位數字(包括補 0 的情況)。
日期函數
1. 獲取當前日期 / 時間
-- 獲取當前日期(格式:YYYY-MM-DD)
select curdate(); -- 示例結果:2025-09-13-- 獲取當前時間(格式:HH:MM:SS)
select curtime(); -- 示例結果:15:30:45-- 獲取當前日期時間(格式:YYYY-MM-DD HH:MM:SS)
select now(); -- 示例結果:2025-09-13 15:30:45
注意事項:now()
返回的是 SQL 語句開始執行的時間,而非函數調用時的時間(若語句執行耗時較長)。
2. 提取日期部分
-- 提取當前日期的年份
select year(now()); -- 示例結果:2025-- 提取當前日期的月份
select month(now()); -- 示例結果:9-- 提取當前日期的日
select day(now()); -- 示例結果:13
注意事項:參數需為日期 / 時間類型,若為字符串需符合日期格式(如year('2024-05-10')
返回2024
)。
3. 日期加減date_add
-- 計算當前日期加79天后的日期
-- 格式:date_add(date, interval 數值 單位),單位可為day、month、year等
select date_add(now(), interval 79 day ); -- 示例結果:2025-12-01 15:30:45
注意事項:
- 單位需正確(如
interval 1 month
表示加 1 個月); - 減日期可用
date_sub
(如date_sub(now(), interval 1 day)
)。
4. 日期差datediff
-- 計算當前日期與'2024-01-01'的天數差(結果=當前日期 - 目標日期)
-- 格式:datediff(end_date, start_date):返回兩個日期之間的天數
select datediff(now(), '2024-01-01'); -- 示例結果:620(假設間隔620天)
注意事項:
- 僅計算日期部分,忽略時間(如
datediff('2024-01-02 23:59', '2024-01-01 00:00')
返回1
); - 若
end_date < start_date
,結果為負數。
練習:表查詢(結合日期函數)
-- 查看emp表所有數據(用于對比)
select * from emp;-- 查詢員工的入職天數和姓名,并按入職天數倒序排序
-- datediff(curdate(), entrydate):計算當前日期與入職日期的天數差(即入職天數)
-- order by 入職天數 desc:按入職天數從大到小排序(最老員工在前)
select datediff(curdate(), entrydate) '入職天數', name from emp order by 入職天數 desc ;
注意事項:
entrydate
需為date
類型,否則datediff
可能返回null
;- 排序時可直接使用別名(如
order by 入職天數
),無需重復寫函數。
總結:函數通用注意事項
- 參數類型需匹配:如日期函數需傳入日期 / 時間類型,字符串函數需傳入字符串類型,否則可能返回
null
或錯誤; - 邊界值處理:如
lpad
/rpad
的長度小于原字符串時會截斷,substring
的起始位置超出字符串長度時返回空; - 性能影響:聚合函數、復雜字符串 / 日期函數在大數據量下可能影響查詢效率,建議合理使用索引或限制查詢范圍;
- 兼容性:部分函數(如
mysql_native_password
)在不同 MySQL 版本中行為可能不同,需注意版本兼容。