TiDB函数
概述
TiDB 中函数和操作符使用方法与 MySQL 基本一致,详情参见: Functions and Operators
在 SQL 语句中,表达式可用于诸如 SELECT 语句的 ORDER BY 或 HAVING 子句,SELECT/DELETE/UPDATE 语句的 WHERE子句,或 SET 语句之类的地方。
表达式求值的类型转换
TiDB 中表达式求值的类型转换与 MySQL 基本一致,详情参见 MySQL 表达式求值的类型转换。
操作符
操作符 | 功能描述 |
AND, && | 逻辑与 |
= | 赋值 (可用于 SET 语句中, 或用于 UPDATE 语句的 SET 中 ) |
:= | 赋值 |
BETWEEN … AND … | 判断值满足范围 |
BINARY | 将一个字符串转换为一个二进制字符串 |
& | 位与 |
~ | 位非 |
\| | 位或 |
^ | 按位异或 |
CASE | case 操作符 |
DIV | 整数除 |
/ | 除法 |
= | 相等比较 |
<=> | 空值安全型相等比较 |
> | 大于 |
>= | 大于或等于 |
IS | 判断一个值是否等于一个布尔值 |
IS NOT | 判断一个值是否不等于一个布尔值 |
IS NOT NULL | 非空判断 |
IS NULL | 空值判断 |
<< | 左移 |
< | 小于 |
<= | 小于或等于 |
LIKE | 简单模式匹配 |
- | 减 |
%, MOD | 求余 |
NOT, ! | 取反 |
NOT BETWEEN … AND … | 判断值是否不在范围内 |
!=, <> | 不等于 |
NOT LIKE | 不符合简单模式匹配 |
NOT REGEXP | 不符合正则表达式模式匹配 |
||, OR | 逻辑或 |
+ | 加 |
REGEXP | 使用正则表达式进行模式匹配 |
>> | 右移 |
RLIKE REGEXP | 同义词 |
* | 乘 |
- | 取反符号 |
XOR | 逻辑亦或 |
操作符优先级
操作符优先级显示在以下列表中,从最高优先级到最低优先级。同一行显示的操作符具有相同的优先级。
控制流程函数
TiDB 支持使用 MySQL 5.7 中提供的所有控制流程函数。
函数名 | 功能描述 |
CASE | Case操作符 |
IF() | 构建if/else |
IFNULL() | 构建NUll if/else |
NULLIF() | 如果expr1 = expr2,返回NULL |
字符串函数
TiDB 支持使用 MySQL 5.7 中提供的大部分字符串函数。
支持的函数
函数名 | 功能描述 |
ASCII() | 返回最左字符的数值 |
BIN() | 返回一个数的二进制值的字符串表示 |
BIT_LENGTH() | 返回字符串的位长度 |
CHAR() | 返回由整数的代码值所给出的字符组成的字符串 |
CHAR_LENGTH() | 返回字符串的字符长度 |
CHARACTER_LENGTH() | 与 CHAR_LENGTH() 功能相同 |
CONCAT() | 返回连接的字符串 |
CONCAT_WS() | 返回由分隔符连接的字符串 |
ELT() | 返回指定位置的字符串 |
EXPORT_SET() | 返回一个字符串,其中值位中设置的每个位,可以得到一个 on 字符串,而每个未设置的位,可以得到一个 off 字符串 |
FIELD() | 返回参数在后续参数中出现的第一个位置 |
FIND_IN_SET() | 返回第一个参数在第二个参数中出现的位置 |
FORMAT() | 返回指定小数位数格式的数字 |
FROM_BASE64() | 解码 base-64 表示的字符串,并返回结果 |
HEX() | 返回一个十进制数或字符串值的 16 进制表示 |
INSERT() | 在指定位置插入一个子字符串,最多不超过指定字符数 |
INSTR() | 返回第一次出现的子字符串的索引 |
LCASE() | 与 LOWER() 功能相同 |
LEFT() | 返回最左侧指定长度的字符 |
LENGTH() | 返回字符串长度,单位为字节 |
LIKE | 进行简单模式匹配 |
LOCATE() | 返回第一次出现的子字符串的位置 |
LOWER() | 返回全小写的参数 |
LPAD() | 返回字符串参数,左侧添加指定字符串 |
LTRIM() | 去掉前缀空格 |
MAKE_SET() | 返回一组用逗号分隔的字符串,这些字符串的位数与给定的 bits 参数对应 |
MID() | 返回一个以指定位置开始的子字符串 |
NOT LIKE | 否定简单模式匹配 |
NOT REGEXP | REGEXP 的否定形式 |
OCT() | 返回一个数值的八进制表示,形式为字符串 |
OCTET_LENGTH() | 与 LENGTH() 功能相同 |
ORD() | 返回该参数最左侧字符的字符编码 |
POSITION() | 与 LOCATE() 功能相同 |
QUOTE() | 使参数逃逸,为了在 SQL 语句中使用 |
REGEXP | 使用正则表达式匹配模式 |
REPEAT() | 以指定次数重复一个字符串 |
REPLACE() | 替换所有出现的指定字符串 |
REVERSE() | 反转字符串里的所有字符 |
RIGHT() | 返回指定数量的最右侧的字符 |
RLIKE | 与 REGEXP 功能相同 |
RPAD() | 以指定次数添加字符串 |
RTRIM() | 去掉后缀空格 |
SPACE() | 返回指定数量的空格,形式为字符串 |
STRCMP() | 比较两个字符串 |
SUBSTR() | 返回指定的子字符串 |
SUBSTRING() | 返回指定的子字符串 |
SUBSTRING_INDEX() | 从一个字符串中返回指定出现次数的定界符之前的子字符串 |
TO_BASE64() | 返回转化为 base-64 表示的字符串参数 |
TRIM() | 去掉前缀和后缀空格 |
UCASE() | 与 UPPER() 功能相同 |
UNHEX() | 返回一个数的十六进制表示,形式为字符串 |
UPPER() | 参数转换为大写形式 |
不支持的函数
-
LOAD_FILE()
-
MATCH
-
SOUNDEX()
-
SOUNDS LIKE
-
WEIGHT_STRING()
数值函数与操作符
TiDB 支持使用 MySQL 5.7 中提供的所有数值函数与操作符。
算术操作符
操作符名 | 功能描述 |
+ | 加号 |
- | 减号 |
* | 乘号 |
/ | 除号 |
DIV | 整数除法 |
%, MOD | 模运算,取余 |
- | 更改参数符号 |
数学函数
函数名 | 功能描述 |
POW() | 返回参数的指定乘方的结果值 |
POWER() | 返回参数的指定乘方的结果值 |
EXP() | 返回 e(自然对数的底)的指定乘方后的值 |
SQRT() | 返回非负数的二次方根 |
LN() | 返回参数的自然对数 |
LOG() | 返回第一个参数的自然对数 |
LOG2() | 返回参数以 2 为底的对数 |
LOG10() | 返回参数以 10 为底的对数 |
PI() | 返回 pi 的值 |
TAN() | 返回参数的正切值 |
COT() | 返回参数的余切值 |
SIN() | 返回参数的正弦值 |
COS() | 返回参数的余弦值 |
ATAN() | 返回参数的反正切值 |
ATAN2(), ATAN() | 返回两个参数的反正切值 |
ASIN() | 返回参数的反正弦值 |
ACOS() | 返回参数的反余弦值 |
RADIANS() | 返回由度转化为弧度的参数 |
DEGREES() | 返回由弧度转化为度的参数 |
MOD() | 返回余数 |
ABS() | 返回参数的绝对值 |
CEIL() | 返回不小于参数的最小整数值 |
CEILING() | 返回不小于参数的最小整数值 |
FLOOR() | 返回不大于参数的最大整数值 |
ROUND() | 返回参数最近似的整数或指定小数位数的数值 |
RAND() | 返回一个随机浮点值 |
SIGN() | 返回参数的符号 |
CONV() | 不同数基间转换数字,返回数字的字符串表示 |
TRUNCATE() | 返回被舍位至指定小数位数的数字 |
CRC32() | 计算循环冗余码校验值并返回一个 32 位无符号值 |
日期和时间函数
函数名 | 功能描述 |
ADDDATE() | 将时间间隔添加到日期上 |
ADDTIME() | 时间数值相加 |
CONVERT_TZ() | 转换时区 |
CURDATE() | 返回当前日期 |
CURRENT_DATE(), CURRENT_DATE | 与 CURDATE() 同义 |
CURRENT_TIME(), CURRENT_TIME | 与 CURTIME() 同义 |
CURRENT_TIMESTAMP(), CURRENT_TIMESTAMP | 与 NOW() 同义 |
CURTIME() | 返回当前时间 |
DATE() | 从日期或日期/时间表达式中提取日期部分 |
DATE_ADD() | 将时间间隔添加到日期上 |
DATE_FORMAT() | 返回满足指定格式的日期/时间 |
DATE_SUB() | 从日期减去指定的时间间隔 |
DATEDIFF() | 返回两个日期间隔的天数 |
DAY() | 与 DAYOFMONTH() 同义 |
DAYNAME() | 返回星期名称 |
DAYOFMONTH() | 返回参数对应的天数部分(1-31) |
DAYOFWEEK() | 返回参数对应的星期下标 |
DAYOFYEAR() | 返回参数代表一年的哪一天 (1-366) |
EXTRACT() | 提取日期/时间中的单独部分 |
FROM_DAYS() | 将天数转化为日期 |
FROM_UNIXTIME() | 将 Unix 时间戳格式化为日期 |
GET_FORMAT() | 返回满足日期格式的字符串 |
HOUR() | 提取日期/时间表达式中的小时部分 |
LAST_DAY | 返回参数中月份的最后一天 |
LOCALTIME(), LOCALTIME | 与 NOW() 同义 |
LOCALTIMESTAMP, LOCALTIMESTAMP() | 与 NOW() 同义 |
MAKEDATE() | 根据给定的年份和一年中的天数生成一个日期 |
MAKETIME() | 根据给定的时、分、秒生成一个时间 |
MICROSECOND() | 返回参数的微秒部分 |
MINUTE() | 返回参数的分钟部分 |
MONTH() | 返回参数的月份部分 |
MONTHNAME() | 返回参数的月份名称 |
NOW() | 返回当前日期和时间 |
PERIOD_ADD() | 在年-月表达式上添加一段时间(数个月) |
PERIOD_DIFF() | 返回间隔的月数 |
QUARTER() | 返回参数对应的季度(1-4) |
SEC_TO_TIME() | 将秒数转化为 ‘HH:MM:SS’ 的格式 |
SECOND() | 返回秒数(0-59) |
STR_TO_DATE() | 将字符串转化为日期 |
SUBDATE() | 当传入三个参数时作为 DATE_SUB() 的同义 |
SUBTIME() | 从一个时间中减去一段时间 |
SYSDATE() | 返回该方法执行时的时间 |
TIME() | 返回参数的时间表达式部分 |
TIME_FORMAT() | 格式化时间 |
TIME_TO_SEC() | 返回参数对应的秒数 |
TIMEDIFF() | 返回时间间隔 |
TIMESTAMP() | 传入一个参数时候,该方法返回日期或日期/时间表达式, 传入两个参数时候, 返回参数的和 |
TIMESTAMPADD() | 在日期/时间表达式上增加一段时间间隔 |
TIMESTAMPDIFF() | 从日期/时间表达式中减去一段时间间隔 |
TO_DAYS() | 将参数转化对应的天数(从第 0 年开始) |
TO_SECONDS() | 将日期或日期/时间参数转化为秒数(从第 0 年开始) |
UNIX_TIMESTAMP() | 返回一个 Unix 时间戳 |
UTC_DATE() | 返回当前的 UTC 日期 |
UTC_TIME() | 返回当前的 UTC 时间 |
UTC_TIMESTAMP() | 返回当前的 UTC 日期和时间 |
WEEK() | 返回参数所在的一年中的星期数 |
WEEKDAY() | 返回星期下标 |
WEEKOFYEAR() | 返回参数在日历中对应的一年中的星期数 |
YEAR() | 返回参数对应的年数 |
YEARWEEK() | 返回年数和星期数 |
GROUP BY 聚合函数
TiDB 支持的 MySQL GROUP BY 聚合函数如下所示:
函数名 | 功能描述 |
COUNT() | 返回检索到的行的数目 |
COUNT(DISTINCT) | 返回不同值的数目 |
SUM() | 返回和 |
AVG() | 返回平均值 |
MAX() | 返回最大值 |
MIN() | 返回最小值 |
GROUP_CONCAT() | 返回连接的字符串 |
注意:
-
除非另有说明,否则聚合函数默认忽略 NULL 值。
-
如果在不包含 GROUP BY 子句的语句中使用聚合函数,则相当于对所有行进行分组。
GROUP BY 修饰符
TiDB 目前不支持 GROUP BY 修饰符,例如 WITH ROLLUP。
窗口函数
TiDB 中窗口函数的使用方法与 MySQL 8.0 基本一致,详情可参见MySQL 窗口函数。
TiDB 支持的窗口函数如下所示:
函数名 | 功能描述 |
CUME_DIST() | 返回一组值中的累积分布 |
DENSE_RANK() | 返回分区中当前行的排名,并且排名是连续的 |
FIRST_VALUE() | 当前窗口中第一行的表达式值 |
LAG() | 分区中当前行前面第 N 行的表达式值 |
LAST_VALUE() | 当前窗口中最后一行的表达式值 |
LEAD() | 分区中当前行后面第 N 行的表达式值 |
NTH_VALUE() | 当前窗口中第 N 行的表达式值 |
NTILE() | 将分区划分为 N 桶,为分区中的每一行分配桶号 |
PERCENT_RANK() | 返回分区中小于当前行的百分比 |
RANK() | 返回分区中当前行的排名,排名可能不连续 |
ROW_NUMBER() | 返回分区中当前行的编号 |
其他函数
TiDB 支持使用 MySQL 5.7 中提供的大部分其他函数。