MySQL函数分类(收藏)

1. 数值处理函数

用于数学运算和数值处理
包括基本的算术运算、舍入、随机数生成等

函数名 功能 语法示例 结果示例 版本适用 备注
ABS() 返回数值的绝对值 SELECT ABS(-5); 5 所有版本
CEIL()/CEILING() 返回大于或等于数值的最小整数 SELECT CEIL(3.2); 4 所有版本 两个函数功能相同
FLOOR() 返回小于或等于数值的最大整数 SELECT FLOOR(3.8); 3 所有版本
ROUND() 对数值进行四舍五入 SELECT ROUND(3.456, 2); 3.46 所有版本 第二个参数指定小数位数
TRUNCATE() 截断数值到指定小数位 SELECT TRUNCATE(3.456, 1); 3.4 所有版本 不进行四舍五入
MOD() 返回两数相除的余数 SELECT MOD(10, 3); 1 所有版本 等同于%运算符
POW()/POWER() 返回数值的指定次幂 SELECT POW(2, 3); 8 所有版本 两个函数功能相同
SQRT() 返回数值的平方根 SELECT SQRT(16); 4 所有版本
EXP() 返回e的指定次幂 SELECT EXP(1); 2.718281828459045 所有版本
LOG() 返回数值的自然对数 SELECT LOG(EXP(1)); 1 所有版本
LOG10() 返回数值的以10为底的对数 SELECT LOG10(100); 2 所有版本
LN() 返回数值的自然对数 SELECT LN(EXP(1)); 1 所有版本 与LOG()相同
RAND() 返回0到1之间的随机数 SELECT RAND(); 0-1之间的随机数 所有版本 可指定种子
SIGN() 返回数值的符号 SELECT SIGN(-5); -1 所有版本 正数返回1,负数返回-1,0返回0
CONV() 在不同进制间转换数值 SELECT CONV(10, 10, 2); ‘1010’ 所有版本 返回字符串类型
FORMAT() 格式化数值为指定小数位 SELECT FORMAT(1234.567, 2); ‘1,234.57’ 所有版本 会四舍五入并添加千位分隔符
GREATEST() 返回参数列表中的最大值 SELECT GREATEST(1, 3, 2); 3 所有版本
LEAST() 返回参数列表中的最小值 SELECT LEAST(1, 3, 2); 1 所有版本
DEGREES() 将弧度转换为角度 SELECT DEGREES(PI()); 180 所有版本
RADIANS() 将角度转换为弧度 SELECT RADIANS(180); 3.141592653589793 所有版本
SIN() 返回数值的正弦值 SELECT SIN(RADIANS(30)); 0.5 所有版本 参数为弧度
COS() 返回数值的余弦值 SELECT COS(RADIANS(60)); 0.5 所有版本 参数为弧度
TAN() 返回数值的正切值 SELECT TAN(RADIANS(45)); 1 所有版本 参数为弧度
ASIN() 返回数值的反正弦值 SELECT ASIN(0.5); 0.5235987755982989 所有版本 结果为弧度
ACOS() 返回数值的反余弦值 SELECT ACOS(0.5); 1.0471975511965979 所有版本 结果为弧度
ATAN() 返回数值的反正切值 SELECT ATAN(1); 0.7853981633974483 所有版本 结果为弧度
ATAN2() 返回两个数值的反正切值 SELECT ATAN2(1, 1); 0.7853981633974483 所有版本 结果为弧度
COT() 返回数值的余切值 SELECT COT(RADIANS(45)); 1 所有版本 参数为弧度
BIN() 返回数值的二进制表示 SELECT BIN(10); ‘1010’ 所有版本 返回字符串类型
OCT() 返回数值的八进制表示 SELECT OCT(10); ‘12’ 所有版本 返回字符串类型
HEX() 返回数值的十六进制表示 SELECT HEX(255); ‘FF’ 所有版本 返回字符串类型
BIT_COUNT() 返回数值的二进制表示中1的个数 SELECT BIT_COUNT(7); 3 所有版本
CRC32() 计算循环冗余校验值 SELECT CRC32('MySQL'); 3259397556 5.0+ 返回无符号整数

2. 字符串处理函数

用于文本字符串的操作和处理
包括连接、截取、转换、搜索等字符串操作

