函数和运算符 (一)
表达式可用于 SQL 语句中的多个点,例如 SELECT 语句的 ORDER BY 或 HAVING 子句,SELECT、DELETE 或 UPDATE 语句的 WHERE 子句或 SET 语句。 可以使用来自多个来源的值来编写表达式,例如文字值、列值、NULL、变量、内置函数和运算符、可加载函数和存储函数(一种存储对象)。
本章描述了允许在 MySQL 中编写表达式的内置函数和运算符。
除非在特定函数或运算符的文档中另有说明,否则包含 NULL 的表达式始终会生成 NULL 值。
笔记
默认情况下,函数名和它后面的括号之间不能有空格。 这有助于 MySQL 解析器区分函数调用和对碰巧与函数同名的表或列的引用。 但是,允许函数参数周围有空格。
通过使用 --sql-mode=IGNORE_SPACE 选项来告诉 MySQL 服务器接受函数名后的空格。单个客户端程序可以通过使用 mysql_real_connect() 的 CLIENT_IGNORE_SPACE 选项来请求此行为。 在任何一种情况下,所有函数名都成为保留字。
为简洁起见,本章中的一些示例以缩写形式显示mysql程序的输出。而不是以这种格式显示示例:
mysql> SELECT MOD(29,9);
+-----------+
| mod(29,9) |
+-----------+
| 2 |
+-----------+
1 rows in set (0.00 sec)
改为使用此格式:
mysql> SELECT MOD(29,9);
-> 2
12.1 内置函数和运算符参考
下表列出了每个内置(本机)函数和运算符,并提供了每个的简短描述。
表 12.1 内置函数和运算符
名称 | 描述 | 介绍 | 已弃用 |
---|---|---|---|
& | 按位与 | ||
> | 大于运算符 | ||
>> | 右移 | ||
>= | 大于或等于运算符 | ||
< | 小于运算符 | ||
<>,!= | 不等于运算符 | ||
<< | 左移 | ||
<= | 小于或等于运算符 | ||
<=> | NULL 安全等于运算符 | ||
%,MOD | 模运算符 | ||
* | 乘法运算符 | ||
+ | 加法运算符 | ||
- | 减号运算符 | ||
- | 更改参数的符号 | ||
-> | 评估路径后从 JSON 列返回值;相当于 JSON_EXTRACT()。 | ||
->> | 评估路径并取消引用结果后从 JSON 列返回值;相当于 JSON_UNQUOTE(JSON_EXTRACT())。 | ||
/ | 分区运算符 | ||
:= | 赋值 | ||
= | 赋值(作为 SET 语句的一部分,或作为语句中SET子句的 一部分UPDATE) | ||
= | 等号运算符 | ||
^ | 按位异或 | ||
ABS() | 返回绝对值 | ||
ACOS() | 返回反余弦 | ||
ADDDATE() | 将时间值(间隔)添加到日期值 | ||
ADDTIME() | 添加时间 | ||
AES_DECRYPT() | 使用 AES 解密 | ||
AES_ENCRYPT() | 使用 AES 加密 | ||
AND,&& | 逻辑与 | ||
ANY_VALUE() | 禁止 ONLY_FULL_GROUP_BY 值拒绝 | ||
ASCII() | 返回最左边字符的数值 | ||
ASIN() | 返回反正弦 | ||
ATAN() | 返回反正切 | ||
ATAN2(),ATAN() | 返回两个参数的反正切 | ||
AVG() | 返回参数的平均值 | ||
BENCHMARK() | 重复执行一个表达式 | ||
BETWEEN … AND … | 一个值是否在一个值范围内 | ||
BIN() | 返回一个包含数字二进制表示的字符串 | ||
BIN_TO_UUID() | 将二进制 UUID 转换为字符串 | ||
BINARY | 将字符串转换为二进制字符串 | 8.0.27 | |
BIT_AND() | 按位返回 AND | ||
BIT_COUNT() | 返回设置的位数 | ||
BIT_LENGTH() | 返回参数的长度(以位为单位) | ||
BIT_OR() | 按位或返回 | ||
BIT_XOR() | 返回按位异或 | ||
CAN_ACCESS_COLUMN() | 限内部使用 | ||
CAN_ACCESS_DATABASE() | 限内部使用 | ||
CAN_ACCESS_TABLE() | 限内部使用 | ||
CAN_ACCESS_USER() | 限内部使用 | 8.0.22 | |
CAN_ACCESS_VIEW() | 限内部使用 | ||
CASE | 案例操作员 | ||
CAST() | 将值转换为特定类型 | ||
CEIL() | 返回不小于参数的最小整数值 | ||
CEILING() | 返回不小于参数的最小整数值 | ||
CHAR() | 返回传递的每个整数的字符 | ||
CHAR_LENGTH() | 返回参数中的字符数 | ||
CHARACTER_LENGTH() | CHAR_LENGTH() 的同义词 | ||
CHARSET() | 返回参数的字符集 | ||
COALESCE() | 返回第一个非 NULL 参数 | ||
COERCIBILITY() | 返回字符串参数的排序规则强制值 | ||
COLLATION() | 返回字符串参数的排序规则 | ||
COMPRESS() | 以二进制字符串形式返回结果 | ||
CONCAT() | 返回连接的字符串 | ||
CONCAT_WS() | 返回与分隔符连接 | ||
CONNECTION_ID() | 返回连接的连接 ID(线程 ID) | ||
CONV() | 在不同数字基数之间转换数字 | ||
CONVERT() | 将值转换为特定类型 | ||
CONVERT_TZ() | 从一个时区转换到另一个时区 | ||
COS() | 返回余弦 | ||
COT() | 返回余切 | ||
COUNT() | 返回返回的行数 | ||
COUNT(DISTINCT) | 返回多个不同值的计数 | ||
CRC32() | 计算循环冗余校验值 | ||
CUME_DIST() | 累计分配值 | ||
CURDATE() | 返回当前日期 | ||
CURRENT_DATE(),CURRENT_DATE | CURDATE() 的同义词 | ||
CURRENT_ROLE() | 返回当前活跃的角色 | ||
CURRENT_TIME(),CURRENT_TIME | CURTIME() 的同义词 | ||
CURRENT_TIMESTAMP(),CURRENT_TIMESTAMP | NOW() 的同义词 | ||
CURRENT_USER(),CURRENT_USER | 认证的用户名和主机名 | ||
CURTIME() | 返回当前时间 | ||
DATABASE() | 返回默认(当前)数据库名称 | ||
DATE() | 提取日期或日期时间表达式的日期部分 | ||
DATE_ADD() | 将时间值(间隔)添加到日期值 | ||
DATE_FORMAT() | 按指定格式日期 | ||
DATE_SUB() | 从日期中减去时间值(间隔) | ||
DATEDIFF() | 减去两个日期 | ||
DAY() | DAYOFMONTH() 的同义词 | ||
DAYNAME() | 返回工作日的名称 | ||
DAYOFMONTH() | 返回月份中的第几天 (0-31) | ||
DAYOFWEEK() | 返回参数的工作日索引 | ||
DAYOFYEAR() | 返回一年中的某一天 (1-366) | ||
DEFAULT() | 返回表列的默认值 | ||
DEGREES() | 将弧度转换为度 | ||
DENSE_RANK() | 当前行在其分区内的排名,没有间隙 | ||
DIV | 整数除法 | ||
ELT() | 返回索引号处的字符串 | ||
EXP() | 提升到权力 | ||
EXPORT_SET() | 返回一个字符串,这样对于值位中设置的每个位,都会得到一个 on 字符串,对于每个未设置的位,都会得到一个 off 字符串 | ||
EXTRACT() | 提取日期的一部分 | ||
ExtractValue() | 使用 XPath 表示法从 XML 字符串中提取值 | ||
FIELD() | 后续参数中第一个参数的索引(位置) | ||
FIND_IN_SET() | 第二个参数中第一个参数的索引(位置) | ||
FIRST_VALUE() | 窗口框架第一行的参数值 | ||
FLOOR() | 返回不大于参数的最大整数值 | ||
FORMAT() | 返回格式化为指定小数位数的数字 | ||
FORMAT_BYTES() | 将字节数转换为单位值 | 8.0.16 | |
FORMAT_PICO_TIME() | 以皮秒为单位将时间转换为单位值 | 8.0.16 | |
FOUND_ROWS() | 对于带有 LIMIT 子句的 SELECT,如果没有 LIMIT 子句,将返回的行数 | ||
FROM_BASE64() | 解码base64编码字符串并返回结果 | ||
FROM_DAYS() | 将天数转换为日期 | ||
FROM_UNIXTIME() | 将 Unix 时间戳格式化为日期 | ||
GeomCollection() | 从几何构造几何集合 | ||
GeometryCollection() | 从几何构造几何集合 | ||
GET_DD_COLUMN_PRIVILEGES() | 限内部使用 | ||
GET_DD_CREATE_OPTIONS() | 限内部使用 | ||
GET_DD_INDEX_SUB_PART_LENGTH() | 限内部使用 | ||
GET_FORMAT() | 返回日期格式字符串 | ||
GET_LOCK() | 获取命名锁 | ||
GREATEST() | 返回最大的参数 | ||
GROUP_CONCAT() | 返回一个连接的字符串 | ||
GROUPING() | 将超级聚合 ROLLUP 行与常规行区分开来 | ||
GTID_SUBSET() | 如果子集中的所有 GTID 也在集合中,则返回 true;否则为假。 | ||
GTID_SUBTRACT() | 返回集合中所有不在子集中的 GTID。 | ||
HEX() | 十进制或字符串值的十六进制表示 | ||
HOUR() | 提取小时 | ||
ICU_VERSION() | ICU图书馆版本 | ||
IF() | if/else 构造 | ||
IFNULL() | 空 if/else 构造 | ||
IN() | 一个值是否在一组值内 | ||
INET_ATON() | 返回 IP 地址的数值 | ||
INET_NTOA() | 从数值返回 IP 地址 | ||
INET6_ATON() | 返回 IPv6 地址的数值 | ||
INET6_NTOA() | 从数值返回 IPv6 地址 | ||
INSERT() | 在指定位置插入子字符串,最多指定字符数 | ||
INSTR() | 返回子字符串第一次出现的索引 | ||
INTERNAL_AUTO_INCREMENT() | 限内部使用 | ||
INTERNAL_AVG_ROW_LENGTH() | 限内部使用 | ||
INTERNAL_CHECK_TIME() | 限内部使用 | ||
INTERNAL_CHECKSUM() | 限内部使用 | ||
INTERNAL_DATA_FREE() | 限内部使用 | ||
INTERNAL_DATA_LENGTH() | 限内部使用 | ||
INTERNAL_DD_CHAR_LENGTH() | 限内部使用 | ||
INTERNAL_GET_COMMENT_OR_ERROR() | 限内部使用 | ||
INTERNAL_GET_ENABLED_ROLE_JSON() | 限内部使用 | 8.0.19 | |
INTERNAL_GET_HOSTNAME() | 限内部使用 | 8.0.19 | |
INTERNAL_GET_USERNAME() | 限内部使用 | 8.0.19 | |
INTERNAL_GET_VIEW_WARNING_OR_ERROR() | 限内部使用 | ||
INTERNAL_INDEX_COLUMN_CARDINALITY() | 限内部使用 | ||
INTERNAL_INDEX_LENGTH() | 限内部使用 | ||
INTERNAL_IS_ENABLED_ROLE() | 限内部使用 | 8.0.19 | |
INTERNAL_IS_MANDATORY_ROLE() | 限内部使用 | 8.0.19 | |
INTERNAL_KEYS_DISABLED() | 限内部使用 | ||
INTERNAL_MAX_DATA_LENGTH() | 限内部使用 | ||
INTERNAL_TABLE_ROWS() | 限内部使用 | ||
INTERNAL_UPDATE_TIME() | 限内部使用 | ||
INTERVAL() | 返回小于第一个参数的参数的索引 | ||
IS | 根据布尔值测试值 | ||
IS_FREE_LOCK() | 命名锁是否空闲 | ||
IS_IPV4() | 参数是否为 IPv4 地址 | ||
IS_IPV4_COMPAT() | 参数是否为 IPv4 兼容地址 | ||
IS_IPV4_MAPPED() | 参数是否为 IPv4 映射地址 | ||
IS_IPV6() | 参数是否为 IPv6 地址 | ||
IS NOT | 根据布尔值测试值 | ||
IS NOT NULL | NOT NULL 值测试 | ||
IS NULL | 空值测试 | ||
IS_USED_LOCK() | 命名锁是否在使用中;如果为真,则返回连接标识符 | ||
IS_UUID() | 参数是否是有效的 UUID | ||
ISNULL() | 测试参数是否为 NULL | ||
JSON_ARRAY() | 创建 JSON 数组 | ||
JSON_ARRAY_APPEND() | 将数据附加到 JSON 文档 | ||
JSON_ARRAY_INSERT() | 插入 JSON 数组 | ||
JSON_ARRAYAGG() | 将结果集作为单个 JSON 数组返回 | ||
JSON_CONTAINS() | JSON 文档是否在路径中包含特定对象 | ||
JSON_CONTAINS_PATH() | JSON 文档是否包含路径中的任何数据 | ||
JSON_DEPTH() | JSON 文档的最大深度 | ||
JSON_EXTRACT() | 从 JSON 文档返回数据 | ||
JSON_INSERT() | 将数据插入 JSON 文档 | ||
JSON_KEYS() | JSON 文档中的键数组 | ||
JSON_LENGTH() | JSON 文档中的元素数 | ||
JSON_MERGE() | 合并 JSON 文档,保留重复键。JSON_MERGE_PRESERVE() 的弃用同义词 | 是的 | |
JSON_MERGE_PATCH() | 合并 JSON 文档,替换重复键的值 | ||
JSON_MERGE_PRESERVE() | 合并 JSON 文档,保留重复键 | ||
JSON_OBJECT() | 创建 JSON 对象 | ||
JSON_OBJECTAGG() | 将结果集作为单个 JSON 对象返回 | ||
JSON_OVERLAPS() | 比较两个 JSON 文档,如果它们有任何共同的键值对或数组元素,则返回 TRUE (1),否则返回 FALSE (0) | 8.0.17 | |
JSON_PRETTY() | 以人类可读的格式打印 JSON 文档 | ||
JSON_QUOTE() | 引用 JSON 文档 | ||
JSON_REMOVE() | 从 JSON 文档中删除数据 | ||
JSON_REPLACE() | 替换 JSON 文档中的值 | ||
JSON_SCHEMA_VALID() | 根据 JSON 模式验证 JSON 文档;如果文档根据架构验证,则返回 TRUE/1,否则返回 FALSE/0 | 8.0.17 | |
JSON_SCHEMA_VALIDATION_REPORT() | 根据 JSON 模式验证 JSON 文档;返回 JSON 格式的关于验证结果的报告,包括成功或失败以及失败的原因 | 8.0.17 | |
JSON_SEARCH() | JSON 文档中值的路径 | ||
JSON_SET() | 将数据插入 JSON 文档 | ||
JSON_STORAGE_FREE() | 部分更新后在 JSON 列值的二进制表示中释放空间 | ||
JSON_STORAGE_SIZE() | 用于存储 JSON 文档的二进制表示的空间 | ||
JSON_TABLE() | 从 JSON 表达式返回数据作为关系表 | ||
JSON_TYPE() | JSON 值的类型 | ||
JSON_UNQUOTE() | 取消引用 JSON 值 | ||
JSON_VALID() | JSON值是否有效 | ||
JSON_VALUE() | 从提供的路径指向的位置的 JSON 文档中提取值;将此值作为 VARCHAR(512) 或指定类型返回 | 8.0.21 | |
LAG() | 来自分区内滞后当前行的行的参数值 | ||
LAST_DAY | 返回参数的月份的最后一天 | ||
LAST_INSERT_ID() | 最后一个 INSERT 的 AUTOINCREMENT 列的值 | ||
LAST_VALUE() | 窗口框架最后一行的参数值 | ||
LCASE() | LOWER() 的同义词 | ||
LEAD() | 分区内行前导当前行的参数值 | ||
LEAST() | 返回最小的参数 | ||
LEFT() | 返回指定的最左边的字符数 | ||
LENGTH() | 返回字符串的长度(以字节为单位) | ||
LIKE | 简单的模式匹配 | ||
LineString() | 从点值构造 LineString | ||
LN() | 返回参数的自然对数 | ||
LOAD_FILE() | 加载命名文件 | ||
LOCALTIME(),LOCALTIME | 现在()的同义词 | ||
LOCALTIMESTAMP,LOCALTIMESTAMP() | 现在()的同义词 | ||
LOCATE() | 返回子字符串第一次出现的位置 | ||
LOG() | 返回第一个参数的自然对数 | ||
LOG10() | 返回参数的以 10 为底的对数 | ||
LOG2() | 返回参数的以 2 为底的对数 | ||
LOWER() | 以小写形式返回参数 | ||
LPAD() | 返回字符串参数,左填充指定的字符串 | ||
LTRIM() | 删除前导空格 | ||
MAKE_SET() | 返回一组逗号分隔的字符串,这些字符串在 bits 集中具有相应的位 | ||
MAKEDATE() | 根据年份和日期创建日期 | ||
MAKETIME() | 从小时、分钟、秒创建时间 | ||
MASTER_POS_WAIT() | 阻塞直到副本读取并应用所有更新到指定位置 | 8.0.26 | |
MATCH() | 执行全文搜索 | ||
MAX() | 返回最大值 | ||
MBRContains() | 一个几何的 MBR 是否包含另一个几何的 MBR | ||
MBRCoveredBy() | 一个 MBR 是否被另一个覆盖 | ||
MBRCovers() | 一个 MBR 是否覆盖另一个 | ||
MBRDisjoint() | 两个几何的 MBR 是否不相交 | ||
MBREquals() | 两个几何的 MBR 是否相等 | ||
MBRIntersects() | 两个几何的 MBR 是否相交 | ||
MBROverlaps() | 两个几何的 MBR 是否重叠 | ||
MBRTouches() | 两个几何的 MBR 是否接触 | ||
MBRWithin() | 一个几何的 MBR 是否在另一个几何的 MBR 内 | ||
MD5() | 计算 MD5 校验和 | ||
MEMBER OF() | 如果第一个操作数与作为第二个操作数传递的 JSON 数组的任何元素匹配,则返回 true (1),否则返回 false (0) | 8.0.17 | |
MICROSECOND() | 从参数返回微秒 | ||
MID() | 返回从指定位置开始的子字符串 | ||
MIN() | 返回最小值 | ||
MINUTE() | 从参数返回分钟 | ||
MOD() | 返回剩余部分 | ||
MONTH() | 从过去的日期返回月份 | ||
MONTHNAME() | 返回月份的名称 | ||
MultiLineString() | 从 LineString 值构造 MultiLineString | ||
MultiPoint() | 从点值构造多点 | ||
MultiPolygon() | 从 Polygon 值构造 MultiPolygon | ||
NAME_CONST() | 使列具有给定名称 | ||
NOT,! | 否定价值 | ||
NOT BETWEEN … AND … | 值是否不在值范围内 | ||
NOT IN() | 一个值是否不在一组值内 | ||
NOT LIKE | 简单模式匹配的否定 | ||
NOT REGEXP | 否定正则表达式 | ||
NOW() | 返回当前日期和时间 | ||
NTH_VALUE() | 来自第 N 行窗口框架的参数值 | ||
NTILE() | 其分区内当前行的桶数。 | ||
NULLIF() | 如果 expr1 = expr2 返回 NULL | ||
OCT() | 返回包含数字的八进制表示的字符串 | ||
OCTET_LENGTH() | LENGTH() 的同义词 | ||
OR, | 逻辑或 | ||
ORD() | 返回参数最左边字符的字符代码 | ||
PERCENT_RANK() | 百分比排名值 | ||
PERIOD_ADD() | 为年月添加期间 | ||
PERIOD_DIFF() | 返回期间之间的月数 | ||
PI() | 返回 pi 的值 | ||
Point() | 从坐标构造点 | ||
Polygon() | 从 LineString 参数构造多边形 | ||
POSITION() | LOCATE() 的同义词 | ||
POW() | 将引发的参数返回到指定的幂 | ||
POWER() | 将引发的参数返回到指定的幂 | ||
PS_CURRENT_THREAD_ID() | 当前线程的性能架构线程 ID | 8.0.16 | |
PS_THREAD_ID() | 给定线程的性能架构线程 ID | 8.0.16 | |
QUARTER() | 从日期参数返回季度 | ||
QUOTE() | 转义参数以在 SQL 语句中使用 | ||
RADIANS() | 返回参数转换为弧度 | ||
RAND() | 返回一个随机浮点值 | ||
RANDOM_BYTES() | 返回一个随机字节向量 | ||
RANK() | 当前行在其分区内的排名,有间隙 | ||
REGEXP | 字符串是否匹配正则表达式 | ||
REGEXP_INSTR() | 子串匹配正则表达式的起始索引 | ||
REGEXP_LIKE() | 字符串是否匹配正则表达式 | ||
REGEXP_REPLACE() | 替换匹配正则表达式的子字符串 | ||
REGEXP_SUBSTR() | 返回匹配正则表达式的子字符串 | ||
RELEASE_ALL_LOCKS() | 释放所有当前的命名锁 | ||
RELEASE_LOCK() | 释放命名锁 | ||
REPEAT() | 重复一个字符串指定的次数 | ||
REPLACE() | 替换指定字符串的出现 | ||
REVERSE() | 反转字符串中的字符 | ||
RIGHT() | 返回指定的最右边的字符数 | ||
RLIKE | 字符串是否匹配正则表达式 | ||
ROLES_GRAPHML() | 返回表示内存角色子图的 GraphML 文档 | ||
ROUND() | 围绕论点 | ||
ROW_COUNT() | 更新的行数 | ||
ROW_NUMBER() | 其分区内的当前行数 | ||
RPAD() | 附加字符串指定次数 | ||
RTRIM() | 删除尾随空格 | ||
SCHEMA() | DATABASE() 的同义词 | ||
SEC_TO_TIME() | 将秒转换为 ‘hh:mm:ss’ 格式 | ||
SECOND() | 返回第二个 (0-59) | ||
SESSION_USER() | USER() 的同义词 | ||
SHA1(),SHA() | 计算 SHA-1 160 位校验和 | ||
SHA2() | 计算 SHA-2 校验和 | ||
SIGN() | 返回参数的符号 | ||
SIN() | 返回参数的正弦 | ||
SLEEP() | 睡几秒钟 | ||
SOUNDEX() | 返回一个 soundex 字符串 | ||
SOUNDS LIKE | 比较声音 | ||
SOURCE_POS_WAIT() | 阻塞直到副本读取并应用所有更新到指定位置 | 8.0.26 | |
SPACE() | 返回指定空格数的字符串 | ||
SQRT() | 返回参数的平方根 | ||
ST_Area() | 返回多边形或多多边形区域 | ||
ST_AsBinary(),ST_AsWKB() | 从内部几何格式转换为 WKB | ||
ST_AsGeoJSON() | 从几何生成 GeoJSON 对象 | ||
ST_AsText(),ST_AsWKT() | 从内部几何格式转换为 WKT | ||
ST_Buffer() | 返回几何给定距离内的点的几何 | ||
ST_Buffer_Strategy() | 为 ST_Buffer() 生成策略选项 | ||
ST_Centroid() | 将质心作为一个点返回 | ||
ST_Collect() | 将空间值聚合到集合中 | 8.0.24 | |
ST_Contains() | 一个几何图形是否包含另一个几何图形 | ||
ST_ConvexHull() | 返回几何的凸包 | ||
ST_Crosses() | 一个几何图形是否与另一个几何图形相交 | ||
ST_Difference() | 两个几何形状的返回点集差异 | ||
ST_Dimension() | 几何尺寸 | ||
ST_Disjoint() | 一个几何图形是否与另一个几何图形脱节 | ||
ST_Distance() | 一个几何体与另一个几何体的距离 | ||
ST_Distance_Sphere() | 地球上两个几何图形之间的最小距离 | ||
ST_EndPoint() | 线串的终点 | ||
ST_Envelope() | 返回几何的 MBR | ||
ST_Equals() | 一个几何图形是否等于另一个几何图形 | ||
ST_ExteriorRing() | 返回 Polygon 的外环 | ||
ST_FrechetDistance() | 一个几何体与另一个几何体的离散 Fréchet 距离 | 8.0.23 | |
ST_GeoHash() | 产生一个geohash值 | ||
ST_GeomCollFromText(), ST_GeometryCollectionFromText(),ST_GeomCollFromTxt() | 从 WKT 返回几何集合 | ||
ST_GeomCollFromWKB(),ST_GeometryCollectionFromWKB() | 从 WKB 返回几何集合 | ||
ST_GeometryN() | 从几何集合中返回第 N 个几何 | ||
ST_GeometryType() | 返回几何类型的名称 | ||
ST_GeomFromGeoJSON() | 从 GeoJSON 对象生成几何 | ||
ST_GeomFromText(),ST_GeometryFromText() | 从 WKT 返回几何图形 | ||
ST_GeomFromWKB(),ST_GeometryFromWKB() | 从 WKB 返回几何图形 | ||
ST_HausdorffDistance() | 一个几何体与另一个几何体的离散豪斯多夫距离 | 8.0.23 | |
ST_InteriorRingN() | 返回 Polygon 的第 N 个内环 | ||
ST_Intersection() | 返回点集两个几何的交集 | ||
ST_Intersects() | 一个几何图形是否与另一个几何图形相交 | ||
ST_IsClosed() | 几何是否封闭且简单 | ||
ST_IsEmpty() | 几何是否为空 | ||
ST_IsSimple() | 几何是否简单 | ||
ST_IsValid() | 几何是否有效 | ||
ST_LatFromGeoHash() | 从 geohash 值返回纬度 | ||
ST_Latitude() | 返回Point的纬度 | 8.0.12 | |
ST_Length() | LineString 的返回长度 | ||
ST_LineFromText(),ST_LineStringFromText() | 从 WKT 构造 LineString | ||
ST_LineFromWKB(),ST_LineStringFromWKB() | 从 WKB 构造 LineString | ||
ST_LineInterpolatePoint() | 沿 LineString 的给定百分比的点 | 8.0.24 | |
ST_LineInterpolatePoints() | 沿 LineString 的给定百分比的点 | 8.0.24 | |
ST_LongFromGeoHash() | 从 geohash 值返回经度 | ||
ST_Longitude() | 返回Point的经度 | 8.0.12 | |
ST_MakeEnvelope() | 围绕两个点的矩形 | ||
ST_MLineFromText(),ST_MultiLineStringFromText() | 从 WKT 构造 MultiLineString | ||
ST_MLineFromWKB(),ST_MultiLineStringFromWKB() | 从 WKB 构造 MultiLineString | ||
ST_MPointFromText(),ST_MultiPointFromText() | 从 WKT 构造多点 | ||
ST_MPointFromWKB(),ST_MultiPointFromWKB() | 从 WKB 构造多点 | ||
ST_MPolyFromText(),ST_MultiPolygonFromText() | 从 WKT 构造 MultiPolygon | ||
ST_MPolyFromWKB(),ST_MultiPolygonFromWKB() | 从 WKB 构造 MultiPolygon | ||
ST_NumGeometries() | 返回几何集合中的几何数 | ||
ST_NumInteriorRing(),ST_NumInteriorRings() | 返回 Polygon 中的内环数 | ||
ST_NumPoints() | 返回 LineString 中的点数 | ||
ST_Overlaps() | 一个几何图形是否与另一个几何图形重叠 | ||
ST_PointAtDistance() | 沿 LineString 给定距离的点 | 8.0.24 | |
ST_PointFromGeoHash() | 将 geohash 值转换为 POINT 值 | ||
ST_PointFromText() | 从 WKT 构造点 | ||
ST_PointFromWKB() | 从 WKB 构造点 | ||
ST_PointN() | 从 LineString 返回第 N 个点 | ||
ST_PolyFromText(),ST_PolygonFromText() | 从 WKT 构造多边形 | ||
ST_PolyFromWKB(),ST_PolygonFromWKB() | 从 WKB 构造多边形 | ||
ST_Simplify() | 返回简化几何 | ||
ST_SRID() | 返回几何的空间参考系统 ID | ||
ST_StartPoint() | 线串的起点 | ||
ST_SwapXY() | 交换 X/Y 坐标的返回参数 | ||
ST_SymDifference() | 返回点设置两个几何的对称差 | ||
ST_Touches() | 一个几何图形是否接触另一个几何图形 | ||
ST_Transform() | 变换几何坐标 | 8.0.13 | |
ST_Union() | 返回点集两个几何的并集 | ||
ST_Validate() | 返回经过验证的几何图形 | ||
ST_Within() | 一个几何体是否在另一个几何体中 | ||
ST_X() | 返回Point的X坐标 | ||
ST_Y() | 返回Point的Y坐标 | ||
STATEMENT_DIGEST() | 计算语句摘要哈希值 | ||
STATEMENT_DIGEST_TEXT() | 计算规范化语句摘要 | ||
STD() | 返回总体标准差 | ||
STDDEV() | 返回总体标准差 | ||
STDDEV_POP() | 返回总体标准差 | ||
STDDEV_SAMP() | 返回样本标准差 | ||
STR_TO_DATE() | 将字符串转换为日期 | ||
STRCMP() | 比较两个字符串 | ||
SUBDATE() | 使用三个参数调用时 DATE_SUB() 的同义词 | ||
SUBSTR() | 返回指定的子字符串 | ||
SUBSTRING() | 返回指定的子字符串 | ||
SUBSTRING_INDEX() | 从指定出现次数的分隔符之前的字符串中返回子字符串 | ||
SUBTIME() | 减去时间 | ||
SUM() | 返回总和 | ||
SYSDATE() | 返回函数执行的时间 | ||
SYSTEM_USER() | USER() 的同义词 | ||
TAN() | 返回参数的正切 | ||
TIME() | 提取传递的表达式的时间部分 | ||
TIME_FORMAT() | 格式为时间 | ||
TIME_TO_SEC() | 返回转换为秒的参数 | ||
TIMEDIFF() | 减去时间 | ||
TIMESTAMP() | 使用单个参数,此函数返回日期或日期时间表达式;有两个参数,参数的总和 | ||
TIMESTAMPADD() | 向日期时间表达式添加间隔 | ||
TIMESTAMPDIFF() | 从日期时间表达式中减去间隔 | ||
TO_BASE64() | 返回转换为 base-64 字符串的参数 | ||
TO_DAYS() | 返回转换为天的日期参数 | ||
TO_SECONDS() | 返回自第 0 年以来转换为秒的日期或日期时间参数 | ||
TRIM() | 删除前导和尾随空格 | ||
TRUNCATE() | 截断到指定的小数位数 | ||
UCASE() | UPPER() 的同义词 | ||
UNCOMPRESS() | 解压缩压缩的字符串 | ||
UNCOMPRESSED_LENGTH() | 返回压缩前字符串的长度 | ||
UNHEX() | 返回包含数字的十六进制表示的字符串 | ||
UNIX_TIMESTAMP() | 返回一个 Unix 时间戳 | ||
UpdateXML() | 返回替换的 XML 片段 | ||
UPPER() | 转换为大写 | ||
USER() | 客户端提供的用户名和主机名 | ||
UTC_DATE() | 返回当前 UTC 日期 | ||
UTC_TIME() | 返回当前 UTC 时间 | ||
UTC_TIMESTAMP() | 返回当前 UTC 日期和时间 | ||
UUID() | 返回通用唯一标识符 (UUID) | ||
UUID_SHORT() | 返回一个整数值的通用标识符 | ||
UUID_TO_BIN() | 将字符串 UUID 转换为二进制 | ||
VALIDATE_PASSWORD_STRENGTH() | 确定密码强度 | ||
VALUES() | 定义在 INSERT 期间要使用的值 | ||
VAR_POP() | 返回总体标准方差 | ||
VAR_SAMP() | 返回样本方差 | ||
VARIANCE() | 返回总体标准方差 | ||
VERSION() | 返回一个表示 MySQL 服务器版本的字符串 | ||
WAIT_FOR_EXECUTED_GTID_SET() | 等到给定的 GTID 已在副本上执行。 | ||
WAIT_UNTIL_SQL_THREAD_AFTER_GTIDS() | 使用WAIT_FOR_EXECUTED_GTID_SET(). | 8.0.18 | |
WEEK() | 返回周数 | ||
WEEKDAY() | 返回工作日索引 | ||
WEEKOFYEAR() | 返回日期的日历周 (1-53) | ||
WEIGHT_STRING() | 返回字符串的权重字符串 | ||
XOR | 逻辑异或 | ||
YEAR() | 返回年份 | ||
YEARWEEK() | 返回年份和星期 | ||
| | 按位或 | ||
~ | 位反转 |
12.2 可加载函数参考
下表列出了在运行时可加载的每个函数,并提供了每个函数的简短描述。
表 12.2 可加载函数
姓名 | 描述 | 介绍 | 已弃用 |
---|---|---|---|
asymmetric_decrypt() | 使用私钥或公钥解密密文 | ||
asymmetric_derive() | 从非对称密钥派生对称密钥 | ||
asymmetric_encrypt() | 使用私钥或公钥加密明文 | ||
asymmetric_sign() | 从摘要生成签名 | ||
asymmetric_verify() | 验证签名与摘要匹配 | ||
asynchronous_connection_failover_add_managed() | 将托管组中的复制源服务器添加到源列表 | 8.0.23 | |
asynchronous_connection_failover_add_source() | 将复制源服务器添加到源列表 | 8.0.22 | |
asynchronous_connection_failover_delete_managed() | 从源列表中删除受管理的复制源服务器组 | 8.0.23 | |
asynchronous_connection_failover_delete_source() | 从源列表中删除复制源服务器 | 8.0.22 | |
audit_api_message_emit_udf() | 将消息事件添加到审核日志 | ||
audit_log_encryption_password_get() | 获取审计日志加密密码 | ||
audit_log_encryption_password_set() | 设置审计日志加密密码 | ||
audit_log_filter_flush() | 刷新审计日志过滤表 | ||
audit_log_filter_remove_filter() | 删除审核日志过滤器 | ||
audit_log_filter_remove_user() | 取消分配用户的审核日志过滤器 | ||
audit_log_filter_set_filter() | 定义审计日志过滤器 | ||
audit_log_filter_set_user() | 将审核日志过滤器分配给用户 | ||
audit_log_read() | 返回审核日志记录 | ||
audit_log_read_bookmark() | 最近审核日志事件的书签 | ||
create_asymmetric_priv_key() | 创建私钥 | ||
create_asymmetric_pub_key() | 创建公钥 | ||
create_dh_parameters() | 生成共享 DH 秘密 | ||
create_digest() | 从字符串生成摘要 | ||
firewall_group_delist() | 从防火墙组配置文件中删除帐户 | 8.0.23 | |
firewall_group_enlist() | 将帐户添加到防火墙组配置文件 | 8.0.23 | |
gen_blacklist() | 执行字典术语替换 | 8.0.23 | |
gen_blocklist() | 执行字典术语替换 | 8.0.23 | |
gen_dictionary() | 从字典中返回随机词 | ||
gen_dictionary_drop() | 从注册表中删除字典 | ||
gen_dictionary_load() | 将字典加载到注册表中 | ||
gen_range() | 生成范围内的随机数 | ||
gen_rnd_email() | 生成随机电子邮件地址 | ||
gen_rnd_pan() | 生成随机支付卡主账号 | ||
gen_rnd_ssn() | 生成随机的美国社会安全号码 | ||
gen_rnd_us_phone() | 生成随机美国电话号码 | ||
group_replication_disable_member_action() | 启用成员操作,以便成员在指定情况下不采取它 | ||
group_replication_enable_member_action() | 允许成员在指定情况下采取的成员操作 | ||
group_replication_get_communication_protocol() | 返回组复制协议版本 | ||
group_replication_get_write_concurrency() | 返回并行可执行的最大共识实例数 | ||
group_replication_reset_member_actions() | 将成员操作配置重置为默认设置 | ||
group_replication_set_as_primary() | 将组成员分配为新的主要成员 | ||
group_replication_set_communication_protocol() | 设置组复制协议版本 | ||
group_replication_set_write_concurrency() | 设置可并行执行的最大共识实例数 | ||
group_replication_switch_to_multi_primary_mode() | 将组从单主模式更改为多主模式 | ||
group_replication_switch_to_single_primary_mode() | 将组从多主模式更改为单主模式 | ||
keyring_aws_rotate_cmk() | 轮换 AWS 客户主密钥 | ||
keyring_aws_rotate_keys() | 轮换 keyring_aws 存储文件中的密钥 | ||
keyring_hashicorp_update_config() | 导致运行时 keyring_hashicorp 重新配置 | ||
keyring_key_fetch() | 获取密钥环键值 | ||
keyring_key_generate() | 生成随机密钥环密钥 | ||
keyring_key_length_fetch() | 返回密钥环密钥长度 | ||
keyring_key_remove() | 删除密钥环密钥 | ||
keyring_key_store() | 将密钥存储在密钥环中 | ||
keyring_key_type_fetch() | 返回密钥环密钥类型 | ||
load_rewrite_rules() | 重写器插件助手例程 | ||
mask_inner() | 掩盖字符串的内部部分 | ||
mask_outer() | 屏蔽字符串的左右部分 | ||
mask_pan() | 屏蔽支付卡主帐号字符串部分 | ||
mask_pan_relaxed() | 屏蔽支付卡主帐号字符串部分 | ||
mask_ssn() | 掩盖美国社会安全号码 | ||
mysql_firewall_flush_status() | 重置防火墙状态变量 | ||
mysql_query_attribute_string() | 获取查询属性值 | 8.0.23 | |
normalize_statement() | 将 SQL 语句规范化为摘要形式 | ||
read_firewall_group_allowlist() | 更新防火墙组配置文件记录语句缓存 | 8.0.23 | |
read_firewall_groups() | 更新防火墙组配置文件缓存 | 8.0.23 | |
read_firewall_users() | 更新防火墙帐户配置文件缓存 | 8.0.26 | |
read_firewall_whitelist() | 更新防火墙帐户配置文件记录语句缓存 | 8.0.26 | |
service_get_read_locks() | 获取锁服务共享锁 | ||
service_get_write_locks() | 获取锁服务排他锁 | ||
service_release_locks() | 释放锁定服务锁 | ||
set_firewall_group_mode() | 建立防火墙组配置文件操作模式 | 8.0.23 | |
set_firewall_mode() | 建立防火墙帐户配置文件操作模式 | 8.0.26 | |
version_tokens_delete() | 从版本令牌列表中删除令牌 | ||
version_tokens_edit() | 修改版本令牌列表 | ||
version_tokens_lock_exclusive() | 获取版本令牌的排他锁 | ||
version_tokens_lock_shared() | 获取版本令牌上的共享锁 | ||
version_tokens_set() | 设置版本令牌列表 | ||
version_tokens_show() | 返回版本令牌列表 | ||
version_tokens_unlock() | 发布版本令牌锁 |
12.3 表达式求值中的类型转换
当运算符与不同类型的操作数一起使用时,会发生类型转换以使操作数兼容。一些转换是隐式发生的。例如,MySQL 会根据需要自动将字符串转换为数字,反之亦然。
mysql> SELECT 1+'1';
-> 2
mysql> SELECT CONCAT(2,' test');
-> '2 test'
也可以使用该CAST()函数将数字显式转换为字符串。转换隐式发生在 CONCAT()函数中,因为它需要字符串参数。
mysql> SELECT 38.8, CAST(38.8 AS CHAR);
-> 38.8, '38.8'
mysql> SELECT 38.8, CONCAT(38.8);
-> 38.8, '38.8'
有关隐式数字到字符串转换的字符集以及适用于CREATE TABLE … SELECT 语句的修改规则的信息。
以下规则描述了比较操作如何进行转换:
- 如果一个或两个参数是NULL,则比较的结果是NULL,但NULL-safe <=> 相等比较运算符除外。对于NULL <=> NULL,结果为真。无需转换。
- 如果比较操作中的两个参数都是字符串,则将它们作为字符串进行比较。
- 如果两个参数都是整数,则将它们作为整数进行比较。
- 如果不与数字比较,十六进制值将被视为二进制字符串。
- 如果其中一个参数是TIMESTAMP 或 DATETIME列,而另一个参数是常量,则在执行比较之前将常量转换为时间戳。这样做是为了对ODBC 更友好。这不适用于 的参数 IN()。为了安全起见,在进行比较时,请始终使用完整的日期时间、日期或时间字符串。例如,要在使 用 BETWEEN日期或时间值时获得最佳结果,请使用CAST()将值显式转换为所需的数据类型。
- 来自一个或多个表的单行子查询不被视为常量。例如,如果子查询返回要与值进行比较的整数DATETIME ,则比较将作为两个整数进行。整数不会转换为时间值。要将操作数作为 DATETIME 值进行比较,请使用 CAST() 将子查询值显式转换为DATETIME.
- 如果其中一个参数是十进制值,则比较取决于另一个参数。如果另一个参数是十进制或整数值,则将参数作为十进制值进行比较,如果另 一个参数是浮点值,则将其作为浮点值进行比较。
- 在所有其他情况下,参数将作为浮点(双精度)数字进行比较。例如,字符串和数字操作数的比较是作为浮点数的比较进行的。
有关将值从一种时间类型转换为另一种的信息,请参阅第 11.2.7 节,“日期和时间类型之间的转换”。
JSON 值的比较发生在两个级别。第一级比较基于比较值的 JSON 类型。如果类型不同,则比较结果仅取决于哪种类型具有更高的优先级。如果两个值具有相同的 JSON 类型,则使用特定于类型的规则进行第二级比较。为了比较 JSON 和非 JSON 值,将非 JSON 值转换为 JSON,并将值作为 JSON 值进行比较。有关详细信息,请参阅JSON 值的比较和排序。
以下示例说明了将字符串转换为数字以进行比较操作:
mysql> SELECT 1 > '6x';
-> 0
mysql> SELECT 7 > '6x';
-> 1
mysql> SELECT 0 > 'x6';
-> 0
mysql> SELECT 0 = 'x6';
-> 1
对于字符串列与数字的比较,MySQL 不能使用列上的索引来快速查找值。如果 str_col是索引字符串列,则在以下语句中执行查找时不能使用索引:
SELECT * FROM tbl_name WHERE str_col=1;
这样做的原因是有许多不同的字符串可以转换为 value 1,例如 ‘1’,’ 1’或 ‘1a’。
浮点数和 INTEGER 类型的大值比较是近似的,因为整数在比较之前被转换为双精度浮点数,不能准确表示所有 64 位整数。 例如,整数值 253 + 1 不能表示为浮点数,并且在浮点比较之前四舍五入为 253 或 253 + 2,具体取决于平台。
为了说明,只有以下比较中的第一个比较相等的值,但两个比较都返回 true (1):
mysql> SELECT '9223372036854775807' = 9223372036854775807;
-> 1
mysql> SELECT '9223372036854775807' = 9223372036854775806;
-> 1
当发生从字符串到浮点以及从整数到浮点的转换时,它们的发生方式不一定相同。CPU 可以将整数转换为浮点数,而字符串在涉及浮点乘法的运算中逐位转换。此外,结果可能会受到计算机体系结构或编译器版本或优化级别等因素的影响。避免此类问题的一种方法是使用CAST()使值不会隐式转换为浮点数:
mysql> SELECT CAST('9223372036854775807' AS UNSIGNED) = 9223372036854775806;
-> 0
有关浮点比较的更多信息,请参阅 第 B.3.4.8 节,“浮点值问题”。
该服务器包括dtoa一个转换库,它为改进字符串或 DECIMAL值与近似值 ( FLOAT/ DOUBLE) 数字之间的转换提供了基础:
- 跨平台的一致转换结果,消除了例如 Unix 与 Windows 的转换差异。
- 在以前的结果不能提供足够精度的情况下准确表示值,例如接近 IEEE 限制的值。
- 以尽可能高的精度将数字转换为字符串格式。 dtoa 的精度始终与标准 C 库函数相同或更好。
由于此库生成的转换在某些情况下与非dtoa结果不同,因此在依赖先前结果的应用程序中可能存在不兼容性。例如,依赖于先前转换的特定精确结果的应用程序可能需要调整以适应额外的精度。
该dtoa库提供具有以下属性的转换。D表示具有 DECIMAL或字符串表示的值,并F表示本机二进制 (IEEE) 格式的浮点数。
- F-> D转换以尽可能高的精度完成,返回D为读回时产生的最短字符串,F 并以 IEEE 指定的本机二进制格式四舍五入到最接近的值。
- D-> F转换是 F最接近输入十进制字符串的本机二进制数 D。
这些属性意味着 F -> D -> F 转换是无损的,除非 F 是 -inf、+inf 或 NaN。 不支持后面的值,因为 SQL 标准将它们定义为 FLOAT 或 DOUBLE 的无效值。
对于 D -> F -> D 转换,无损的充分条件是 D 使用 15 位或更少的精度,不是非规范值、-inf、+inf 或 NaN。 在某些情况下,即使 D 的精度超过 15 位,转换也是无损的,但情况并非总是如此。
将数值或时间值隐式转换为字符串会生成一个值,该值具有由character_set_connection 和collation_connection系统变量确定的字符集和排序规则。(这些变量通常用 设置 SET NAMES。有关连接字符集的信息,请参阅 第 10.4 节,“连接字符集和排序规则”。)
这意味着这种转换会产生一个字符(非二进制)字符串(CHAR、 VARCHAR或 LONGTEXT值),除非连接字符集设置为 binary。在这种情况下,转换结果是二进制字符串(BINARY、VARBINARY、LONGBLOB值)。
对于整数表达式,前面关于表达式求值的评论对表达式 赋值的应用有些不同;例如,在这样的声明中:
CREATE TABLE t SELECT integer_expr;
在这种情况下,表达式生成的列中的表具有 INT 或 BIGINT 类型,具体取决于整数表达式的长度。 如果表达式的最大长度不适合 INT,则改用 BIGINT。 长度取自 SELECT 结果集元数据的 max_length 值(请参阅 C API 基本数据结构)。 这意味着可以通过使用足够长的表达式来强制使用 BIGINT 而不是 INT:
CREATE TABLE t SELECT 000000000000000000000;
12.4 运算符
表 12.3 运算符
名称 | 描述 | 介绍 | 已弃用 |
---|---|---|---|
& | 按位与 | ||
> | 大于运算符 | ||
>> | 右移 | ||
>= | 大于或等于运算符 | ||
< | 小于运算符 | ||
<>,!= | 不等于运算符 | ||
<< | 左移 | ||
<= | 小于或等于运算符 | ||
<=> | NULL 安全等于运算符 | ||
%,MOD | 模运算符 | ||
* | 乘法运算符 | ||
+ | 加法运算符 | ||
- | 减号运算符 | ||
- | 更改参数的符号 | ||
-> | 评估路径后从 JSON 列返回值;相当于 JSON_EXTRACT()。 | ||
->> | 评估路径并取消引用结果后从 JSON 列返回值;相当于 JSON_UNQUOTE(JSON_EXTRACT())。 | ||
/ | 分区运算符 | ||
:= | 赋值 | ||
= | 赋值(作为 SET 语句的一部分,或作为语句中SET子句的 一部分UPDATE) | ||
= | 等号运算符 | ||
^ | 按位异或 | ||
AND,&& | 逻辑与 | ||
BETWEEN … AND … | 一个值是否在一个值范围内 | ||
BINARY | 将字符串转换为二进制字符串 | 8.0.27 | |
CASE | 案例操作员 | ||
DIV | 整数除法 | ||
IN() | 一个值是否在一组值内 | ||
IS | 根据布尔值测试值 | ||
IS NOT | 根据布尔值测试值 | ||
IS NOT NULL | NOT NULL 值测试 | ||
IS NULL | 空值测试 | ||
LIKE | 简单的模式匹配 | ||
MEMBER OF() | 如果第一个操作数与作为第二个操作数传递的 JSON 数组的任何元素匹配,则返回 true (1),否则返回 false (0) | 8.0.17 | |
NOT,! | 否定价值 | ||
NOT BETWEEN … AND … | 值是否不在值范围内 | ||
NOT IN() | 一个值是否不在一组值内 | ||
NOT LIKE | 简单模式匹配的否定 | ||
NOT REGEXP | 否定正则表达式 | ||
OR, | 逻辑或 | ||
REGEXP | 字符串是否匹配正则表达式 | ||
RLIKE | 字符串是否匹配正则表达式 | ||
SOUNDS LIKE | 比较声音 | ||
XOR | 逻辑异或 | ||
按位或 | |||
~ | 位反转 |
12.4.1 运算符优先级
运算符优先级显示在以下列表中,从最高优先级到最低优先级。在一行中一起显示的运算符具有相同的优先级。
INTERVAL
BINARY, COLLATE
!
- (unary minus), ~ (unary bit inversion)
^
*, /, DIV, %, MOD
-, +
<<, >>
&
|
= (comparison), <=>, >=, >, <=, <, <>, !=, IS, LIKE, REGEXP, IN, MEMBER OF
BETWEEN, CASE, WHEN, THEN, ELSE
NOT
AND, &&
XOR
OR, ||
= (assignment), :=
=
的优先级取决于它是用作比较运算符 (=)
还是用作 赋值运算符 (=)
。 当用作 比较运算符
时,它与 <=>
、 >=
、 >
、 <=
、 <
、 <>
、 !=
、 IS
、 LIKE
、 REGEXP
和 IN()
具有相同的优先级。 当用作 赋值运算符
时,它与 :=
具有相同的优先级。 第 13.7.6.1 节,“变量赋值的 SET 语法”和第 9.4 节,“用户定义的变量”,解释了 MySQL 如何确定应该应用哪种 =
的解释。
对于在表达式中以相同优先级出现的运算符,求值从左到右进行,但赋值从右到左求值的例外。
某些运算符的优先级和含义取决于 SQL 模式:
- 默认情况下,
||
是逻辑OR
运算符。 启用PIPES_AS_CONCAT
后,||
是字符串连接,优先级在^
和一元运算符之间。 - 默认,
!
具有比NOT
更高的优先级。 启用HIGH_NOT_PRECEDENCE
后,!
并且NOT
具有相同的优先级。
请参阅第 5.1.11 节,“服务器 SQL 模式”。
运算符的优先级决定了表达式中项的计算顺序。要显式覆盖此顺序和组术语,请使用括号。例如:
mysql> SELECT 1+2*3;
-> 7
mysql> SELECT (1+2)*3;
-> 9
12.4.2 比较函数和运算符
表 12.4 比较运算符
名称 | 描述 |
---|---|
> | 大于运算符 |
>= | 大于或等于运算符 |
< | 小于运算符 |
<>,!= | 不等于运算符 |
<= | 小于或等于运算符 |
<=> | NULL 安全等于运算符 |
= | 等号运算符 |
BETWEEN … AND … | 一个值是否在一个值范围内 |
COALESCE() | 返回第一个非 NULL 参数 |
GREATEST() | 返回最大的参数 |
IN() | 一个值是否在一组值内 |
INTERVAL() | 返回小于第一个参数的参数的索引 |
IS | 根据布尔值测试值 |
IS NOT | 根据布尔值测试值 |
IS NOT NULL | NOT NULL 值测试 |
IS NULL | 空值测试 |
ISNULL() | 测试参数是否为 NULL |
LEAST() | 返回最小的参数 |
LIKE | 简单的模式匹配 |
NOT BETWEEN … AND … | 值是否不在值范围内 |
NOT IN() | 一个值是否不在一组值内 |
NOT LIKE | 简单模式匹配的否定 |
STRCMP() | 比较两个字符串 |
STRCMP() | 比较两个字符串 |
比较运算产生1 ( TRUE)
、0 ( FALSE)
或的值NULL
。这些操作适用于数字和字符串。必要时,字符串会自动转换为数字,数字会自动转换为字符串。
以下关系比较运算符不仅可用于比较标量操作数,还可用于比较行操作数:
= > < >= <= <> !=
本节后面对这些运算符的描述详细说明了它们如何处理行操作数。有关行子查询上下文中行比较的其他示例,请参阅 第 13.2.11.5 节,“行子查询”。
本节中的某些函数返回 1( TRUE)
、 0( FALSE)
或 以外的值NULL
。LEAST()
并且GREATEST()
是此类功能的示例;第 12.3 节,“表达式求值中的类型转换”,描述了由这些和类似函数执行的比较操作的规则,以确定它们的返回值。
笔记
在以前的 MySQL 版本中,当评估包含 LEAST() 或 GREATEST() 的表达式时,服务器会尝试猜测使用函数的上下文,并将函数的参数强制转换为整个表达式的数据类型。 例如,LEAST(“11”, “45”, “2”) 的参数被评估并排序为字符串,因此该表达式返回“11”。 在 MySQL 8.0.3 和更早的版本中,在计算表达式 LEAST(“11”, “45”, “2”) + 0 时,服务器将参数转换为整数(预期将整数 0 添加到结果中),然后再对它们进行排序 ,因此返回 2。
从 MySQL 8.0.4 开始,服务器不再尝试以这种方式推断上下文。 相反,该函数使用提供的参数执行,当且仅当它们不都是相同类型时,才将数据类型转换为一个或多个参数。 现在,在函数执行之后执行由使用返回值的表达式强制执行的任何类型强制。 这意味着,在 MySQL 8.0.4 及更高版本中,LEAST(“11”, “45”, “2”) + 0 计算结果为 “11” + 0,因此计算结果为整数 11。(错误 #83895,错误 #25123839)
将值转换为特定类型以进行比较,可以使用 CAST()
函数。 可以使用 CONVERT()
将字符串值转换为不同的字符集。 请参阅第 12.11 节,“转换函数和运算符”。
默认情况下,字符串比较不区分大小写并使用当前字符集。默认值为 utf8mb4
.
=
与…相等
mysql> SELECT 1 = 0;
-> 0
mysql> SELECT '0' = 0;
-> 1
mysql> SELECT '0.0' = 0;
-> 1
mysql> SELECT '0.01' = 0;
-> 0
mysql> SELECT '.01' = 0.01;
-> 1
对于行比较,(a, b) = (x, y)相当于:
(a = x) AND (b = y)
<=>
NULL 安全相等。 此运算符执行与 = 运算符类似的相等比较,但如果两个操作数都为 NULL,则返回 1 而不是 NULL,如果一个操作数为 NULL,则返回 0 而不是 NULL。
<=> 运算符等效于标准 SQL IS NOT DISTINCT FROM 运算符。
mysql> SELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL;
-> 1, 1, 0
mysql> SELECT 1 = 1, NULL = NULL, 1 = NULL;
-> 1, NULL, NULL
对于行比较,(a, b) <=> (x, y)相当于:
(a <=> x) AND (b <=> y)
<>, !=
不相等
mysql> SELECT '.01' <> '0.01';
-> 1
mysql> SELECT .01 <> '0.01';
-> 0
mysql> SELECT 'zapp' <> 'zappp';
-> 1
对于行比较,(a, b) <> (x, y)和(a, b) != (x, y)等价于:
(a <> x) OR (b <> y)
<=
小于或等于:
mysql> SELECT 0.1 <= 2;
-> 1
对于行比较,(a, b) <= (x, y) 相当于:
(a < x) OR ((a = x) AND (b <= y))
<
小于
mysql> SELECT 2 < 2;
-> 0
对于行比较,(a, b) < (x, y) 相当于:
(a < x) OR ((a = x) AND (b < y))
>=
大于或等于
mysql> SELECT 2 >= 2;
-> 1
对于行比较,(a, b) >= (x, y) 相当于:
(a > x) OR ((a = x) AND (b >= y))
>
大于或等于
mysql> SELECT 2 > 2;
-> 0
对于行比较,(a, b) > (x, y) 相当于:
(a > x) OR ((a = x) AND (b > y))
expr BETWEEN min AND max
如果expr大于或等于min且 expr小于或等于 max, 则BETWEEN返回 1,否则返回 0。如果所有参数都属于同一类型,则这等效于表达式 。否则,类型转换将根据 第 12.3 节“表达式求值中的类型转换”中描述的规则进行,但适用于所有三个参数。 (min <= expr AND expr <= max)
mysql> SELECT 2 BETWEEN 1 AND 3, 2 BETWEEN 3 and 1;
-> 1, 0
mysql> SELECT 1 BETWEEN 2 AND 3;
-> 0
mysql> SELECT 'b' BETWEEN 'a' AND 'c';
-> 1
mysql> SELECT 2 BETWEEN 2 AND '3';
-> 1
mysql> SELECT 2 BETWEEN 2 AND 'x-3';
-> 0
为了在将 BETWEEN
与日期或时间值一起使用时获得最佳结果,请使用 CAST()
将值显式转换为所需的数据类型。 示例:如果将 DATETIME
与两个 DATE
值进行比较,请将 DATE
值转换为 DATETIME
值。 如果在与 DATE
的比较中使用字符串常量(例如 ‘2001-1-1’),请将字符串转换为 DATE
。
expr NOT BETWEEN min AND max
这与. NOT (expr BETWEEN min AND max)
COALESCE(value,...)
返回NULL列表中的第一个非值,或者NULL如果没有非NULL值。
COALESCE() 的返回类型是参数类型的聚合类型。
mysql> SELECT COALESCE(NULL,1);
-> 1
mysql> SELECT COALESCE(NULL,NULL,NULL);
-> NULL
GREATEST(value1,value2,...)
使用两个或更多参数,返回最大(最大值)参数。 使用与 LEAST()
相同的规则比较参数。
mysql> SELECT GREATEST(2,0);
-> 2
mysql> SELECT GREATEST(34.0,3.0,5.0,767.0);
-> 767.0
mysql> SELECT GREATEST('B','A','C');
-> 'C'
如果任何参数为 NULL,GREATEST() 将返回 NULL。
expr IN (value,...)
如果 expr 等于 IN() 列表中的任何值,则返回 1 (true),否则返回 0 (false)。
类型转换根据第 12.3 节“表达式求值中的类型转换”中描述的规则进行,适用于所有参数。 如果 IN() 列表中的值不需要类型转换,它们都是同类型的非 JSON 常量,可以将 expr 与它们中的每一个作为同类型的值进行比较(可能在类型转换之后) ,进行优化。 对列表中的值进行排序,并使用二进制搜索完成对 expr 的搜索,这使得 IN() 操作非常快速。
mysql> SELECT 2 IN (0,3,5,7);
-> 0
mysql> SELECT 'wefwf' IN ('wee','wefwf','weg');
-> 1
IN()可用于比较行构造函数:
mysql> SELECT (3,4) IN ((1,2), (3,4));
-> 1
mysql> SELECT (3,4) IN ((1,2), (3,5));
-> 0
切勿在 IN()列表中混用带引号和不带引号的值,因为带引号的值(例如字符串)和不带引号的值(例如数字)的比较规则不同。因此,混合类型可能会导致结果不一致。例如,不要写这样的 IN()表达式:
SELECT val1 FROM tbl1 WHERE val1 IN (1,2,'a');
相反,这样写:
SELECT val1 FROM tbl1 WHERE val1 IN ('1','2','a');
隐式类型转换可能会产生不直观的结果:
mysql> SELECT 'a' IN (0), 0 IN ('b');
-> 1, 1
在这两种情况下,比较值都转换为浮点值,在每种情况下产生 0.0,比较结果为 1(真)。
IN()
列表中值的数量,仅受 max_allowed_packet
值的限制。
为了符合 SQL 标准,IN() 不仅在左侧的表达式为 NULL 时返回 NULL,而且在列表中未找到匹配项且列表中的表达式之一为 NULL 时返回 NULL。
IN()
语法也可用于编写某些类型的子查询。 请参阅第 13.2.11.3 节,“带有 ANY、IN 或 SOME 的子查询”。
expr NOT IN (value,...)
这与 NOT (expr IN (value,…)) 相同。
INTERVAL(N,N1,N2,N3,...)
如果 N < N1 返回 0,如果 N < N2 返回 1,依此类推,如果 N 为 NULL,则返回 -1。 所有参数都被视为整数。 此功能需要 N1 < N2 < N3 < … < Nn 才能正常工作。 这是因为使用了二进制搜索(非常快)。
mysql> SELECT INTERVAL(23, 1, 15, 17, 30, 44, 200);
-> 3
mysql> SELECT INTERVAL(10, 1, 10, 100, 1000);
-> 2
mysql> SELECT INTERVAL(22, 23, 30, 44, 200);
-> 0
IS boolean_value
根据布尔值测试一个值,其中 boolean_value可以是 TRUE、FALSE或 UNKNOWN。
mysql> SELECT 1 IS TRUE, 0 IS FALSE, NULL IS UNKNOWN;
-> 1, 1, 1
IS NOT boolean_value
根据布尔值测试一个值,其中 boolean_value可以是 TRUE、FALSE或 UNKNOWN。
mysql> SELECT 1 IS NOT UNKNOWN, 0 IS NOT UNKNOWN, NULL IS NOT UNKNOWN;
-> 1, 1, 0
IS NULL
测试一个值是否为NULL.
mysql> SELECT 1 IS NULL, 0 IS NULL, NULL IS NULL;
-> 0, 0, 1
为了与 ODBC 程序一起工作,MySQL 在使用时支持以下额外功能IS NULL:
- 如果
sql_auto_is_null variable
设置为 1,那么在成功插入自动生成的AUTO_INCREMENT
值的语句之后,可以通过发出以下形式的语句来找到该值:
SELECT * FROM tbl_name WHERE auto_col IS NULL
如果语句返回一行,则返回的值与调用 LAST_INSERT_ID()
函数时的值相同。 有关详细信息,包括多行插入后的返回值,请参阅第 12.16 节,“信息函数”。 如果没有成功插入 AUTO_INCREMENT
值,则 SELECT
语句不返回任何行。
可以通过设置 sql_auto_is_null = 0
来禁用使用 IS NULL
比较检索 AUTO_INCREMENT
值的行为。请参阅第 5.1.8 节,“服务器系统变量”。
sql_auto_is_null 的默认值为 0。
对于声明为 NOT NULL
的 DATE
和 DATETIME
列,可以使用如下语句找到特殊日期“0000-00-00”:
SELECT * FROM tbl_name WHERE date_column IS NULL
这是使某些 ODBC 应用程序工作所必需的,因为 ODBC 不支持“0000-00-00”日期值。
请参阅获取自动增量值以及Connector/ODBC 连接参数中的 FLAG_AUTO_IS_NULL
选项的说明。
IS NOT NULL
测试一个值是否不是NULL。
mysql> SELECT 1 IS NOT NULL, 0 IS NOT NULL, NULL IS NOT NULL;
-> 1, 1, 0
ISNULL(expr)
如果expr是 NULL, 则ISNULL()返回 1,否则返回 0。
mysql> SELECT ISNULL(1+1);
-> 0
mysql> SELECT ISNULL(1/0);
-> 1
ISNULL()
可以用来代替=
测试值是否为NULL
. (使用 =
将值与 NULL
进行比较总是产生 NULL
。)
该ISNULL()
函数与 IS NULL
比较运算符有一些特殊的行为。参见 的描述 IS NULL。
LEAST(value1,value2,...)
使用两个或多个参数,返回最小(最小值)参数。使用以下规则比较参数:
- 如果任何参数为NULL,则结果为NULL。不需要比较。
- 如果所有参数都是整数值,则将它们作为整数进行比较。
- 如果至少一个参数是双精度的,则将它们作为双精度值进行比较。否则,如果至少一个参数是一个 DECIMAL值,则将它们作为DECIMAL 值进行比较。
- 如果参数包含数字和字符串的混合,则将它们作为字符串进行比较。
- 如果任何参数是非二进制(字符)字符串,则将参数作为非二进制字符串进行比较。
- 在所有其他情况下,参数作为二进制字符串进行比较。
LEAST()
的返回类型是比较参数类型的聚合类型。
mysql> SELECT LEAST(2,0);
-> 0
mysql> SELECT LEAST(34.0,3.0,5.0,767.0);
-> 3.0
mysql> SELECT LEAST('B','A','C');
-> 'A'
12.4.3 逻辑运算符
表 12.5 逻辑运算符
名称 | 描述 |
---|---|
AND,&& | 逻辑与 |
NOT,! | 否定价值 |
OR, | |
XOR | 逻辑异或 |
在 SQL 中,所有逻辑运算符的计算结果为 TRUE
、FALSE
或 NULL( UNKNOWN)
。在 MySQL 中,这些实现为 1 ( TRUE)
、0 ( FALSE)
和NULL
. 尽管有些服务器可能会为 TRUE
.
MySQL 将任何非零、非NULL
值评估为TRUE
. 例如,以下语句都评估为TRUE
:
mysql> SELECT 10 IS TRUE;
-> 1
mysql> SELECT -10 IS TRUE;
-> 1
mysql> SELECT 'string' IS NOT NULL;
-> 1
NOT, !
逻辑非。判断1操作数是否为0,0判断操作数是否为非零,并NOT NULL 返回NULL。
mysql> SELECT NOT 10;
-> 0
mysql> SELECT NOT 0;
-> 1
mysql> SELECT NOT NULL;
-> NULL
mysql> SELECT ! (1+1);
-> 0
mysql> SELECT ! 1+1;
-> 1
最后一个示例产生1
是因为表达式的计算方式与 (!1)+1
.
!
, 运算符是一个非标准的 MySQL 扩展。从 MySQL 8.0.17 开始,此运算符已弃用;希望它在 MySQL 的未来版本中被删除。应调整应用程序以使用标准 SQLNOT运算符。
AND, &&
逻辑与。计算1所有操作数是否为非零且非NULL, 0如果一个或多个操作数为 0,否则NULL返回。
mysql> SELECT 1 AND 1;
-> 1
mysql> SELECT 1 AND 0;
-> 0
mysql> SELECT 1 AND NULL;
-> NULL
mysql> SELECT 0 AND NULL;
-> 0
mysql> SELECT NULL AND 0;
-> 0
&&
, 运算符是一个非标准的 MySQL 扩展。从 MySQL 8.0.17 开始,此运算符已弃用;期望在 MySQL 的未来版本中删除对它的支持。应调整应用程序以使用标准 SQL AND运算符。
OR, ||
逻辑或。当两个操作数都不是NULL- 时,结果是 1如果任何操作数非零, 0否则。对于一个 NULL操作数,结果是 1另一个操作数是否非零, NULL否则。如果两个操作数都是 NULL,则结果是 NULL。
mysql> SELECT 1 OR 1;
-> 1
mysql> SELECT 1 OR 0;
-> 1
mysql> SELECT 0 OR 0;
-> 0
mysql> SELECT 0 OR NULL;
-> NULL
mysql> SELECT 1 OR NULL;
-> 1
笔记
如果PIPES_AS_CONCAT 启用了 SQL 模式,则 ||表示 SQL 标准的字符串连接运算符(如 CONCAT())。
||
运算符是一个非标准的 MySQL 扩展。从 MySQL 8.0.17 开始,此运算符已弃用;期望在 MySQL 的未来版本中删除对它的支持。应调整应用程序以使用标准 SQL OR运算符。PIPES_AS_CONCAT例外:如果启用, 则弃用不适用, 因为在这种情况下,||表示字符串连接。
||
, 操作符是一个非标准的 MySQL 扩展。 从 MySQL 8.0.17 开始,此运算符已弃用; 期望在 MySQL 的未来版本中删除对它的支持。 应调整应用程序以使用标准 SQL OR 运算符。 例外:如果启用了 PIPES_AS_CONCAT
,则弃用不适用,因为在这种情况下,||
表示字符串连接。
XOR
逻辑异或。NULL如果任一操作数是 则返回NULL。对于非NULL操作数, 1如果奇数个操作数不为零,则计算结果,否则0返回。
mysql> SELECT 1 XOR 1;
-> 0
mysql> SELECT 1 XOR 0;
-> 1
mysql> SELECT 1 XOR NULL;
-> NULL
mysql> SELECT 1 XOR 1 XOR 1;
-> 1
a XOR b数学上等于 (a AND (NOT b)) OR ((NOT a) and b)。
12.4.4 赋值运算符
表 12.6 赋值运算符
名称 | 描述 |
---|---|
:= | 赋值 |
= | 赋值(作为 SET 语句的一部分,或作为语句中SET子句的 一部分UPDATE) |
:=
赋值运算符。 使运算符左侧的用户变量采用其右侧的值。 右侧的值可以是文字值、另一个存储值的变量或任何产生标量值的合法表达式,包括查询结果(前提是该值是标量值)。 您可以在同一个 SET
语句中执行多个赋值。 您可以在同一语句中执行多个赋值。
与 =
不同,:=
运算符永远不会被解释为比较运算符。 这意味着您可以在任何有效的 SQL 语句(不仅仅是在 SET 语句中)中使用 :=
来为变量赋值。
mysql> SELECT @var1, @var2;
-> NULL, NULL
mysql> SELECT @var1 := 1, @var2;
-> 1, NULL
mysql> SELECT @var1, @var2;
-> 1, NULL
mysql> SELECT @var1, @var2 := @var1;
-> 1, 1
mysql> SELECT @var1, @var2;
-> 1, 1
mysql> SELECT @var1:=COUNT(*) FROM t1;
-> 4
mysql> SELECT @var1;
-> 4
可以在除 SELECT
之外的其他语句(例如 UPDATE
)中使用 :=
进行值分配,如下所示:
mysql> SELECT @var1;
-> 4
mysql> SELECT * FROM t1;
-> 1, 3, 5, 7
mysql> UPDATE t1 SET c1 = 2 WHERE c1 = @var1:= 1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> SELECT @var1;
-> 1
mysql> SELECT * FROM t1;
-> 2, 3, 5, 7
虽然也可以使用 :=
运算符在单个 SQL 语句中设置和读取同一变量的值,但不建议这样做。 第 9.4 节,“用户定义的变量”,解释了为什么你应该避免这样做。
=
此运算符用于在两种情况下执行值分配,在接下来的两段中进行描述。
在 SET
语句中,=
被视为赋值运算符,它使运算符左侧的用户变量取其右侧的值。 (换句话说,当在 SET
语句中使用时,=
与 :=
的处理方式相同。)右侧的值可以是文字值、另一个存储值的变量或任何产生标量值的合法表达式, 包括查询的结果(前提是该值是标量值)。 您可以在同一个 SET 语句中执行多个赋值。
在 UPDATE
语句的 SET
子句中,=
也充当赋值运算符; 但是,在这种情况下,它会导致运算符左侧命名的列假定右侧给出的值,前提是满足 UPDATE
的任何 WHERE
条件。 可以在 UPDATE
语句的同一个 SET
子句中进行多个赋值。
在任何其他上下文中,=
被视为比较运算符。
mysql> SELECT @var1, @var2;
-> NULL, NULL
mysql> SELECT @var1 := 1, @var2;
-> 1, NULL
mysql> SELECT @var1, @var2;
-> 1, NULL
mysql> SELECT @var1, @var2 := @var1;
-> 1, 1
mysql> SELECT @var1, @var2;
-> 1, 1
有关更多信息,请参阅第 13.7.6.1 节,“变量赋值的 SET 语法”,第 13.2.13 节,“UPDATE 语句”和第 13.2.11 节,“子查询”。