字符串函数:文本拼接、清洗、提取的主力
这是你写
SELECT和
UPDATE时调用频率最高的函数类别,尤其在报表生成、字段标准化、日志解析中几乎必用。
CONCAT()和
CONCAT_WS():前者简单拼接(
CONCAT('a','b') → 'ab'),后者带分隔符更安全(
CONCAT_WS('-', '2025', '12', '31') → '2025-12-31');注意任一参数为
NULL时,
CONCAT()整体返回
NULL,而
CONCAT_WS()会跳过
NULL参数
TRIM()/
LPAD()/
RPAD():清理空格或补位很常见,比如工号补零:
LPAD(workno, 5, '0')—— 但要注意,如果原始值是字符串(如
'A1'),补的是字符,不是数值对齐;若字段是数字类型,先转成字符串再补
SUBSTRING()和
LEFT()/
RIGHT():截取位置从 1 开始(不是 0),这是新手最容易写错的地方;
SUBSTRING('abcde', 2, 3) 返回 'bcd',不是
'cde'
REPLACE()是全局替换,不支持正则;想做模式替换得用
REGEXP_REPLACE()(MySQL 8.0.4+ 才有),低版本只能靠应用层或多次
REPLACE()
日期时间函数:处理“时间”不能只靠 NOW()
业务中大量涉及“最近7天”“入职满1年”“按月汇总”,光用
NOW()远不够,关键在能加减、能格式化、能比大小。
DATE_ADD()和
DATE_SUB()是时间运算基础,单位必须明确:
DATE_ADD(NOW(), INTERVAL 3 MONTH)合法,
DATE_ADD(NOW(), INTERVAL 30 DAY)也合法,但别写成
INTERVAL 30(缺单位会报错)
DATEDIFF()只返回天数差(整数),且只认日期部分(自动忽略时分秒);要算精确到秒的差,用
TIMESTAMPDIFF(SECOND, t1, t2)
DATE_FORMAT()格式符大小写敏感:
%Y是 4 位年,
%y是 2 位;
%m是月份数字(01–12),
%M是英文月份名(January);错误写成
%MM或漏掉
%会导致原样输出 所有日期函数输入值必须是合法日期类型(
DATE/
DATETIME/
TIMESTAMP),传入字符串如
'20251231'可能被隐式转换失败,建议显式用
STR_TO_DATE('20251231', '%Y%m%d')
数学与控制流程函数:让 SQL 具备“逻辑判断”能力
这类函数把 SQL 从“查数据”升级为“算逻辑”,避免在应用层做 if-else 拆分查询。
IF()最轻量:
IF(score >= 60, '及格', '不及格');但嵌套深了可读性差,复杂分支建议用
CASE WHEN
IFNULL()和
COALESCE()都用于空值兜底,区别在于:
IFNULL(a,b)只接受两个参数,
COALESCE(a,b,c)支持多参数并返回第一个非 NULL 值;
COALESCE是 SQL 标准,跨数据库兼容性更好
ROUND(x, d)四舍五入,注意 MySQL 的
ROUND()对 .5 的处理是“向偶数舍入”(banker’s rounding),比如
ROUND(2.5, 0)= 2,
ROUND(3.5, 0)= 4 —— 和多数编程语言默认行为不同,财务场景需特别验证
RAND()每行返回不同随机数,不能用于固定种子场景;如需可重现的随机序列,得靠应用层生成后传入
别忽略 CHAR_LENGTH() 和 LENGTH() 的本质差异
这个点看似小,却在中文、emoji 场景下频繁引发 bug:一个汉字在 utf8mb4 下占 4 字节,但只是 1 个字符。
CHAR_LENGTH('数据库') 返回 3(字符数)
LENGTH('数据库') 返回 12(字节数,utf8mb4 编码下) 做字段长度校验、截断、填充时,务必确认业务语义是“几个字”还是“占多少空间”;比如限制昵称最多 10 个汉字,该用
CHAR_LENGTH(),而不是
LENGTH()索引前缀长度限制(如
VARCHAR(255)加前缀索引
INDEX(col(10)))中的
10指的是字符数(MySQL 5.7+),和
CHAR_LENGTH()对齐 真正用好 MySQL 函数,不是背列表,而是清楚每个函数的边界:它接受什么输入、拒绝什么输入、在 NULL 下怎么表现、在不同字符集/版本下是否一致。尤其是字符串长度、日期格式符、四舍五入规则这些细节,线上出问题时往往就卡在这几步。