函数名 功能 语法示例 结果示例 版本适用 备注
CONCAT()​ 连接字符串 SELECT CONCAT('Hello',' ','World'); Hello World 所有版本 参数可以是列名或字符串
CONCAT_WS()​ 用分隔符连接字符串 SELECT CONCAT_WS('-','2023','07','15'); 2023-07-15 所有版本 第一个参数是分隔符
SUBSTRING()​ 截取子字符串 SELECT SUBSTRING('MySQL',2,3); ySQ 所有版本 起始位置从1开始
LEFT()​ 从左截取字符串 SELECT LEFT('Database',4); Data 所有版本
RIGHT()​ 从右截取字符串 SELECT RIGHT('Database',4); base 所有版本
LENGTH()​ 返回字节长度 SELECT LENGTH('中国'); 6(UTF8) 所有版本 字节数非字符数
CHAR_LENGTH()​ 返回字符数 SELECT CHAR_LENGTH('中国'); 2 所有版本
TRIM()​ 去除首尾空格 SELECT TRIM(' MySQL '); ‘MySQL’ 所有版本 也可去除指定字符
LTRIM()​ 去除左侧空格 SELECT LTRIM(' MySQL'); ‘MySQL’ 所有版本
RTRIM()​ 去除右侧空格 SELECT RTRIM('MySQL '); ‘MySQL’ 所有版本
REPLACE()​ 字符串替换 SELECT REPLACE('www.mysql.com','mysql','oracle'); www.oracle.com 所有版本
REVERSE()​ 反转字符串 SELECT REVERSE('SQL'); LQS 所有版本
UPPER()​ 转为大写 SELECT UPPER('mysql'); MYSQL 所有版本
LOWER()​ 转为小写 SELECT LOWER('MySQL'); mysql 所有版本
LOCATE()​ 查找子串位置 SELECT LOCATE('sql','MySQL'); 3 所有版本
INSTR()​ 查找子串位置 SELECT INSTR('MySQL','sql'); 3 所有版本 参数顺序与LOCATE相反
LPAD()​ 左侧填充字符串 SELECT LPAD('5',3,'0'); 005 所有版本
RPAD()​ 右侧填充字符串 SELECT RPAD('5',3,'!'); 5!! 所有版本
SPACE()​ 生成空格字符串 SELECT CONCAT('Hello',SPACE(3),'World'); Hello World 所有版本
REPEAT()​ 重复字符串 SELECT REPEAT('Ha',3); HaHaHa 所有版本
STRCMP()​ 比较字符串 SELECT STRCMP('text','text'); 0 所有版本 0:相等,1:大于,-1:小于
FORMAT()​ 数字格式化 SELECT FORMAT(12345.6789,2); 12,345.68 5.0+
HEX()​ 转为十六进制 SELECT HEX('ABC'); 414243 所有版本
UNHEX()​ 十六进制转字符串 SELECT UNHEX('414243'); ABC 所有版本
BIN()​ 返回二进制表示 SELECT BIN(10); 1010 所有版本
OCT()​ 返回八进制表示 SELECT OCT(10); 12 所有版本
CHAR()​ 返回ASCII字符 SELECT CHAR(65); A 所有版本
ASCII()​ 返回ASCII码 SELECT ASCII('A'); 65 所有版本
ELT()​ 返回指定位置字符串 SELECT ELT(2,'A','B','C'); B 所有版本
FIELD()​ 返回字符串位置 SELECT FIELD('B','A','B','C'); 2 所有版本
FIND_IN_SET()​ 在集合中查找字符串 SELECT FIND_IN_SET('b','a,b,c'); 2 所有版本
MAKE_SET()​ 按位组合字符串 SELECT MAKE_SET(3,'a','b','c'); a,b 所有版本
QUOTE()​ 转义字符串 SELECT QUOTE("Don't"); ‘Don’t’ 所有版本
INSERT()​ 插入替换字符串 SELECT INSERT('MySQL',2,3,'Oracle'); MOracleL 所有版本
REGEXP 正则匹配 SELECT 'MySQL' REGEXP '^M'; 1 所有版本 1:匹配,0:不匹配
SOUNDEX()​ 返回发音相似值 SELECT SOUNDEX('sea'),SOUNDEX('see'); S000 所有版本
EXPORT_SET()​ 返回位集合字符串 SELECT EXPORT_SET(5,'Y','N',',',4); Y,N,Y,N 所有版本
LOAD_FILE()​ 读取文件内容 SELECT LOAD_FILE('/tmp/test.txt'); 文件内容 所有版本 需要文件权限

3. 日期时间函数

用于处理日期和时间值
包括获取当前时间、提取日期部分、日期计算等

