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 中提供的大部分其他函数。