Appearance
MySQL 内置函数和运算符
1. 基础
1.1. AND, &&, OR, ||, NOT, !
逻辑与:
SQL
SELECT TRUE AND FALSE; -- 返回 FALSE逻辑或运算:
SQL
SELECT (1 = 1) OR (0 = 1);逻辑非运算:
SQL
SELECT NOT (1 = 1);1.2. CAST(), CONVERT()
强制类型转换。
SQL
SELECT CAST('123' AS SIGNED); -- 返回 123SQL
SELECT CONVERT('123', SIGNED); -- 与 `CAST()` 类似。1.3. COALESCE()
返回首个非 NULL 值。
SQL
SELECT COALESCE(NULL, NULL, 'Hello'); -- 返回 'Hello'1.4. DEFAULT()
返回列的默认值。
Note:适用于
INSERT语句中的VALUES(DEFAULT)。
SQL
SELECT DEFAULT(col_name) FROM table_name;1.5. FIELD()
查找值在列表中的索引。
Note:索引从 1 开始。
SQL
SELECT FIELD('b', 'a', 'b', 'c');1.6. FIND_IN_SET()
查找值在逗号分隔字符串中的位置。
SQL
SELECT FIND_IN_SET('b', 'a,b,c');1.7. GREATEST(), LEAST()
Note:参数不能全为
NULL。
SQL
SELECT GREATEST(10, 20, 30); -- 返回最大值。
SELECT LEAST(10, 20, 30); -- 返回最小值。1.8. IF()
条件判断。
SQL
SELECT IF(1 > 0, 'YES', 'NO');1.9. IFNULL()
如果值为 NULL,则返回替代值。
SQL
SELECT IFNULL(NULL, 'default');1.10. IN()
判断值是否在集合中。
Note:返回
1(真)或0(假)。
SQL
SELECT 3 IN (1, 2, 3, 4);1.11. INTERVAL()
返回第一个参数小于某个参数的索引。
Note:返回
2。
SQL
SELECT INTERVAL(25, 10, 20, 30, 40);1.12. IS
测试值是否为布尔值。
Note:返回
1。
SQL
SELECT TRUE IS TRUE;1.13. IS NOT
测试值是否不为布尔值。
Note:返回
1。
SQL
SELECT FALSE IS NOT TRUE;1.14. IS NULL, IS NOT NULL, ISNULL()
判断值是否为 NULL:
Note:返回
0(假)或1(真)。
SQL
SELECT 1 IS NULL;
SELECT ISNULL(NULL); -- IS NULL 的同义词。测试值是否非 NULL:
SQL
SELECT 1 IS NOT NULL; -- 返回 1。1.15. LIKE
进行简单模式匹配。
SQL
SELECT 'hello' LIKE 'he%';1.16. LN()
计算参数的自然对数。
SQL
SELECT LN(2);1.17. NULLIF()
如果两个参数相等,则返回 NULL,否则返回第一个参数。
SQL
SELECT NULLIF(10, 10);2. 字符串
2.1. ASCII()
返回最左字符的 ASCII 值。
SQL
SELECT ASCII('A'); -- 返回 652.2. CHAR()
返回指定整数的字符。
SQL
SELECT CHAR(65); -- 返回 'A'2.3. CHAR_LENGTH(), CHARACTER_LENGTH()
返回字符串的字符数。
Note:
CHARACTER_LENGTH()是CHAR_LENGTH()的别名。
SQL
SELECT CHAR_LENGTH('Hello'); -- 返回 52.4. CHARSET()
返回字符串的字符集。
SQL
SELECT CHARSET('abc'); -- 可能返回 'utf8mb4'2.5. COERCIBILITY()
返回字符串的排序规则强制性值。
SQL
SELECT COERCIBILITY('test');2.6. COLLATION()
返回字符串的排序规则。
SQL
SELECT COLLATION('abc');2.7. COMPRESS(), UNCOMPRESS(), UNCOMPRESSED_LENGTH()
返回压缩的二进制字符串:
SQL
SELECT COMPRESS('Hello World');解压缩 COMPRESS() 生成的字符串:
SQL
SELECT UNCOMPRESS(COMPRESS('hello world'));返回字符串压缩前的长度:
SQL
SELECT UNCOMPRESSED_LENGTH(COMPRESS('hello world'));2.8. CONCAT()
连接字符串。
Note:如果
CONCAT的任何一个参数为NULL,则整个结果都会变为NULL。
SQL
SELECT CONCAT('Hello', ' ', 'World'); -- 返回 'Hello World'2.9. CONCAT_WS()
连接字符串并使用分隔符。
Note:自动忽略
NULL值。
SQL
SELECT CONCAT_WS(',', 'a', 'b', 'c'); -- 返回 'a,b,c'2.10. ELT()
返回指定索引的字符串。
Note:索引从 1 开始。
SQL
SELECT ELT(2, 'one', 'two', 'three');2.11. EXPORT_SET()
用于将一个整数的二进制位表示转换为一个由逗号分隔的字符串。它通常用于将位掩码(bitmask)转换为可读的字符串形式。
语法:
EBNF
"EXPORT_SET(" BITS "," ON "," OFF "," SEPARATOR "," NUMBER_OF_BITS ")"示例:
SQL
SELECT EXPORT_SET(5, 'Y', 'N', ',', 4);5的二进制表示为0101。从右到左解析每一位:
- 第 1 位:
1→Y - 第 2 位:
0→N - 第 3 位:
1→Y - 第 4 位:
0→N
- 第 1 位:
结果为:
Y,N,Y,N
2.12. FORMAT()
格式化数字。
SQL
SELECT FORMAT(1234.5678, 2);2.13. FORMAT_BYTES()
以单位格式化字节大小。
Note:适用于存储大小格式化。
SQL
SELECT FORMAT_BYTES(1048576);2.14. FORMAT_PICO_TIME()
将皮秒转换为可读时间。
Note:适用于超精确时间计算。
SQL
SELECT FORMAT_PICO_TIME(1234567890);2.15. ICU_VERSION()
返回 ICU 库的版本。
Note:适用于字符集处理。
SQL
SELECT ICU_VERSION();2.16. INSERT()
在指定位置插入子字符串。
SQL
SELECT INSERT('hello world', 7, 5, 'MySQL');2.17. INSTR(), LOCATE(), POSITION()
返回子字符串首次出现的位置,位置从 1 开始。
INSTR()语法:
EBNF"INSTR(" STR "," SUBSTR ")"示例:
SQLSELECT INSTR('hello world', 'world'); -- 返回 `7`。LOCATE(),POSITION()LOCATE(),POSITION()与INSTR()的功能非常相似,但在参数顺序和默认行为上有一些区别。语法:
EBNF"LOCATE(" SUBSTR "," STR ["," POS] ")"示例:
SQLSELECT LOCATE('b', 'abc'); SELECT POSITION('b' IN 'abc'); -- LOCATE() 的同义词。
2.18. LOWER(), LCASE(), UPPER(), UCASE()
将字符串转换为小写:
SQL
SELECT LOWER('HELLO'); -- 结果:hello
SELECT LCASE('HELLO'); -- LOWER() 的同义词将字符串转换为大写:
SQL
SELECT UPPER('hello'); -- 结果:HELLO
SELECT UCASE('hello'); -- UPPER() 的同义词2.19. LEFT(), RIGHT(), MID()
返回左侧指定长度的字符:
SQL
SELECT LEFT('hello', 2);返回字符串最右侧的指定字符数:
SQL
SELECT RIGHT('abcdef', 3);返回从指定位置开始的子字符串:
Note:
MID()是SUBSTR()与SUBSTRING()的别名。
SQL
SELECT MID('abcdef', 2, 3);2.20. LENGTH(), OCTET_LENGTH()
计算字符串的字节长度。
Note:UTF-8 下返回 6。
SQL
SELECT LENGTH('你好');
SELECT OCTET_LENGTH('hello'); -- LENGTH() 的同义词2.21. LPAD(), RPAD()
用指定字符串在左侧填充字符串:
SQL
SELECT LPAD('abc', 5, 'x');在字符串右侧填充指定字符:
SQL
SELECT RPAD('abc', 5, 'x');2.22. TRIM(), LTRIM(), RTRIM()
去除字符串首尾空格:
SQL
SELECT TRIM(' hello ');移除字符串左侧的空格:
SQL
SELECT LTRIM(' hello');移除字符串右侧的空格:
SQL
SELECT RTRIM('hello ');2.23. ORD()
返回字符串首字符的 ASCII/Unicode 编码。
SQL
SELECT ORD('A');2.24. QUOTE()
转义字符串以便用于 SQL 语句。
SQL
SELECT QUOTE("O'Reilly");2.25. REPEAT()
重复字符串指定次数。
SQL
SELECT REPEAT('abc', 3);2.26. REPLACE()
替换字符串中的子字符串。
SQL
SELECT REPLACE('hello world', 'world', 'everyone');2.27. REVERSE()
反转字符串。
SQL
SELECT REVERSE('abc');2.28. SPACE()
返回指定数量的空格字符串。
SQL
SELECT SPACE(5);2.29. STRCMP()
比较两个字符串。
SQL
SELECT STRCMP('abc', 'abd');2.30. SUBSTR(), SUBSTRING()
返回指定子字符串。
Note:
SUBSTR()、SUBSTRING()和MID()的功能完全相同,都可以用于截取字符串。SUBSTR()和SUBSTRING()是标准 SQL 函数,MID()是 MySQL 特有的函数。
SQL
SELECT SUBSTR('Hello World', 1, 5);
SELECT SUBSTRING('Hello World', 1, 5); -- 与 SUBSTR 相同2.31. SUBSTRING_INDEX()
返回字符串在指定分隔符出现次数前的部分。
SQL
SELECT SUBSTRING_INDEX('a,b,c,d', ',', 2);2.32. SOUNDEX()
返回字符串的 Soundex 代码(用于模糊匹配)。
SQL
SELECT SOUNDEX('hello');2.33. SOUNDS LIKE
进行 Soundex 比较。
SQL
SELECT 'hello' SOUNDS LIKE 'hallo';2.34. WEIGHT_STRING()
返回字符串的权重字符串(用于排序比较)。
Note:主要用于内部排序计算。
SQL
SELECT WEIGHT_STRING('hello');3. 数学
3.1. MOD
取模运算符。
SQL
SELECT 10 MOD 3; -- 返回 13.2. ABS()
返回绝对值。
SQL
SELECT ABS(-5); -- 返回 53.3. ACOS()
返回反余弦值。
Note:参数需在
-1到1之间。
SQL
SELECT ACOS(1); -- 返回 03.4. ASIN()
返回反正弦值。
Note:参数需在
-1到1之间。
SQL
SELECT ASIN(0.5); -- 返回 0.52363.5. ATAN()
返回反正切值。
SQL
SELECT ATAN(1); -- 返回 0.78543.6. ATAN2(), ATAN()
返回两个参数的反正切值。
SQL
SELECT ATAN2(1, 1); -- 返回 0.78543.7. CEIL(), CEILING()
返回大于或等于参数的最小整数。
SQL
SELECT CEIL(4.3); -- 返回 5
SELECT CEILING(4.3); -- CEIL() 的别名。3.8. COS()
返回余弦值。
Note:参数以弧度为单位。
SQL
SELECT COS(PI());3.9. COT()
返回余切值。
Note:参数不能为 0,否则会出错。
SQL
SELECT COT(PI()/4);3.10. DEGREES()
弧度转换为角度。
SQL
SELECT DEGREES(PI());3.11. DIV
整数除法。
Note:结果取整,舍去小数部分。
SQL
SELECT 10 DIV 3;3.12. EXP()
计算 e 的指数次幂。
SQL
SELECT EXP(1);3.13. FLOOR()
返回小于等于参数的最大整数。
SQL
SELECT FLOOR(4.7);3.14. LOG()
返回参数的自然对数。
SQL
SELECT LOG(10);3.15. LOG10()
返回参数的以 10 为底的对数。
SQL
SELECT LOG10(100);3.16. LOG2()
返回参数的以 2 为底的对数。
SQL
SELECT LOG2(8);3.17. MOD()
计算除法的余数。
SQL
SELECT MOD(10, 3);3.18. PI()
返回圆周率 π 的值。
SQL
SELECT PI();3.19. POW(), POWER()
返回第一个参数的 n 次幂。
SQL
SELECT POW(2, 3);
SELECT POWER(2, 3); -- POW() 的别名3.20. RADIANS()
将角度转换为弧度。
SQL
SELECT RADIANS(180);3.21. ROUND()
对数值进行四舍五入。
SQL
SELECT ROUND(3.14159, 2);3.22. SIN()
返回正弦值。
SQL
SELECT SIN(PI() / 2);3.23. TAN()
返回参数的正切值。
SQL
SELECT TAN(PI()/4);3.24. SIGN()
返回数值的符号(-1、0 或 1)。
SQL
SELECT SIGN(-10);3.25. SQRT()
返回平方根。
SQL
SELECT SQRT(25);3.26. TRUNCATE()
将数字截断到指定的小数位数。
Note:只去除小数部分,不进行四舍五入。
SQL
SELECT TRUNCATE(123.4567, 2); -- 结果:123.454. 时间
4.1. 获取
4.1.1. CURDATE(), CURRENT_DATE(), CURRENT_DATE
返回当前日期。
Note:仅返回日期,不含时间。
SQL
SELECT CURDATE();
SELECT CURRENT_DATE; -- CURDATE() 的同义词。4.1.2. CURTIME(), CURRENT_TIME(), CURRENT_TIME
返回当前时间。
Note:仅返回时间,不含日期。
SQL
SELECT CURTIME();
SELECT CURRENT_TIME(); -- CURTIME() 的同义词。4.1.3. NOW(), CURRENT_TIMESTAMP(), CURRENT_TIMESTAMP, LOCALTIME(), LOCALTIME, LOCALTIMESTAMP(), LOCALTIMESTAMP
返回当前日期和时间。
SQL
SELECT NOW();
SELECT CURRENT_TIMESTAMP(); -- NOW() 的同义词。
SELECT LOCALTIME(); -- NOW() 的同义词。
SELECT LOCALTIMESTAMP(); -- NOW() 的同义词。4.1.4. UTC_DATE(), UTC_TIME()
返回当前 UTC 日期:
SQL
SELECT UTC_DATE(); -- 可能返回:2024-02-07返回当前 UTC 时间:
SQL
SELECT UTC_TIME(); -- 可能返回:14:30:004.1.5. UTC_TIMESTAMP()
返回当前 UTC 日期和时间。
SQL
SELECT UTC_TIMESTAMP(); -- 可能返回:2024-02-07 14:30:004.1.6. UNIX_TIMESTAMP()
返回当前 Unix 时间戳(秒数)。
Note:结果是自
1970-01-01 00:00:00 UTC以来的秒数。
SQL
SELECT UNIX_TIMESTAMP();4.1.7. SYSDATE()
返回函数执行时的时间。
Note:可能与
NOW()不同,取决于执行时间。
SQL
SELECT SYSDATE();4.2. 创建
4.2.1. FROM_DAYS(), FROM_UNIXTIME()
将天数转换为日期:
SQL
SELECT FROM_DAYS(738500);将 Unix 时间戳转换为日期:
SQL
SELECT FROM_UNIXTIME(1707302400);4.2.2. MAKEDATE(), MAKETIME()
根据年份和一年中的天数创建日期:
SQL
SELECT MAKEDATE(2024, 31);根据小时、分钟、秒创建时间:
SQL
SELECT MAKETIME(12, 30, 45);4.2.3. STR_TO_DATE()
将字符串转换为日期。
SQL
SELECT STR_TO_DATE('2024-02-07', '%Y-%m-%d');4.2.4. SEC_TO_TIME(), TIME_TO_SEC()
将秒数转换为 'hh:mm:ss' 格式的时间:
SQL
SELECT SEC_TO_TIME(3661);将时间转换为秒数:
SQL
SELECT TIME_TO_SEC('01:30:00');4.2.5. TIMESTAMP()
返回时间戳。
SQL
SELECT TIMESTAMP('2024-02-07', '12:34:56');4.3. 计算
4.3.1. ADDDATE(), DATE_ADD(), SUBDATE(), DATE_SUB()
为日期添加时间值间隔:
SQL
SELECT ADDDATE('2024-02-01', INTERVAL 10 DAY);
SELECT DATE_ADD('2024-02-01', INTERVAL 10 DAY); -- ADDDATE() 的别名从日期减去时间间隔:
SQL
SELECT SUBDATE('2024-02-07', INTERVAL 3 DAY);
SELECT DATE_SUB('2024-02-07', INTERVAL 3 DAY); -- SUBDATE() 的别名4.3.2. DATEDIFF(), TIMEDIFF()
计算两个日期相差的天数(仅计算日期差,不考虑时间部分):
SQL
SELECT DATEDIFF('2024-12-31', '2024-01-01');计算时间差:
SQL
SELECT TIMEDIFF('12:00:00', '10:30:00');4.3.3. ADDTIME(), SUBTIME()
添加时间:
SQL
SELECT ADDTIME('12:00:00', '02:30:00'); -- 返回 14:30:00减去时间:
SQL
SELECT SUBTIME('12:00:00', '01:30:00');4.3.4. TIMESTAMPADD(), TIMESTAMPDIFF()
在时间表达式上加一个时间间隔:
SQL
SELECT TIMESTAMPADD(DAY, 7, '2024-02-07');计算两个时间戳的差值:
SQL
SELECT TIMESTAMPDIFF(DAY, '2024-02-01', '2024-02-07');4.3.5. PERIOD_ADD(), PERIOD_DIFF()
向 YEAR_MONTH 类型加上指定的月份。
SQL
SELECT PERIOD_ADD(202402, 2);返回两个 YEAR_MONTH 格式的时间相差的月份数。
SQL
SELECT PERIOD_DIFF(202402, 202310);4.4. 截取
4.4.1. DATE(), TIME()
提取日期部分:
SQL
SELECT DATE('2024-02-07 12:34:56');提取时间部分:
SQL
SELECT TIME('2024-02-07 12:34:56');4.4.2. MONTHNAME(), DAYNAME()
返回月份的名称。
SQL
SELECT MONTHNAME('2024-02-07');返回星期几名称:
SQL
SELECT DAYNAME('2024-02-07'); -- Wednesday4.4.3. YEAR(), QUARTER(), MONTH(), DAY()
返回日期中的年份:
SQL
SELECT YEAR('2024-02-07');返回日期所属的季度(1-4):
SQL
SELECT QUARTER('2024-02-07');返回日期中的月份数值:
SQL
SELECT MONTH('2024-02-07');返回日期中的天数 (1-31):
SQL
SELECT DAY('2024-02-07');4.4.4. HOUR(), MINUTE(), SECOND(), MICROSECOND()
提取小时:
SQL
SELECT HOUR('12:34:56');返回时间中的分钟部分:
SQL
SELECT MINUTE('12:30:45');返回时间的秒部分(0-59):
SQL
SELECT SECOND('12:30:45');返回时间或日期中的微秒部分:
SQL
SELECT MICROSECOND('12:30:45.123456');4.4.5. EXTRACT()
提取日期的部分信息:
SQL
SELECT EXTRACT(YEAR FROM '2024-02-07');4.5. 格式
4.5.1. CONVERT_TZ()
将时间从一个时区转换到另一个时区。
Note:需要时区数据支持,确保
mysql.time_zone表已填充。
SQL
SELECT CONVERT_TZ('2024-02-07 12:00:00', 'UTC', 'Asia/Shanghai');4.5.2. GET_FORMAT()
返回日期格式字符串(用于 DATE_FORMAT()):
SQL
SELECT GET_FORMAT(DATE, 'ISO');4.5.3. DATE_FORMAT()
按指定格式格式化日期:
SQL
SELECT DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%s');4.5.4. TIME_FORMAT()
以指定格式格式化时间:
SQL
SELECT TIME_FORMAT('12:34:56', '%H:%i');4.6. 换算
4.6.1. DAYOFYEAR(), DAYOFMONTH(), DAYOFWEEK()
返回一年中的第几天 (1-366):
SQL
SELECT DAYOFYEAR('2024-02-07'); -- 38返回日期中的天数 (1-31):
SQL
SELECT DAYOFMONTH('2024-02-07'); -- 7返回星期索引 (1=周日, 7=周六):
SQL
SELECT DAYOFWEEK('2024-02-07'); -- 44.6.2. WEEK(), WEEKOFYEAR()
返回日期的周数(0-53):
Note:默认周起始日为周日,可指定模式。
SQL
SELECT WEEK('2024-02-07'); -- 5返回年份中的周数(1-53):
SQL
SELECT WEEKOFYEAR('2024-02-07'); -- 64.6.3. WEEKDAY()
返回日期对应的工作日索引(0=周一, 6=周日)。
SQL
SELECT WEEKDAY('2024-02-07'); -- 2(表示周三)4.6.4. YEARWEEK()
返回年份和周数(格式:YYYYWW)。
SQL
SELECT YEARWEEK('2024-02-07'); -- 可能返回:2024054.6.5. TO_DAYS(), TO_SECONDS()
将日期转换为自公元 0 年以来的秒数。
SQL
SELECT TO_SECONDS('2024-02-07');将日期转换为天数。
SQL
SELECT TO_DAYS('2024-02-07');4.6.6. LAST_DAY()
获取指定日期所在月份的最后一天。
SQL
SELECT LAST_DAY('2024-02-15');5. 聚合函数
5.1. ANY_VALUE()
抑制 ONLY_FULL_GROUP_BY 规则下的值拒绝。
SQL
SELECT ANY_VALUE(name) FROM users GROUP BY sex;5.2. AVG()
返回平均值。
Note:只适用于数值列。
SQL
SELECT AVG(salary) FROM employees;5.3. COUNT()
返回行数。
Note:
NULL值不会被计数。
SQL
SELECT COUNT(*) FROM users;5.4. COUNT(DISTINCT)
返回不同值的数量。
Note:计算唯一值的数量。
SQL
SELECT COUNT(DISTINCT country) FROM users;5.5. GROUP_CONCAT()
返回连接的字符串。
Note:默认最大长度 1024,可调整。
SQL
SELECT GROUP_CONCAT(name) FROM users;5.6. GROUPING()
区分 ROLLUP 生成的聚合行和普通行。
Note:适用于
ROLLUP分组。
SQL
SELECT department, SUM(salary), GROUPING(department) FROM employees GROUP BY department WITH ROLLUP;5.7. MAX()
返回最大值。
SQL
SELECT MAX(salary) FROM employees;5.8. MIN()
返回最小值。
SQL
SELECT MIN(salary) FROM employees;5.9. STD()
返回总体标准差。
SQL
SELECT STD(some_column) FROM some_table;5.10. STDDEV()
返回总体标准差。
SQL
SELECT STDDEV(some_column) FROM some_table;5.11. STDDEV_POP()
返回总体标准差。
SQL
SELECT STDDEV_POP(some_column) FROM some_table;5.12. STDDEV_SAMP()
返回样本标准差。
SQL
SELECT STDDEV_SAMP(some_column) FROM some_table;5.13. SUM()
返回求和结果。
SQL
SELECT SUM(salary) FROM employees;5.14. VAR_POP(), VARIANCE()
返回总体方差。
SQL
SELECT VAR_POP(salary) FROM employees;
SELECT VARIANCE(salary) FROM employees; -- VAR_POP() 的别名5.15. VAR_SAMP()
返回样本方差。
SQL
SELECT VAR_SAMP(salary) FROM employees;6. 窗口函数
6.1. CUME_DIST()
计算累计分布值。
Note:适用于窗口函数。
SQL
SELECT CUME_DIST() OVER (ORDER BY salary) FROM employees;6.2. DENSE_RANK()
计算排名(无间隔)。
Note:适用于窗口函数。
SQL
SELECT name, salary, DENSE_RANK() OVER (ORDER BY salary DESC) FROM employees;6.3. FIRST_VALUE()
获取窗口内第一行的值。
Note:适用于窗口函数。
SQL
SELECT FIRST_VALUE(salary) OVER (ORDER BY id) FROM employees;6.4. LAG()
获取当前分区内前一行的值。
Note:适用于窗口函数。
SQL
SELECT LAG(salary) OVER (PARTITION BY dept ORDER BY id) FROM employees;6.5. LAST_VALUE()
获取窗口帧的最后一行值。
Note:适用于窗口函数。
SQL
SELECT LAST_VALUE(salary) OVER (ORDER BY id ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) FROM employees;6.6. LEAD()
获取当前分区内后一行的值。
Note:适用于窗口函数。
SQL
SELECT LEAD(salary) OVER (PARTITION BY dept ORDER BY id) FROM employees;6.7. NTH_VALUE()
返回窗口帧中第 N 行的值。
Note:适用于窗口函数。
SQL
SELECT NTH_VALUE(salary, 2) OVER (ORDER BY id) FROM employees;6.8. NTILE()
在窗口分区中划分桶编号。
SQL
SELECT NTILE(4) OVER (ORDER BY salary) FROM employees;6.9. PERCENT_RANK()
计算百分比排名。
Note:适用于窗口函数。
SQL
SELECT PERCENT_RANK() OVER (ORDER BY salary) FROM employees;6.10. RANK()
返回当前行在分区中的排名(存在跳跃排名)。
Note:适用于窗口函数。
SQL
SELECT RANK() OVER (ORDER BY salary DESC) FROM employees;6.11. ROW_NUMBER()
返回当前行的行号(无跳跃)。
Note:适用于窗口函数。
SQL
SELECT ROW_NUMBER() OVER (ORDER BY salary DESC) FROM employees;7. UUID
7.1. BIN_TO_UUID(), UUID_TO_BIN()
UUID 二进制与 UUID 字符串互相转换:
SQL
SELECT UUID_TO_BIN('550e8400-e29b-41d4-a716-446655440000');7.2. IS_UUID()
判断参数是否为有效的 UUID。
SQL
SELECT IS_UUID('550e8400-e29b-41d4-a716-446655440000');7.3. UUID()
生成通用唯一标识符(UUID)。
SQL
SELECT UUID(); -- 可能返回:550e8400-e29b-41d4-a716-4466554400007.4. UUID_SHORT()
生成短整数类型的 UUID。
Note:适用于高并发环境,保证唯一性。
SQL
SELECT UUID_SHORT();8. 位运算
8.1. BIN()
返回数字的二进制表示。
SQL
SELECT BIN(5); -- 返回 1018.2. BIT_AND()
按位与。
SQL
SELECT BIT_AND(5, 3); -- 返回 18.3. BIT_COUNT()
返回数值中设置为 1 的位数。
SQL
SELECT BIT_COUNT(7); -- 返回 38.4. BIT_LENGTH()
返回参数的位长度。
SQL
SELECT BIT_LENGTH('A'); -- 返回 88.5. BIT_OR()
按位或。
SQL
SELECT BIT_OR(5, 3); -- 返回 78.6. BIT_XOR()
按位异或。
SQL
SELECT BIT_XOR(5, 3); -- 返回 68.7. CONV()
在不同进制之间转换数值。
SQL
SELECT CONV('A', 16, 10); -- 返回 108.8. CRC32()
计算循环冗余校验值。
Note:适用于数据完整性校验。
SQL
SELECT CRC32('hello');8.9. HEX()
返回数值或字符串的十六进制表示。
SQL
SELECT HEX('abc');8.10. MAKE_SET()
根据位标志返回对应的字符串集合。
Note:
5的二进制是101,返回'a,c'。
SQL
SELECT MAKE_SET(5, 'a', 'b', 'c', 'd');8.11. OCT()
返回数字的八进制表示。
SQL
SELECT OCT(10);8.12. UNHEX()
将十六进制字符串转换为字符串。
Note:逆操作是
HEX()。
SQL
SELECT UNHEX('48656C6C6F'); -- 结果:Hello8.13. XOR
逻辑异或。
SQL
SELECT TRUE XOR FALSE; -- 结果:19. 加密
9.1. AES_DECRYPT()
使用 AES 解密。
Note:需与
AES_ENCRYPT()配合使用。
SQL
SELECT AES_DECRYPT(加密数据, '密钥');9.2. AES_ENCRYPT()
使用 AES 加密。
SQL
SELECT AES_ENCRYPT('Hello', '密钥');9.3. MD5()
计算字符串的 MD5 哈希值。
Note:不适用于密码存储(推荐
SHA2())。
SQL
SELECT MD5('hello');9.4. SHA1(), SHA()
计算 SHA-1 哈希值。
Note:不适用于密码存储(推荐
SHA2())。
SQL
SELECT SHA1('hello');9.5. SHA2()
计算 SHA-2 哈希值。
Note:推荐用于安全哈希。
SQL
SELECT SHA2('hello', 256);10. 正则
10.1. NOT REGEXP
进行正则匹配的否定。
SQL
SELECT 'hello' NOT REGEXP '^h.*o$';10.2. REGEXP, RLIKE
判断字符串是否匹配正则表达式。
SQL
SELECT 'abc' REGEXP '^a.*c$';
SELECT 'abc' RLIKE '^a.*c$'; -- REGEXP 的同义词。10.3. REGEXP_INSTR()
返回匹配正则表达式的子字符串起始位置。
SQL
SELECT REGEXP_INSTR('abc123', '[0-9]');10.4. REGEXP_LIKE()
判断字符串是否匹配正则表达式(REGEXP 的替代)。
SQL
SELECT REGEXP_LIKE('abc', '^a.*c$');10.5. REGEXP_REPLACE()
用正则表达式替换子字符串。
SQL
SELECT REGEXP_REPLACE('abc123', '[0-9]', 'X');10.6. REGEXP_SUBSTR()
返回匹配正则表达式的子字符串。
SQL
SELECT REGEXP_SUBSTR('abc123', '[0-9]+');11. XML
11.1. ExtractValue()
从 XML 中提取值。
Note:适用于 XML 处理。
SQL
SELECT ExtractValue('<a><b>5</b></a>', '/a/b');11.2. UpdateXML()
替换 XML 片段。
SQL
SELECT UpdateXML('<root><name>Old</name></root>', '/root/name', 'New');12. JSON
12.1. JSON_ARRAY()
创建 JSON 数组。
SQL
SELECT JSON_ARRAY(1, 'a', TRUE);12.2. JSON_ARRAY_APPEND()
在 JSON 文档中追加数据。
SQL
SELECT JSON_ARRAY_APPEND('[1, 2]', '$', 3);12.3. JSON_ARRAY_INSERT()
在 JSON 数组的指定位置插入数据。
SQL
SELECT JSON_ARRAY_INSERT('[1,2,3]', '$[1]', 99);12.4. JSON_ARRAYAGG()
将结果集作为单个 JSON 数组返回。
SQL
SELECT JSON_ARRAYAGG(name) FROM users;12.5. JSON_CONTAINS()
判断 JSON 文档是否包含指定对象。
SQL
SELECT JSON_CONTAINS('{"a":1, "b":2}', '{"a":1}');12.6. JSON_CONTAINS_PATH()
判断 JSON 文档在指定路径上是否包含数据。
SQL
SELECT JSON_CONTAINS_PATH('{"a":1, "b":2}', 'one', '$.a');12.7. JSON_DEPTH()
计算 JSON 文档的最大嵌套深度。
SQL
SELECT JSON_DEPTH('{"a": {"b": [1, 2, 3]}}');12.8. JSON_EXTRACT()
从 JSON 文档中提取数据。
SQL
SELECT JSON_EXTRACT('{"a":1, "b":2}', '$.a');12.9. JSON_INSERT()
在 JSON 文档中插入数据。
Note:如果路径存在,不会覆盖。
SQL
SELECT JSON_INSERT('{"a":1}', '$.b', 2);12.10. JSON_KEYS()
获取 JSON 文档的键数组。
SQL
SELECT JSON_KEYS('{"a":1, "b":2}');12.11. JSON_LENGTH()
计算 JSON 文档中的元素数量。
SQL
SELECT JSON_LENGTH('[1, 2, 3]');12.12. JSON_MERGE_PATCH()
合并 JSON 文档,覆盖重复键的值。
SQL
SELECT JSON_MERGE_PATCH('{"a":1}', '{"a":2, "b":3}');12.13. JSON_MERGE_PRESERVE()
合并 JSON 文档,保留重复键的值。
SQL
SELECT JSON_MERGE_PRESERVE('{"a":1}', '{"a":2, "b":3}');12.14. JSON_OBJECT()
创建 JSON 对象。
SQL
SELECT JSON_OBJECT('key1', 'value1', 'key2', 123);12.15. JSON_OBJECTAGG()
将结果集作为单个 JSON 对象返回。
SQL
SELECT JSON_OBJECTAGG(id, name) FROM users;12.16. JSON_OVERLAPS()
判断两个 JSON 文档是否有公共键值或数组元素。
SQL
SELECT JSON_OVERLAPS('{"a":1}', '{"a":2}');12.17. JSON_PRETTY()
以格式化方式打印 JSON 文档。
SQL
SELECT JSON_PRETTY('{"a":1, "b":{"c":2}}');12.18. JSON_QUOTE()
为 JSON 值加引号。
SQL
SELECT JSON_QUOTE('Hello');12.19. JSON_REMOVE()
从 JSON 文档中移除数据。
SQL
SELECT JSON_REMOVE('{"a":1, "b":2}', '$.b');12.20. JSON_REPLACE()
替换 JSON 文档中的值。
SQL
SELECT JSON_REPLACE('{"a":1}', '$.a', 99);12.21. JSON_SCHEMA_VALID()
验证 JSON 文档是否符合 JSON Schema。
SQL
SELECT JSON_SCHEMA_VALID('{"type": "object"}', '{"a":1}');12.22. JSON_SCHEMA_VALIDATION_REPORT()
生成 JSON Schema 校验报告。
SQL
SELECT JSON_SCHEMA_VALIDATION_REPORT('{"type": "object"}', '{"a":1}');12.23. JSON_SEARCH()
在 JSON 文档中查找值的路径。
SQL
SELECT JSON_SEARCH('[1,2,3,4]', 'one', 3);12.24. JSON_SET()
在 JSON 文档中插入或更新数据。
SQL
SELECT JSON_SET('{"a":1}', '$.b', 2);12.25. JSON_STORAGE_FREE()
获取 JSON 列在部分更新后释放的空间。
Note:适用于
JSON存储。
12.26. JSON_STORAGE_SIZE()
获取 JSON 文档的存储空间大小。
Note:适用于
JSON存储。
12.27. JSON_TABLE()
将 JSON 数据转换为关系表。
Note:适用于复杂查询。
12.28. JSON_TYPE()
获取 JSON 值的数据类型。
SQL
SELECT JSON_TYPE('{"a":1}');12.29. JSON_UNQUOTE()
取消 JSON 值的引号。
SQL
SELECT JSON_UNQUOTE('"Hello"');12.30. JSON_VALID()
判断 JSON 值是否有效。
SQL
SELECT JSON_VALID('{"a":1}');12.31. JSON_VALUE()
从 JSON 文档中提取值。
SQL
SELECT JSON_VALUE('{"a":1}', '$.a');12.32. MEMBER OF()
判断元素是否属于 JSON 数组。
Note:仅适用于 JSON 数组。
SQL
SELECT 3 MEMBER OF('[1, 2, 3, 4]');13. 网络
13.1. INET_ATON()
将 IP 地址转换为数值。
Note:适用于存储 IP 地址。
SQL
SELECT INET_ATON('192.168.1.1');13.2. INET_NTOA()
将数值转换为 IP 地址。
Note:适用于存储 IP 地址。
SQL
SELECT INET_NTOA(3232235777);14. 锁
14.1. GET_LOCK()
获取命名锁。
Note:需
RELEASE_LOCK()释放锁。
SQL
SELECT GET_LOCK('my_lock', 10);14.2. IS_FREE_LOCK()
判断命名锁是否空闲。
SQL
SELECT IS_FREE_LOCK('my_lock');14.3. IS_USED_LOCK()
判断命名锁是否正在使用,并返回连接 ID。
Note:如果未使用,返回
NULL。
SQL
SELECT IS_USED_LOCK('my_lock');14.4. RELEASE_ALL_LOCKS()
释放当前会话持有的所有锁。
SQL
SELECT RELEASE_ALL_LOCKS();14.5. RELEASE_LOCK()
释放指定的命名锁。
SQL
SELECT RELEASE_LOCK('my_lock');15. 其它
15.1. BENCHMARK()
重复执行表达式。
Note:仅用于性能测试。
SQL
SELECT BENCHMARK(1000000, 1+1);15.2. CONNECTION_ID()
返回当前连接 ID。
SQL
SELECT CONNECTION_ID();15.3. CURRENT_ROLE()
返回当前活动角色。
Note:适用于基于角色的访问控制。
SQL
SELECT CURRENT_ROLE();15.4. CURRENT_USER(), CURRENT_USER
返回当前用户和主机。
Note:可能与
USER()不同,后者显示当前会话用户。
SQL
SELECT CURRENT_USER();15.5. DATABASE(), SCHEMA()
返回当前数据库名称。
Note:若未使用数据库,则返回
NULL。
SQL
SELECT DATABASE();
SELECT SCHEMA(); -- DATABASE() 的同义词15.6. FOUND_ROWS()
返回 SELECT 语句的结果总行数。
Note:仅在
SQL_CALC_FOUND_ROWS语句后有效。
SQL
SELECT FOUND_ROWS();15.7. LAST_INSERT_ID()
获取 AUTO_INCREMENT 列的最后插入值。
Note:仅适用于当前会话。
SQL
SELECT LAST_INSERT_ID();15.8. LOAD_FILE()
读取文件内容。
Note:需启用
secure_file_priv。
SQL
SELECT LOAD_FILE('/path/to/file.txt');15.9. PS_CURRENT_THREAD_ID()
返回当前线程的 Performance Schema 线程 ID。
Note:需要启用 Performance Schema。
SQL
SELECT PS_CURRENT_THREAD_ID();15.10. PS_THREAD_ID()
返回指定线程的 Performance Schema 线程 ID。
Note:需要启用 Performance Schema。
SQL
SELECT PS_THREAD_ID(5);15.11. ROLES_GRAPHML()
以 GraphML 格式返回角色的子图。
Note:适用于权限管理。
SQL
SELECT ROLES_GRAPHML();15.12. ROW_COUNT()
返回上一条 SQL 语句影响的行数。
Note:适用于
UPDATE、DELETE、INSERT。
SQL
SELECT ROW_COUNT();15.13. RAND()
返回一个 0 到 1 之间的随机浮点数。
SQL
SELECT RAND();15.14. RANDOM_BYTES()
返回指定字节长度的随机字节序列。
Note:通常用于生成安全令牌。
SQL
SELECT RANDOM_BYTES(16);15.15. SLEEP()
使 SQL 线程暂停指定秒数。
Note:仅用于测试,谨慎使用。
SQL
SELECT SLEEP(2);15.16. USER(), SESSION_USER(), SYSTEM_USER()
返回当前用户及主机信息。
SQL
SELECT USER();
SELECT SESSION_USER(); -- USER() 的别名
SELECT SYSTEM_USER(); -- USER() 的别名15.17. VERSION()
返回 MySQL 服务器版本。
SQL
SELECT VERSION();