函数名 功能 语法示例 结果示例 版本适用 备注
CURDATE()​ 返回当前日期(不含时间) SELECT CURDATE(); 2025-07-04 所有版本 等价于 CURRENT_DATE()
CURTIME()​ 返回当前时间(不含日期) SELECT CURTIME(); 15:30:22 所有版本 等价于 CURRENT_TIME()
NOW()​ 返回当前日期和时间 SELECT NOW(); 2025-07-04 15:30:22 所有版本 等价于 CURRENT_TIMESTAMP()
DATE()​ 提取日期部分 SELECT DATE('2025-07-04 15:30:22'); 2025-07-04 所有版本
TIME()​ 提取时间部分 SELECT TIME('2025-07-04 15:30:22'); 15:30:22 所有版本
YEAR()​ 提取年份 SELECT YEAR('2025-07-04'); 2025 所有版本
MONTH()​ 提取月份(1-12) SELECT MONTH('2025-07-04'); 7 所有版本
DAY()​ 提取日(1-31) SELECT DAY('2025-07-04'); 4 所有版本 等价于 DAYOFMONTH()
HOUR()​ 提取小时(0-23) SELECT HOUR('15:30:22'); 15 所有版本
MINUTE()​ 提取分钟(0-59) SELECT MINUTE('15:30:22'); 30 所有版本
SECOND()​ 提取秒数(0-59) SELECT SECOND('15:30:22'); 22 所有版本
DAYOFWEEK()​ 返回星期几(1=周日,7=周六) SELECT DAYOFWEEK('2025-07-04'); 6 所有版本
DAYOFYEAR()​ 返回一年中的第几天(1-366) SELECT DAYOFYEAR('2025-07-04'); 185 所有版本
WEEK()​ 返回一年中的第几周(0-53) SELECT WEEK('2025-07-04'); 27 所有版本 可通过参数指定周起始日
DATE_FORMAT()​ 格式化日期 SELECT DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%s'); 2025-07-04 15:30:22 所有版本 支持多种格式化符号(如 %Y=年,%m=月)
DATEDIFF()​ 计算两个日期的天数差 SELECT DATEDIFF('2025-07-10', '2025-07-04'); 6 所有版本 结果=date1-date2
TIMEDIFF()​ 计算两个时间的差值 SELECT TIMEDIFF('18:00:00', '15:30:00'); 02:30:00 所有版本 结果=time1-time2
DATE_ADD()​ 日期时间加法 SELECT DATE_ADD('2025-07-04', INTERVAL 1 MONTH); 2025-08-04 所有版本 支持多种INTERVAL单位(DAY, MONTH等)
DATE_SUB()​ 日期时间减法 SELECT DATE_SUB('2025-07-04', INTERVAL 1 WEEK); 2025-06-27 所有版本
LAST_DAY()​ 返回月份的最后一天 SELECT LAST_DAY('2025-07-04'); 2025-07-31 所有版本
TIMESTAMP()​ 将日期时间字符串转为TIMESTAMP格式 SELECT TIMESTAMP('2025-07-04'); 2025-07-04 00:00:00 所有版本
UNIX_TIMESTAMP()​ 返回UNIX时间戳(秒数) SELECT UNIX_TIMESTAMP(NOW()); 1751628622 所有版本
FROM_UNIXTIME()​ 将UNIX时间戳转为日期时间 SELECT FROM_UNIXTIME(1751628622); 2025-07-04 15:30:22 所有版本
STR_TO_DATE()​ 字符串转日期 SELECT STR_TO_DATE('04,07,2025', '%d,%m,%Y'); 2025-07-04 所有版本 需指定格式字符串
PERIOD_ADD()​ 为年月格式(YYYYMM)添加月份 SELECT PERIOD_ADD(202507, 3); 202510 所有版本 参数格式必须为YYYYMM
PERIOD_DIFF()​ 计算两个年月格式的月份差 SELECT PERIOD_DIFF(202510, 202507); 3 所有版本
TIME_TO_SEC()​ 将时间转为秒数(从00:00:00开始) SELECT TIME_TO_SEC('15:30:00'); 55800 所有版本
SEC_TO_TIME()​ 将秒数转为时间格式 SELECT SEC_TO_TIME(55800); 15:30:00 所有版本
ADDTIME()​ 时间加法运算 SELECT ADDTIME('15:30:00', '02:15:00'); 17:45:00 所有版本
SUBTIME()​ 时间减法运算 SELECT SUBTIME('15:30:00', '02:15:00'); 13:15:00 所有版本
MAKEDATE()​ 根据年份和天数创建日期 SELECT MAKEDATE(2025, 185); 2025-07-04 所有版本 天数范围1-366
MAKETIME()​ 根据时分秒创建时间 SELECT MAKETIME(15, 30, 22); 15:30:22 所有版本

4. 聚合函数

对数据集进行汇总计算
通常与GROUP BY子句配合使用

