最常用、最值得优先掌握的是字符串函数、日期时间函数、数学函数、控制流程函数这四类,覆盖90%以上日常SQL数据加工需求;它们分别支撑文本处理、时间运算、数值计算与逻辑判断。

字符串函数:文本拼接、清洗、提取的主力
这是你写 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()对齐










