用于数学运算和数值处理
包括基本的算术运算、舍入、随机数生成等
函数名 | 功能 | 语法示例 | 结果示例 | 版本适用 | 备注 |
---|---|---|---|---|---|
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+ | 返回无符号整数 |
用于文本字符串的操作和处理
包括连接、截取、转换、搜索等字符串操作
函数名 | 功能 | 语法示例 | 结果示例 | 版本适用 | 备注 |
---|---|---|---|---|---|
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'); |
文件内容 | 所有版本 | 需要文件权限 |
用于处理日期和时间值
包括获取当前时间、提取日期部分、日期计算等
函数名 | 功能 | 语法示例 | 结果示例 | 版本适用 | 备注 |
---|---|---|---|---|---|
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 | 所有版本 |
对数据集进行汇总计算
通常与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处理函数 |
函数名 | 功能 | 语法示例 | 结果示例 | 版本适用 | 备注 |
---|---|---|---|---|---|
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不同,这是推荐的安全检测方式 |
实现条件判断和程序流控制 | |||||
包括条件表达式和分支逻辑 |
返回数据库系统和连接信息
包括版本、用户、连接状态等
函数名 | 功能 | 语法示例 | 结果示例 | 版本适用 | 备注 |
---|---|---|---|---|---|
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格式 |
提供数据安全性和存储优化功能
包括哈希算法、加密解密、数据压缩
函数名 | 功能 | 语法示例 | 结果示例 | 版本适用 | 备注 |
---|---|---|---|---|---|
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+ | 性能分析用 |
对结果集进行高级分析处理
包括排名、分窗、前后行访问等
函数名 | 功能 | 语法示例 | 结果示例 | 版本适用 | 备注 |
---|---|---|---|---|---|
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必须为正整数 |
专门用于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+版本 |
处理地理空间数据
包括几何对象创建、空间关系判断等
函数名 | 功能 | 语法示例 | 结果示例 | 版本适用 | 备注 |
---|---|---|---|---|---|
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+ | 聚合函数版本可用 |
根据实际开发经验和数据库性能分析,MySQL各类函数的使用频率大致呈现以下分布:
高频使用函数:聚合函数和日期时间函数占据了约60%的使用场景,特别是在报表统计、数据分析等业务中几乎必不可少。其中COUNT()、SUM()、DATE_FORMAT()等函数几乎出现在每个中型以上项目的SQL中。
中频使用函数:字符串处理函数和数值函数约占30%的使用比例,这类函数在数据清洗、格式转换等场景频繁出现,但通常不会在核心业务逻辑中大量使用。
低频使用函数:窗口函数(8.0+)、JSON函数和空间函数虽然功能强大,但由于业务场景限制和专业性要求,目前仅占约10%的使用量,但随着复杂数据分析需求的增加,这类函数的使用率正在稳步上升。
值得注意的是,过度使用函数可能导致约15-20%的查询性能下降,特别是在大数据量表操作时。建议开发者在保证业务逻辑的前提下,合理使用函数,对于高频调用的复杂函数计算,可考虑在应用层实现或使用存储过程优化。