函数名 功能 语法示例 结果示例 版本适用 备注
COUNT() 返回行数或非NULL值的数量 SELECT COUNT(*) FROM users; 100 所有版本 COUNT(1)与COUNT(*)等效
SUM() 计算数值列的总和 SELECT SUM(salary) FROM emp; 250000.00 所有版本 忽略NULL值
AVG() 计算数值列的平均值 SELECT AVG(age) FROM students; 22.5 所有版本 忽略NULL值
MAX() 返回列中的最大值 SELECT MAX(price) FROM products; 999.99 所有版本 适用于数值/日期/字符串类型
MIN() 返回列中的最小值 SELECT MIN(join_date) FROM members; ‘2020-01-01’ 所有版本 适用于数值/日期/字符串类型
GROUP_CONCAT() 将多行值连接成字符串 SELECT GROUP_CONCAT(name) FROM emp; ‘张三,李四,王五’ MySQL 4.1+ 默认逗号分隔
STD() 计算总体标准差 SELECT STD(score) FROM exam; 12.34 MySQL 5.6+ 统计函数
STDDEV() STD()的别名 SELECT STDDEV(score) FROM exam; 12.34 MySQL 5.6+ 与STD()相同
VARIANCE() 计算总体方差 SELECT VARIANCE(score) FROM exam; 152.28 MySQL 5.6+ 统计函数
BIT_AND() 对二进制值执行按位AND操作 SELECT BIT_AND(flag) FROM bits; 1 MySQL 5.0+ 二进制聚合
BIT_OR() 对二进制值执行按位OR操作 SELECT BIT_OR(flag) FROM bits; 3 MySQL 5.0+ 二进制聚合
BIT_XOR() 对二进制值执行按位XOR操作 SELECT BIT_XOR(flag) FROM bits; 2 MySQL 5.0+ 二进制聚合
JSON_ARRAYAGG() 将结果集聚合为JSON数组 SELECT JSON_ARRAYAGG(name) FROM users; ["张三","李四"] MySQL 5.7.22+ JSON处理函数
JSON_OBJECTAGG() 将键值对聚合为JSON对象 SELECT JSON_OBJECTAGG(id, name) FROM users; {"1":"张三","2":"李四"} MySQL 5.7.22+ JSON处理函数

5. 流程控制函数

函数名 功能 语法示例 结果示例 版本适用 备注
IF() 根据条件返回两个值中的一个 SELECT IF(1>0, 'True', 'False'); 'True' 所有版本 类似三元运算符
IFNULL() 检查第一个表达式是否为NULL,是则返回第二个表达式的值 SELECT IFNULL(NULL, 'Default'); 'Default' 所有版本 常用于处理可能为NULL的字段
NULLIF() 比较两个表达式,若相等则返回NULL,否则返回第一个表达式的值 SELECT NULLIF(5, 5); NULL 所有版本 可用于避免除零错误等场景
CASE WHEN 多条件分支控制,类似编程语言中的switch-case SELECT CASE WHEN score>=90 THEN 'A' WHEN score>=60 THEN 'B' ELSE 'C' END 根据score值返回’A’/‘B’/‘C’ 所有版本 有简单CASE和搜索CASE两种语法
COALESCE() 返回参数列表中第一个非NULL的值 SELECT COALESCE(NULL, NULL, 'MySQL', 'Oracle'); 'MySQL' 所有版本 比IFNULL()更灵活,可接受多个参数
GREATEST() 返回参数列表中的最大值 SELECT GREATEST(10, 20, 30); 30 所有版本 如果任意参数为NULL则返回NULL
LEAST() 返回参数列表中的最小值 SELECT LEAST(10, 20, 30); 10 所有版本 如果任意参数为NULL则返回NULL
ISNULL() 判断表达式是否为NULL SELECT ISNULL(NULL); 1 (表示TRUE) 所有版本 = NULL不同,这是推荐的安全检测方式
实现条件判断和程序流控制
包括条件表达式和分支逻辑

6. 系统信息函数

返回数据库系统和连接信息
包括版本、用户、连接状态等

函数名 功能 语法示例 结果示例 版本适用 备注
VERSION() 返回MySQL服务器版本 SELECT VERSION(); 8.0.33 所有版本 返回字符串
CONNECTION_ID() 返回当前连接的ID SELECT CONNECTION_ID(); 15 所有版本 每次连接唯一
DATABASE() 返回当前数据库名 SELECT DATABASE(); test_db 所有版本 未选择数据库返回NULL
SCHEMA() DATABASE()的同义词 SELECT SCHEMA(); test_db 所有版本 与DATABASE()相同
USER() 返回当前用户名和主机名 SELECT USER(); 'root'@'localhost' 所有版本 返回字符串
CURRENT_USER() 返回认证当前会话的用户名和主机名 SELECT CURRENT_USER(); 'root'@'%' 所有版本 可能与USER()不同
SYSTEM_USER() USER()的同义词 SELECT SYSTEM_USER(); 'root'@'localhost' 所有版本 与USER()相同
SESSION_USER() USER()的同义词 SELECT SESSION_USER(); 'root'@'localhost' 所有版本 与USER()相同
LAST_INSERT_ID() 返回最后一个AUTO_INCREMENT值 SELECT LAST_INSERT_ID(); 123 所有版本 会话特定值
ROW_COUNT() 返回前一个SQL语句影响的行数 SELECT ROW_COUNT(); 1 5.0+ INSERT/UPDATE/DELETE后使用
FOUND_ROWS() 返回LIMIT前匹配的行数 SELECT SQL_CALC_FOUND_ROWS * FROM t LIMIT 10; SELECT FOUND_ROWS(); 100 4.0.0+ 需配合SQL_CALC_FOUND_ROWS使用
CHARSET(str) 返回字符串的字符集 SELECT CHARSET('abc'); utf8mb4 5.0+
COLLATION(str) 返回字符串的排序规则 SELECT COLLATION('abc'); utf8mb4_general_ci 5.0+
BENCHMARK(count, expr) 重复执行表达式多次 SELECT BENCHMARK(1000000, MD5('test')); 0 所有版本 用于性能测试
GET_LOCK(str, timeout) 获取命名锁 SELECT GET_LOCK('mylock', 10); 1 5.0+ 成功返回1,超时返回0
IS_FREE_LOCK(str) 检查命名锁是否可用 SELECT IS_FREE_LOCK('mylock'); 0 5.0+ 可用返回1,否则返回0
IS_USED_LOCK(str) 检查命名锁是否被使用 SELECT IS_USED_LOCK('mylock'); 连接ID 5.0+ 未使用返回NULL
RELEASE_LOCK(str) 释放命名锁 SELECT RELEASE_LOCK('mylock'); 1 5.0+ 成功返回1,否则返回0
RELEASE_ALL_LOCKS() 释放当前会话所有锁 SELECT RELEASE_ALL_LOCKS(); 0 5.7+ 返回释放的锁数量
UUID() 返回通用唯一标识符 SELECT UUID(); '6ccd780c-baba-1026-9564-5b8c656024db' 5.0+ 标准UUID格式
UUID_SHORT() 返回短格式唯一标识符 SELECT UUID_SHORT(); 92395783840106496 5.0+ 64位无符号整数
DEFAULT(col_name) 返回列的默认值 SELECT DEFAULT(col1) FROM t; NULL 8.0.13+ 无默认值返回NULL
ICU_VERSION() 返回ICU库版本 SELECT ICU_VERSION(); 70.1 8.0+ 仅当使用ICU排序规则时
ROLES_GRAPHML() 返回角色关系图 SELECT ROLES_GRAPHML(); ... 8.0+ 返回GraphML格式

7. 加密与压缩函数

提供数据安全性和存储优化功能
包括哈希算法、加密解密、数据压缩

函数名 功能 语法示例 结果示例 版本适用 备注
MD5() 计算字符串的MD5 128位校验和 SELECT MD5('hello'); 5d41402abc4b2a76b9719d911017c592 所有版本 返回32位十六进制字符串
SHA1() / SHA() 计算字符串的SHA1 160位校验和 SELECT SHA1('hello'); aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d 所有版本 返回40位十六进制字符串
SHA2() 计算SHA2哈希值(224/256/384/512位) SELECT SHA2('hello', 256); 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824 MySQL 5.5+ 第二个参数指定位数
AES_ENCRYPT() 使用AES算法加密字符串 SELECT AES_ENCRYPT('text','key'); 二进制结果 MySQL 4.0.2+ 需要16/24/32字节密钥
AES_DECRYPT() 解密AES_ENCRYPT加密的字符串 SELECT AES_DECRYPT(col,'key'); 原始字符串 MySQL 4.0.2+ 需使用相同密钥
ENCODE() 用密钥加密字符串 SELECT ENCODE('text','key'); 二进制结果 MySQL 4.0.2+ 5.7.2后已弃用
DECODE() 解密ENCODE加密的字符串 SELECT DECODE(col,'key'); 原始字符串 MySQL 4.0.2+ 5.7.2后已弃用
DES_ENCRYPT() 使用DES算法加密字符串 SELECT DES_ENCRYPT('text'); 二进制结果 MySQL 4.0.2+ 需要SSL支持
DES_DECRYPT() 解密DES_ENCRYPT加密的字符串 SELECT DES_DECRYPT(col); 原始字符串 MySQL 4.0.2+ 需要SSL支持
COMPRESS() 压缩字符串(使用zlib) SELECT COMPRESS('long_text'); 二进制结果 MySQL 4.1.1+ 需UNCOMPRESS()解压
UNCOMPRESS() 解压COMPRESS压缩的字符串 SELECT UNCOMPRESS(col); 原始字符串 MySQL 4.1.1+ 返回原始长度
PASSWORD() 计算密码哈希(用于认证) SELECT PASSWORD('mypass'); 哈希字符串 MySQL 4.1前 8.0+已移除
OLD_PASSWORD() 旧版密码哈希算法 SELECT OLD_PASSWORD('mypass'); 哈希字符串 MySQL 4.1前 兼容旧系统
RANDOM_BYTES() 生成随机字节序列 SELECT RANDOM_BYTES(8); 随机二进制 MySQL 5.6+ 用于加密用途
STATEMENT_DIGEST() 计算SQL语句摘要 SELECT STATEMENT_DIGEST('SELECT 1'); 哈希字符串 MySQL 5.7+ 性能分析用

8. 窗口函数(MySQL 8.0+)

对结果集进行高级分析处理
包括排名、分窗、前后行访问等

函数名 功能 语法示例 结果示例 版本适用 备注
ROW_NUMBER() 为分区内的每行分配唯一序号 SELECT name, salary, ROW_NUMBER() OVER(ORDER BY salary DESC) AS row_num FROM employees; 按工资降序生成1,2,3…的序号 MySQL 8.0+ 相同值也会获得不同序号
RANK() 为分区内行分配排名(相同值同排名,留空位) SELECT name, score, RANK() OVER(ORDER BY score DESC) AS ranking FROM students; 如:1,2,2,4(并列第二后跳过3) MySQL 8.0+ 适用于竞赛排名场景
DENSE_RANK() 为分区内行分配排名(相同值同排名,不留空位) SELECT product, sales, DENSE_RANK() OVER(ORDER BY sales DESC) AS dense_rank FROM products; 如:1,2,2,3(并列第二后接着3) MySQL 8.0+ 适合连续排名需求
PERCENT_RANK() 计算行的相对排名百分比(范围0~1) SELECT name, score, PERCENT_RANK() OVER(ORDER BY score) AS percent FROM students; 最小值返回0,最大值返回1 MySQL 8.0+ 结果=(RANK-1)/(总行数-1)
CUME_DIST() 计算行的累积分布值(范围>0~≤1) SELECT name, salary, CUME_DIST() OVER(ORDER BY salary) AS cume FROM employees; 返回≤当前值的行数占比 MySQL 8.0+ 用于分析分布情况
NTILE(n) 将分区行分成n个桶并分配桶号 SELECT name, score, NTILE(4) OVER(ORDER BY score) AS quartile FROM students; 将数据分成4个等份并标记1-4 MySQL 8.0+ 常用于数据分箱分析
LAG(expr[,N[,default]]) 返回当前行前第N行的值 SELECT date, revenue, LAG(revenue,1,0) OVER(ORDER BY date) AS prev_revenue FROM sales; 显示前一天的收入值 MySQL 8.0+ 默认N=1,default=NULL
LEAD(expr[,N[,default]]) 返回当前行后第N行的值 SELECT month, sales, LEAD(sales,1) OVER(ORDER BY month) AS next_sales FROM stats; 显示下个月的销售额 MySQL 8.0+ 常用于比较相邻数据
FIRST_VALUE(expr) 返回窗口框架第一行的值 SELECT name, department, salary, FIRST_VALUE(salary) OVER(PARTITION BY department ORDER BY salary DESC) AS top_salary FROM emp; 显示各部门最高薪资 MySQL 8.0+ 常与窗口框架配合使用
LAST_VALUE(expr) 返回窗口框架最后一行的值 SELECT time, metric, LAST_VALUE(metric) OVER(ORDER BY time RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) FROM metrics; 需指定完整框架否则可能非预期 MySQL 8.0+ 通常需要显式指定窗口框架
NTH_VALUE(expr,N) 返回窗口框架第N行的值 SELECT name, score, NTH_VALUE(score,3) OVER(ORDER BY score DESC) AS third_highest FROM players; 返回第三高的分数 MySQL 8.0+ N必须为正整数

9. JSON处理函数(MySQL 5.7+)

专门用于JSON数据类型的操作
包括创建、查询、修改JSON数据

函数名 功能 语法示例 结果示例 版本适用 备注
JSON_ARRAY 创建JSON数组 SELECT JSON_ARRAY(1, "abc", NULL, TRUE) [1, "abc", null, true] MySQL 5.7+ 参数自动转为JSON类型
JSON_OBJECT 创建JSON对象 SELECT JSON_OBJECT('id', 87, 'name', 'carrot') {"id": 87, "name": "carrot"} MySQL 5.7+ 键值对数量需为偶数
JSON_ARRAY_APPEND 向数组追加值 SELECT JSON_ARRAY_APPEND('["a", "b"]', '$', 1) ["a", "b", 1] MySQL 5.7+ 支持多级路径
JSON_ARRAY_INSERT 向数组插入值 SELECT JSON_ARRAY_INSERT('["a", "b"]', '$[1]', "x") ["a", "x", "b"] MySQL 5.7+ 索引从0开始
JSON_CONTAINS 检查是否包含值 SELECT JSON_CONTAINS('{"a": 1, "b": 2}', '2', '$.b') 1 (true) MySQL 5.7+ 支持类型严格匹配
JSON_CONTAINS_PATH 检查路径是否存在 SELECT JSON_CONTAINS_PATH('{"a": 1}', 'one', '$.a') 1 (true) MySQL 5.7+ 'one’或’all’模式
JSON_EXTRACT 提取JSON值 SELECT JSON_EXTRACT('{"a": 1}', '$.a') 1 MySQL 5.7+ 等价于->操作符
​->​ 提取路径值 SELECT JSON_OBJECT('a',1)->'$.a' 1 MySQL 5.7+ 简化版JSON_EXTRACT
​->>​ 提取并取消引用 SELECT '{"a": "1"}'->>'$.a' 1 (字符串) MySQL 5.7+ 等价于UNQUOTE(JSON_EXTRACT())
JSON_KEYS 返回所有键 SELECT JSON_KEYS('{"a":1, "b":2}') ["a", "b"] MySQL 5.7+ 可指定路径
JSON_LENGTH 返回元素数量 SELECT JSON_LENGTH('[1, {"a":2}]') 2 MySQL 5.7+ 对象返回键值对数
JSON_MERGE 合并JSON文档 SELECT JSON_MERGE('[1,2]', '{"a":3}') [1, 2, {"a": 3}] MySQL 5.7+ 5.7.22后推荐用JSON_MERGE_PRESERVE
JSON_MERGE_PATCH 合并并替换重复键 SELECT JSON_MERGE_PATCH('{"a":1}', '{"b":2}') {"a":1, "b":2} MySQL 5.7+ RFC 7396标准
JSON_MERGE_PRESERVE 合并并保留重复键 SELECT JSON_MERGE_PRESERVE('{"a":1}', '{"a":2}') {"a": [1, 2]} MySQL 5.7+ 原JSON_MERGE的替代
JSON_REMOVE 删除指定数据 SELECT JSON_REMOVE('["a","b","c"]', '$[1]') ["a", "c"] MySQL 5.7+ 支持多路径删除
JSON_REPLACE 替换JSON值 SELECT JSON_REPLACE('{"a":1}', '$.a', 10) {"a": 10} MySQL 5.7+ 仅替换已存在路径
JSON_SET 设置JSON值 SELECT JSON_SET('{"a":1}', '$.b', 2) {"a":1, "b":2} MySQL 5.7+ 不存在路径则添加
JSON_UNQUOTE 去除JSON引号 SELECT JSON_UNQUOTE('"\\"Hello\\""') "Hello" MySQL 5.7+ 处理转义字符
JSON_DEPTH 返回最大深度 SELECT JSON_DEPTH('{"a":{"b":1}}') 3 MySQL 5.7+ 标量值为1
JSON_TYPE 返回JSON类型 SELECT JSON_TYPE('{"a":1}') OBJECT MySQL 5.7+ 返回类型字符串
JSON_VALID 验证JSON格式 SELECT JSON_VALID('{"a":1') 0 (false) MySQL 5.7+ 有效返回1
JSON_PRETTY 格式化输出 SELECT JSON_PRETTY('{"a":1}') 带缩进的JSON MySQL 5.7.22+ 人类可读格式
JSON_SEARCH 搜索值路径 SELECT JSON_SEARCH('{"a":1,"b":2}', 'one', 2) "$.b" MySQL 5.7+ 'one’或’all’模式
JSON_STORAGE_SIZE 返回存储字节数 SELECT JSON_STORAGE_SIZE('{"a":1}') 8 (字节) MySQL 5.7+ 实际存储大小
JSON_TABLE 转换JSON为表 SELECT * FROM JSON_TABLE('[1,2]', '$[*]' COLUMNS(id INT PATH '$')) 两行数据1和2 MySQL 8.0+ 需要8.0+版本

10. 空间数据处理函数

处理地理空间数据
包括几何对象创建、空间关系判断等

函数名 功能 语法示例 结果示例 版本适用 备注
ST_GeomFromText 将WKT格式文本转换为几何对象 SELECT ST_GeomFromText('POINT(1 1)'); 二进制几何对象 MySQL 5.6+ 别名:GeomFromText
ST_AsText 将几何对象转换为WKT格式文本 SELECT ST_AsText(ST_GeomFromText('POINT(1 1)')); ‘POINT(1 1)’ MySQL 5.6+ 别名:AsText
ST_Length 计算线串或多线串的长度 SELECT ST_Length(ST_GeomFromText('LINESTRING(0 0,1 1,2 2)')); 2.828(近似值) MySQL 5.6+ 对非线串返回0
ST_Area 计算多边形或多面体的面积 SELECT ST_Area(ST_GeomFromText('POLYGON((0 0,0 3,3 3,3 0,0 0))')); 9 MySQL 5.6+ 对非面几何返回0
ST_Buffer 生成指定距离的缓冲区几何 SELECT ST_AsText(ST_Buffer(ST_GeomFromText('POINT(1 1)'), 2)); 多边形近似圆形 MySQL 5.6+ 距离单位与SRID相关
ST_Contains 判断几何A是否完全包含几何B SELECT ST_Contains(ST_GeomFromText('POLYGON((0 0,0 3,3 3,3 0,0 0))'), ST_GeomFromText('POINT(1 1)')); 1(true) MySQL 5.6+ 边界情况返回false
ST_Distance 计算两个几何对象间的最短距离 SELECT ST_Distance(ST_GeomFromText('POINT(1 1)'), ST_GeomFromText('POINT(4 5)')); 5 MySQL 5.6+ 支持所有几何类型
ST_Intersects 判断几何对象是否相交 SELECT ST_Intersects(ST_GeomFromText('LINESTRING(0 0,3 3)'), ST_GeomFromText('LINESTRING(0 3,3 0)')); 1(true) MySQL 5.6+ 包括边界接触
ST_SRID 获取几何对象的空间参考系统ID SELECT ST_SRID(ST_GeomFromText('POINT(1 1)', 4326)); 4326 MySQL 5.6+ 未指定时返回0
ST_Transform 转换几何对象的坐标系统(需GIS支持) SELECT ST_Transform(ST_GeomFromText('POINT(1 1)', 4326), 3857); 转换后的几何对象 MySQL 5.7.6+ 需要PROJ4库支持
ST_IsValid 检查几何对象是否符合OGC标准 SELECT ST_IsValid(ST_GeomFromText('POLYGON((0 0,1 1,1 0,0 0))')); 0(false) MySQL 5.7.6+ 自闭合多边形返回false
ST_Simplify 简化几何对象(Douglas-Peucker算法) SELECT ST_Simplify(ST_GeomFromText('LINESTRING(0 0,1 1,2 2)'), 1.5); 简化后的线串 MySQL 5.7.6+ 容差参数控制简化程度
ST_Envelope 获取几何对象的最小边界矩形 SELECT ST_AsText(ST_Envelope(ST_GeomFromText('LINESTRING(1 1,2 2)'))); ‘POLYGON((1 1,2 1,2 2,1 2,1 1))’ MySQL 5.6+ 始终返回多边形
ST_Centroid 计算几何对象的质心 SELECT ST_AsText(ST_Centroid(ST_GeomFromText('POLYGON((0 0,0 3,3 3,3 0,0 0))'))); ‘POINT(1.5 1.5)’ MySQL 5.6+ 对点对象返回自身
ST_Union 合并多个几何对象 SELECT ST_AsText(ST_Union(ST_GeomFromText('POINT(1 1)'), ST_GeomFromText('POINT(2 2)'))); ‘MULTIPOINT((1 1),(2 2))’ MySQL 5.6+ 聚合函数版本可用

10. MySQL函数使用频率统计与建议

根据实际开发经验和数据库性能分析,MySQL各类函数的使用频率大致呈现以下分布:
​高频使用函数​:聚合函数和日期时间函数占据了约60%的使用场景,特别是在报表统计、数据分析等业务中几乎必不可少。其中COUNT()、SUM()、DATE_FORMAT()等函数几乎出现在每个中型以上项目的SQL中。
​中频使用函数​:字符串处理函数和数值函数约占30%的使用比例,这类函数在数据清洗、格式转换等场景频繁出现,但通常不会在核心业务逻辑中大量使用。
​低频使用函数​:窗口函数(8.0+)、JSON函数和空间函数虽然功能强大,但由于业务场景限制和专业性要求,目前仅占约10%的使用量,但随着复杂数据分析需求的增加,这类函数的使用率正在稳步上升。
值得注意的是,过度使用函数可能导致约15-20%的查询性能下降,特别是在大数据量表操作时。建议开发者在保证业务逻辑的前提下,合理使用函数,对于高频调用的复杂函数计算,可考虑在应用层实现或使用存储过程优化。

你可能感兴趣的:(mysql,数据库)