第12章函数和操作符

目录

12.1功能和操作员参考
12.2表达式评估中的类型转换
12.3运营商
12.3.1运营商优先顺序
12.3.2比较函数和运算符
12.3.3逻辑运算符
12.3.4赋值运算符
12.4控制流功能
12.5字符串函数
12.5.1字符串比较函数
12.5.2正则表达式
12.5.3函数结果的字符集和校对
12.6数字函数和运算符
12.6.1算术运算符
12.6.2数学函数
12。7日期和时间函数
12.8 MySQL使用什么日历?
12.9全文搜索功能
12.9.1自然语言全文检索
12.9.2布尔全文搜索
12.9.3使用查询扩展的全文搜索
12.9.4全文停用词
12.9.5全文限制
12.9.6微调MySQL全文搜索
12.9.7为全文索引添加排序规则
12.9.8 ngram全文分析器
12.9.9 MeCab全文分析器插件
12.10演员函数和运算符
12.11 XML函数
12.12位功能和操作符
12.13加密和压缩功能
12.14锁定功能
12.15信息功能
12.16空间分析功能
12.16.1空间函数参考
12.16.2空间函数的参数处理
12.16.3从WKT值创建几何值的函数
12.16.4从WKB值创建几何值的函数
12.16.5创建几何值的特定于MySQL的函数
12.16.6几何格式转换函数
12.16.7几何属性函数
12.16.8空间算子函数
12.16.9测试几何对象之间空间关系的函数
12.16.10空间Geohash函数
12.16.11空间GeoJSON函数
12.16.12空间便利函数
12.17 JSON函数
12.17.1 JSON函数参考
12.17.2创建JSON值的函数
12.17.3搜索JSON值的函数
12.17.4修改JSON值的函数
12.17.5返回JSON值属性的函数
12.17.6 JSON表函数
12.17.7 JSON模式验证函数
12.17.8 JSON实用程序函数
12.18与全局事务标识符(GTID)一起使用的函数
12.19 MySQL企业加密功能
12.19.1 MySQL Enterprise加密安装
12.19.2 MySQL Enterprise加密用法和示例
12.19.3 MySQL企业加密功能参考
12.19.4 MySQL企业加密功能描述
12.20聚合(GROUP BY)函数
12.20.1聚合(GROUP BY)功能描述
12.20.2 GROUP BY修饰符
12.20.3 GROUP BY的MySQL处理
12.20.4功能依赖性的检测
12.21窗口函数
12.21.1窗口功能描述
12.21.2窗口函数概念和语法
12.21.3窗口功能框架规范
12.21.4命名为Windows
12.21.5窗口函数限制
12.22性能模式函数
12.23内部功能
12.24其他功能
12.25精度数学
12.25.1数值的类型
12.25.2 DECIMAL数据类型特征
12.25.3表达处理
12.25.4舍入行为
12.25.5精确数学例子

表达式可以在几个点中使用 SQL 语句,比如在 ORDER BY HAVING 子句 SELECT 语句时,在 WHERE 一个条款 SELECT DELETE UPDATE 陈述,或 SET 陈述。 表达式可以使用文字值,列值, NULL 内置函数,存储函数,用户定义函数和运算符 来编写 本章描述了在MySQL中编写表达式所允许的函数和运算符。 第24.2节“使用存储的例程” 第29.4节“向MySQL添加新函数” 中给出了编写存储函数和用户定义函数的说明。 有关 描述服务器如何解释对不同类型函数的引用的规则 请参见 第9.2.4节“函数名称解析和解析”

除非在特定函数或运算符的文档中另有说明,否则 包含的表达式 NULL 始终会生成一个 NULL 值。

注意

默认情况下,函数名称和后面的括号之间不能有空格。 这有助于MySQL解析器区分函数调用和对恰好与函数同名的表或列的引用。 但是,允许使用函数参数周围的空格。

您可以通过使用该 --sql-mode=IGNORE_SPACE 选项 启动它来告诉MySQL服务器在函数名后面接受空格 (请参见 第5.1.11节“服务器SQL模式” 。)单个客户端程序可以使用 CLIENT_IGNORE_SPACE 选项for 来请求此行为 mysql_real_connect() 在任何一种情况下,所有函数名称都成为保留字。

为简洁起见,本章中的大多数示例都 以缩写形式 显示 mysql 程序 的输出 而不是以这种格式显示示例:

MySQL的> SELECT MOD(29,9);
+ ----------- +
| mod(29,9)|
+ ----------- +
| 2 |
+ ----------- +
1行(0.00秒)

使用此格式:

MySQL的> SELECT MOD(29,9);
        - > 2

12.1功能和操作员参考

表12.1函数和操作符

名称 描述
ABS() 返回绝对值
ACOS() 返回反余弦
ADDDATE() 将时间值(间隔)添加到日期值
ADDTIME() 添加时间
AES_DECRYPT() 使用AES解密
AES_ENCRYPT() 使用AES加密
AND && 逻辑和
ANY_VALUE() 抑制ONLY_FULL_GROUP_BY值拒绝
ASCII() 返回最左侧字符的数值
ASIN() 返回圆弧正弦
= 分配值(作为 SET 语句的 一部分 ,或作为 语句中 SET 子句的 一部分 UPDATE
:= 分配值
ASYMMETRIC_DECRYPT() 使用私钥或公钥解密密文
ASYMMETRIC_DERIVE() 从非对称密钥导出对称密钥
ASYMMETRIC_ENCRYPT() 使用私钥或公钥加密明文
ASYMMETRIC_SIGN() 从摘要生成签名
ASYMMETRIC_VERIFY() 验证签名是否与摘要匹配
ATAN() 返回反正切
ATAN2() ATAN() 返回两个参数的反正切
AVG() 返回参数的平均值
BENCHMARK() 反复执行表达式
BETWEEN ... AND ... 检查值是否在值范围内
BIN() 返回包含数字的二进制表示的字符串
BIN_TO_UUID() 将二进制UUID转换为字符串
BINARY 将字符串转换为二进制字符串
BIT_AND() 按位返回AND
BIT_COUNT() 返回设置的位数
BIT_LENGTH() 以位为单位返回参数长度
BIT_OR() 按位返回OR
BIT_XOR() 按位返回异或
& 按位AND
~ 按位反转
| 按位OR
^ 按位异或
CAN_ACCESS_COLUMN() 限内部使用
CAN_ACCESS_DATABASE() 限内部使用
CAN_ACCESS_TABLE() 限内部使用
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() 计算循环冗余校验值
CREATE_ASYMMETRIC_PRIV_KEY() 创建私钥
CREATE_ASYMMETRIC_PUB_KEY() 创建公钥
CREATE_DH_PARAMETERS() 生成共享DH密钥
CREATE_DIGEST() 从字符串生成摘要
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)
DECODE() 解码使用ENCODE()加密的字符串
DEFAULT() 返回表列的默认值
DEGREES() 将弧度转换为度数
DENSE_RANK() 其分区内当前行的排名,没有间隙
DES_DECRYPT() 解密一个字符串
DES_ENCRYPT() 加密字符串
DIV 整数除法
/ 分部运营商
ELT() 返回索引号处的字符串
ENCODE() 编码一个字符串
ENCRYPT() 加密字符串
= 平等的运营商
<=> NULL-safe等于运算符
EXP() 提升到的力量
EXPORT_SET() 返回一个字符串,使得对于值位中设置的每个位,您获得一个on字符串,并且对于每个未设置的位,您将获得一个关闭字符串
EXTRACT() 提取部分日期
ExtractValue() 使用XPath表示法从XML字符串中提取值
FIELD() 后续参数中第一个参数的索引(位置)
FIND_IN_SET() 第二个参数中第一个参数的索引(位置)
FIRST_VALUE() 窗口框架第一行的参数值
FLOOR() 返回不大于参数的最大整数值
FORMAT() 返回格式化为指定小数位数的数字
FORMAT_BYTES() 将字节数转换为带单位的值
FORMAT_PICO_TIME() 将时间(皮秒)转换为单位值
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;否则返回true。 否则是假的。
GTID_SUBTRACT() 返回集合中不在子集中的所有GTID。
HEX() 十进制或字符串值的十六进制表示
HOUR() 提取小时
ICU_VERSION() ICU库版本
IF() 如果/ else构造
IFNULL() Null 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_VIEW_WARNING_OR_ERROR() 限内部使用
INTERNAL_INDEX_COLUMN_CARDINALITY() 限内部使用
INTERNAL_INDEX_LENGTH() 限内部使用
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 NULL值测试
IS_USED_LOCK() 命名锁是否正在使用; 返回连接标识符,如果为true
IS_UUID() 参数是否是有效的UUID
ISNULL() 测试参数是否为NULL
JSON_ARRAY() 创建JSON数组
JSON_ARRAY_APPEND() 将数据附加到JSON文档
JSON_ARRAY_INSERT() 插入JSON数组
JSON_ARRAYAGG() 将结果集作为单个JSON数组返回
-> 评估路径后从JSON列返回值; 相当于JSON_EXTRACT()。
JSON_CONTAINS() JSON文档是否包含路径中的特定对象
JSON_CONTAINS_PATH() JSON文档是否包含路径中的任何数据
JSON_DEPTH() JSON文档的最大深度
JSON_EXTRACT() 从JSON文档返回数据
->> 在评估路径并取消引用结果后,从JSON列返回值; 相当于JSON_UNQUOTE(JSON_EXTRACT())。
JSON_INSERT() 将数据插入JSON文档
JSON_KEYS() 来自JSON文档的键数组
JSON_LENGTH() JSON文档中的元素数量
JSON_MERGE() (已弃用8.0.3) 合并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)
JSON_PRETTY() 以人类可读的格式打印JSON文档
JSON_QUOTE() 引用JSON文档
JSON_REMOVE() 从JSON文档中删除数据
JSON_REPLACE() 替换JSON文档中的值
JSON_SCHEMA_VALID() 根据JSON模式验证JSON文档; 如果文档针对模式进行验证,则返回TRUE / 1;否则返回FALSE / 0
JSON_SCHEMA_VALIDATION_REPORT() 根据JSON模式验证JSON文档; 以JSON格式返回有关验证结果的报告,包括成功或失败以及失败原因
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值是否有效
LAG() 行中滞后当前行的参数值
LAST_DAY 返回参数的月份的最后一天
LAST_INSERT_ID() 最后一次INSERT的AUTOINCREMENT列的值
LAST_VALUE() 窗口框架最后一行的参数值
LCASE() LOWER()的同义词
LEAD() 分区中行前导行的参数值
LEAST() 返回最小的参数
LEFT() 返回指定的最左边的字符数
<< 左移
LENGTH() 以字节为单位返回字符串的长度
< 不到运营商
<= 小于或等于运营商
LIKE 简单的模式匹配
LineString() 从Point值构造LineString
LN() 返回参数的自然对数
LOAD_FILE() 加载指定的文件
LOCALTIME() LOCALTIME NOW()的同义词
LOCALTIMESTAMP LOCALTIMESTAMP() NOW()的同义词
LOCATE() 返回第一次出现的子串的位置
LOG() 返回第一个参数的自然对数
LOG10() 返回参数的以10为底的对数
LOG2() 返回参数的base-2对数
LOWER() 以小写形式返回参数
LPAD() 返回字符串参数,使用指定的字符串进行左填充
LTRIM() 删除前导空格
MAKE_SET() 返回一组以逗号分隔的字符串,这些字符串具有相应的位设置位
MAKEDATE() 创建年份和年中的日期
MAKETIME() 从小时,分钟,秒创建时间
MASTER_POS_WAIT() 阻止,直到从站已读取并应用所有更新到指定位置
MATCH 执行全文搜索
MAX() 返回最大值
MBRContains() 一个几何的MBR是否包含另一个几何的MBR
MBRCoveredBy() 一个MBR是否被另一个MBR覆盖
MBRCovers() 一个MBR是否涵盖另一个MBR
MBRDisjoint() 两个几何形状的MBR是否不相交
MBREquals() 两个几何的MBR是否相等
MBRIntersects() 两个几何的MBR是否相交
MBROverlaps() 两个几何的MBR是否重叠
MBRTouches() 两种几何形状的MBR是否接触
MBRWithin() 一个几何的MBR是否在另一个几何的MBR内
MD5() 计算MD5校验和
MEMBER OF() 如果第一个操作数匹配作为第二个操作数传递的JSON数组的任何元素,则返回true(1),否则返回false(0)
MICROSECOND() 从参数返回微秒
MID() 返回从指定位置开始的子字符串
MIN() 返回最小值
- 减号运算符
MINUTE() 从论证中返回分钟
MOD() 归还剩下的
% MOD 模数运算符
MONTH() 从过去的日期返回月份
MONTHNAME() 返回月份名称
MultiLineString() 从LineString值构造MultiLineString
MultiPoint() 从Point值构造MultiPoint
MultiPolygon() 从Polygon值构造MultiPolygon
NAME_CONST() 导致列具有给定名称
NOT ! 否定价值
NOT BETWEEN ... AND ... 检查值是否不在值范围内
!= <> 不等于运营商
NOT IN() 检查值是否不在一组值内
NOT LIKE 简单模式匹配的否定
NOT REGEXP REGEXP的否定
NOW() 返回当前日期和时间
NTH_VALUE() 第N行窗口框架的参数值
NTILE() 其分区中当前行的存储桶编号。
NULLIF() 如果expr1 = expr2,则返回NULL
OCT() 返回包含数字的八进制表示的字符串
OCTET_LENGTH() LENGTH()的同义词
OR || 逻辑或
ORD() 返回参数最左侧字符的字符代码
PASSWORD() 计算并返回密码字符串
PERCENT_RANK() 百分比等级值
PERIOD_ADD() 将期间添加到年 - 月
PERIOD_DIFF() 返回句点之间的月数
PI() 返回pi的值
+ 加法运算符
Point() 从坐标构造点
Polygon() 从LineString参数构造多边形
POSITION() LOCATE()的同义词
POW() 将引发的参数返回到指定的幂
POWER() 将引发的参数返回到指定的幂
PS_CURRENT_THREAD_ID() 当前线程的性能架构线程ID
PS_THREAD_ID() 给定线程的性能架构线程ID
QUARTER() 从日期参数返回季度
QUOTE() 转义参数以在SQL语句中使用
RADIANS() 返回参数转换为弧度
RAND() 返回随机浮点值
RANDOM_BYTES() 返回一个随机字节向量
RANK() 其分区内当前行的排名,有差距
REGEXP string是否匹配正则表达式
REGEXP_INSTR() 匹配正则表达式的子串的起始索引
REGEXP_LIKE() string是否匹配正则表达式
REGEXP_REPLACE() 替换匹配正则表达式的子字符串
REGEXP_SUBSTR() 返回子串匹配正则表达式
RELEASE_ALL_LOCKS() 释放所有当前命名的锁
RELEASE_LOCK() 释放命名锁
REPEAT() 重复指定次数的字符串
REPLACE() 替换指定字符串的出现次数
REVERSE() 反转字符串中的字符
RIGHT() 返回指定的最右边的字符数
>> 右转
RLIKE string是否匹配正则表达式
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 比较声音
SPACE() 返回指定数量的空格的字符串
SQRT() 返回参数的平方根
ST_Area() 返回Polygon或MultiPolygon区域
ST_AsBinary() ST_AsWKB() 从内部几何格式转换为WKB
ST_AsGeoJSON() 从几何体生成GeoJSON对象
ST_AsText() ST_AsWKT() 从内部几何格式转换为WKT
ST_Buffer() 返回距离几何体的给定距离内的点的几何
ST_Buffer_Strategy() 为ST_Buffer()生成策略选项
ST_Centroid() 返回质心作为一个点
ST_Contains() 一个几何是否包含另一个
ST_ConvexHull() 返回几何体的凸包
ST_Crosses() 一个几何是否与另一个几何相交
ST_Difference() 两个几何的返回点集差异
ST_Dimension() 几何尺寸
ST_Disjoint() 一个几何是否与另一个几何脱节
ST_Distance() 一个几何与另一个几何的距离
ST_Distance_Sphere() 两个几何形状之间的最小地球距离
ST_EndPoint() LineString的终点
ST_Envelope() 返回几何的MBR
ST_Equals() 一个几何是否与另一个几何相等
ST_ExteriorRing() 返回Polygon的外环
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_InteriorRingN() 返回Polygon的第N个内环
ST_Intersection() 返回点设置两个几何的交集
ST_Intersects() 一个几何是否与另一个相交
ST_IsClosed() 几何是否封闭且简单
ST_IsEmpty() 占位符功能
ST_IsSimple() 几何是否简单
ST_IsValid() 几何是否有效
ST_LatFromGeoHash() 从geohash值返回纬度
ST_Latitude() 返回Point的纬度
ST_Length() 返回LineString的长度
ST_LineFromText() ST_LineStringFromText() 从WKT构造LineString
ST_LineFromWKB() ST_LineStringFromWKB() 从WKB构造LineString
ST_LongFromGeoHash() 从geohash值返回经度
ST_Longitude() 返回Point的经度
ST_MakeEnvelope() 两点左右的矩形
ST_MLineFromText() ST_MultiLineStringFromText() 从WKT构造MultiLineString
ST_MLineFromWKB() ST_MultiLineStringFromWKB() 从WKB构造MultiLineString
ST_MPointFromText() ST_MultiPointFromText() 从WKT构造MultiPoint
ST_MPointFromWKB() ST_MultiPointFromWKB() 从WKB构造MultiPoint
ST_MPolyFromText() ST_MultiPolygonFromText() 从WKT构造MultiPolygon
ST_MPolyFromWKB() ST_MultiPolygonFromWKB() 从WKB构造MultiPolygon
ST_NumGeometries() 返回几何集合中的几何数量
ST_NumInteriorRing() ST_NumInteriorRings() 返回多边形内圈的数量
ST_NumPoints() 返回LineString中的点数
ST_Overlaps() 一个几何是否与另一个重叠
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() LineString的起始点
ST_SwapXY() 交换X / Y坐标的返回参数
ST_SymDifference() 返回点设置两个几何的对称差异
ST_Touches() 一个几何是否接触另一个
ST_Transform() 变换几何的坐标
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() 在datetime表达式中添加间隔
TIMESTAMPDIFF() 从日期时间表达式中减去间隔
TO_BASE64() 返回转换为base-64字符串的参数
TO_DAYS() 返回转换为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在slave上执行。
WAIT_UNTIL_SQL_THREAD_AFTER_GTIDS() 等到给定的GTID在slave上执行。
WEEK() 返回周数
WEEKDAY() 返回工作日索引
WEEKOFYEAR() 返回日期的日历周(1-53)
WEIGHT_STRING() 返回字符串的权重字符串
XOR 逻辑异或
YEAR() 回归年份
YEARWEEK() 返回年份和星期

12.2表达式评估中的类型转换

当操作符与不同类型的操作数一起使用时,会发生类型转换以使操作数兼容。 某些转换是隐式发生的。 例如,MySQL会根据需要自动将字符串转换为数字,反之亦然。

MySQL的> SELECT 1+'1';
        - > 2
MySQL的> SELECT CONCAT(2,' test');
        - >'2测试'

也可以使用该 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 ,结果是真的。 无需转换。

  • 如果比较操作中的两个参数都是字符串,则将它们作为字符串进行比较。

  • 如果两个参数都是整数,则将它们作为整数进行比较。

  • 如果不与数字进行比较,十六进制值将被视为二进制字符串。

  • 如果其中一个参数是a TIMESTAMP DATETIME 列而另一个参数是常量,则在执行比较之前将常量转换为时间戳。 这样做是为了更友好的ODBC。 这不是针对参数的 IN() 为安全起见,在进行比较时始终使用完整的日期时间,日期或时间字符串。 例如,要在使用 BETWEEN 日期或时间值 时获得最佳结果 ,请使用 CAST() 显式将值转换为所需的数据类型。

    来自一个或多个表的单行子查询不被视为常量。 例如,如果子查询返回要与 DATETIME 进行比较的整数 ,则比较将作为两个整数完成。 整数不会转换为时间值。 要将操作数作为 DATETIME 进行比较 ,请使用 CAST() 显式转换子查询值 DATETIME

  • 如果其中一个参数是十进制值,则比较取决于另一个参数。 如果另一个参数是十进制或整数值,则将参数作为十进制值进行比较,如果另一个参数是浮点值,则将参数作为浮点值进行比较。

  • 在所有其他情况下,参数被比较为浮点(实数)。

有关将值从一种时间类型转换为另一种时间类型的信息,请参见 第11.3.6节“日期和时间类型之间的转换”

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_nameWHERE str_col= 1;

这样做的原因是,有许多不同的字符串可以转换为价值 1 ,例如 '1' ' 1' '1a'

使用浮点数(或转换为浮点数的值)的比较是近似的,因为这些数字是不精确的。 这可能会导致结果看起来不一致:

MySQL的> SELECT '18015376320243458' = 18015376320243458;
        - > 1
MySQL的> SELECT '18015376320243459' = 18015376320243459;
        - > 0

这样的结果可能会发生,因为值被转换为浮点数,它只有53位的精度并且可以进行舍入:

MySQL的> SELECT '18015376320243459'+0.0;
        - > 1.8015376320243e + 16

此外,从字符串到浮点以及从整数到浮点的转换不一定以相同的方式发生。 整数可以由CPU转换为浮点数,而字符串在涉及浮点乘法的运算中逐位转换。

显示的结果将因系统而异,并且可能受计算机体系结构或编译器版本或优化级别等因素的影响。 避免此类问题的一种方法是使用, CAST() 以便不将值隐式转换为浮点数:

MySQL的> SELECT CAST('18015376320243459' AS UNSIGNED) = 18015376320243459;
        - > 1

有关浮点比较的更多信息,请参见 第B.4.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 or的 无效值 DOUBLE

对于 D - > F - > D 转换,用于losslessness的充分条件是, 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 则使用。 长度取自 结果集元数据 max_length SELECT (请参见 第28.7.5节“C API数据结构” )。 这意味着您可以强制使用 BIGINT 而不是 INT 使用足够长的表达式:

CREATE TABLE t SELECT 000000000000000000000;

12.3运营商

表12.2运算符

名称 描述
AND && 逻辑和
= 分配值(作为 SET 语句的 一部分 ,或作为 语句中 SET 子句的 一部分 UPDATE
:= 分配值
BETWEEN ... AND ... 检查值是否在值范围内
BINARY 将字符串转换为二进制字符串
& 按位AND
~ 按位反转
| 按位OR
^ 按位异或
CASE 案例运营商
DIV 整数除法
/ 分部运营商
= 平等的运营商
<=> NULL-safe等于运算符
> 大于运营商
>= 大于或等于运营商
IN() 检查值是否在一组值内
IS 针对布尔值测试值
IS NOT 针对布尔值测试值
IS NOT NULL NOT NULL值测试
IS NULL NULL值测试
-> 评估路径后从JSON列返回值; 相当于JSON_EXTRACT()。
->> 在评估路径并取消引用结果后,从JSON列返回值; 相当于JSON_UNQUOTE(JSON_EXTRACT())。
<< 左移
< 不到运营商
<= 小于或等于运营商
LIKE 简单的模式匹配
MEMBER OF() 如果第一个操作数匹配作为第二个操作数传递的JSON数组的任何元素,则返回true(1),否则返回false(0)
- 减号运算符
% MOD 模数运算符
NOT ! 否定价值
NOT BETWEEN ... AND ... 检查值是否不在值范围内
!= <> 不等于运营商
NOT IN() 检查值是否不在一组值内
NOT LIKE 简单模式匹配的否定
NOT REGEXP REGEXP的否定
OR || 逻辑或
+ 加法运算符
REGEXP string是否匹配正则表达式
>> 右转
RLIKE string是否匹配正则表达式
SOUNDS LIKE 比较声音
* 乘法运算符
- 更改参数的符号
XOR 逻辑异或

12.3.1运营商优先顺序

运算符优先级显示在以下列表中,从最高优先级到最低优先级。 一行显示的运算符具有相同的优先级。

间隔
BINARY,COLLATE
- (一元减号),〜(一元位反转)
^
*,/,DIV,%,MOD
- ,+
<<,>>
|
=(比较),<=>,> =,>,<=,<,<>,!=,IS,LIKE,REGEXP,IN
之间,情况,时间,然后,那么
AND,&&
XOR
或者,||
=(赋值),:=

优先级 = 取决于它是用作比较运算符( = )还是用作赋值运算符( = )。 当作为比较操作符使用,它具有相同的优先级 <=> >= > <= < <> != IS LIKE REGEXP ,和 IN 当用作赋值运算符时,它具有相同的优先级 := 第13.7.5.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.3.2比较函数和运算符

表12.3比较运算符

名称 描述
BETWEEN ... AND ... 检查值是否在值范围内
COALESCE() 返回第一个非NULL参数
= 平等的运营商
<=> NULL-safe等于运算符
> 大于运营商
>= 大于或等于运营商
GREATEST() 返回最大的参数
IN() 检查值是否在一组值内
INTERVAL() 返回小于第一个参数的参数的索引
IS 针对布尔值测试值
IS NOT 针对布尔值测试值
IS NOT NULL NOT NULL值测试
IS NULL NULL值测试
ISNULL() 测试参数是否为NULL
LEAST() 返回最小的参数
< 不到运营商
<= 小于或等于运营商
LIKE 简单的模式匹配
NOT BETWEEN ... AND ... 检查值是否不在值范围内
!= <> 不等于运营商
NOT IN() 检查值是否不在一组值内
NOT LIKE 简单模式匹配的否定
STRCMP() 比较两个字符串

比较操作导致值为 1 TRUE ), 0 FALSE )或 NULL 这些操作适用于数字和字符串。 根据需要,字符串会自动转换为数字和数字。

以下关系比较运算符不仅可用于比较标量操作数,还可用于比较行操作数:

=> <> = <= <>!=

本节后面的那些操作符的描述详细说明了它们如何与行操作数一起使用。 有关行子查询上下文中行比较的其他示例,请参见 第13.2.11.5节“行子查询”

本节中的某些函数返回除 1 TRUE ), 0 FALSE )或之外的值 NULL LEAST() 并且 GREATEST() 是这些功能的例子; 第12.2节“表达式评估中的类型转换” 描述了由这些和类似函数执行的比较操作的规则,用于确定它们的返回值。

注意

在MySQL的 早期 版本中,当评估包含 LEAST() or 的表达式时 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,因此 计算结果为 11.(Bug#83895,Bug#25123839)

要将值转换为特定类型以进行比较,可以使用该 CAST() 函数。 可以使用将字符串值转换为不同的字符集 CONVERT() 请参见 第12.10节“强制转换函数和运算符”

默认情况下,字符串比较不区分大小写并使用当前字符集。 默认是 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 - 等于。 这个运算符像 = 运算符 一样执行相等比较 ,但返回 1 而不是 NULL 两个操作数都是 NULL 0 而不是 NULL 一个操作数 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))
    
  • 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

  • IS NOT NULL

    测试值是否不是 NULL

    MySQL的> SELECT 1 IS NOT NULL, 0 IS NOT NULL, NULL IS NOT NULL;
            - > 1,1,0
    
  • expr BETWEEN min AND max

    如果 expr 大于或等于 min expr 小于或等于 max ,则 BETWEEN 返回 1 ,否则返回 0 如果所有参数都是相同类型,则 这相当于表达式 否则,类型转换将根据 第12.2节“表达式评估中的类型转换”中 所述的规则进行 ,但应用于所有三个参数。 (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() 显式将值转换为所需的数据类型。 示例:如果将a DATETIME 与两个 DATE 进行比较 ,请将 DATE 转换 DATETIME 值。 如果使用字符串常量(例如与 '2001-1-1' a进行比较) DATE ,则将字符串强制转换为a 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'
    

    GREATEST() NULL 如果有任何参数则 返回 NULL

  • expr IN (value,...)

    返回 1 if expr 等于 IN 列表 中的任何值 ,否则返回 0 如果所有值都是常量,则根据类型 expr 和已排序 来评估它们 然后使用二分搜索完成对项目的搜索。 IN 如果 IN 值列表完全由常量组成, 这意味着 非常快 否则,类型转换将根据 第12.2节“表达式评估中的类型转换”中 所述的规则进行 ,但应用于所有参数。

    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');
    

    IN 列表中 的值数量 仅受 max_allowed_packet 限制

    为了符合SQL标准, 不仅 IN 返回 NULL 左侧的表达式 NULL ,而且还返回列表中没有匹配项且列表中的一个表达式 NULL

    IN() 语法也可用于编写某些类型的子查询。 请参见 第13.2.11.3节“带有ANY,IN或SOME的子查询”

  • expr NOT IN (value,...)

    这是一样的 NOT (expr IN (value,...))

  • 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

  • INTERVAL(N,N1,N2,N3,...)

    返回 0 如果 N < N1 1 如果 N < N2 等等或 -1 如果 N NULL 所有参数都被视为整数。 它要求 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
    
  • 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.3.3逻辑运算符

表12.4逻辑运算符

名称 描述
AND && 逻辑和
NOT ! 否定价值
OR || 逻辑或
XOR 逻辑异或

在SQL中,所有逻辑运算符来评估 TRUE FALSE NULL UNKNOWN )。 在MySQL中,这些实现为1( TRUE ),0( FALSE )和 NULL 大多数情况对于不同的SQL数据库服务器是常见的,尽管某些服务器可能会返回任何非零值 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版本中将删除对它的支持。 应调整应用程序以使用标准SQL NOT 运算符。

  • 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 启用了 弃用,则不适用, 因为在这种情况下, || 表示字符串连接。

  • 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.3.4赋值运算符

表12.5赋值运算符

名称 描述
= 分配值(作为 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;
    查询正常,1行受影响(0.00秒)
    匹配的行数:1已更改:1警告:0
    
    MySQL的> SELECT @var1;
            - > 1
    MySQL的> SELECT * FROM t1;
            - > 2,3,5,7
    

    虽然也可以使用 := 运算符 在单个SQL语句中设置和读取同一变量的值,但 不建议这样做。 第9.4节“用户定义的变量” 解释了为什么要避免这样做。

  • =

    此运算符用于在两种情况下执行值赋值,如下两段所述。

    SET 语句中, = 被视为赋值运算符,它使运算符左侧的用户变量采用其右侧的值。 (换句话说,当在 SET 语句中 使用时 = 被视为相同 := 。)右侧的值可以是文字值,另一个存储值的变量,或产生标量值的任何合法表达式,包括结果查询(假设此值是标量值)。 您可以在同一 SET 语句中 执行多个分配

    声明 SET 条款中 UPDATE = 也充当赋值运算符; 但是,在这种情况下,只要满足任何 WHERE 条件 ,它就会使运算符左侧的列成为赋予右侧的值 UPDATE 您可以在 语句 的同一 SET 子句中 进行多项赋值 UPDATE

    在任何其他上下文中, = 被视为 比较运算符

    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.5.1节“变量赋值的SET语法” 第13.2.12节“更新语法” 第13.2.11节“子查询语法”

12.4控制流功能

表12.6流量控制运算符

名称 描述
CASE 案例运营商
IF() 如果/ else构造
IFNULL() Null if / else构造
NULLIF() 如果expr1 = expr2,则返回NULL

  • CASE value WHEN [compare_value] THEN result [WHEN [compare_value] THEN result ...] [ELSE result] END

    CASE WHEN [condition] THEN result [WHEN [condition] THEN result ...] [ELSE result] END

    第一个 CASE 语法返回 result 第一个 为true的比较。 第二种语法返回第一个条件为true的结果。 如果没有比较或条件为真, 则返回 结果 ,或者 如果没有 部分。 value=compare_value ELSE NULL ELSE

    注意

    此处描述 expr 的语法 第13.6.5.1节“CASE语法”中 描述 的SQL 语句 略有不同 ,用于在存储程序中使用。 语句不能有一个 子句,它以for 而不是 CASE CASE CASE ELSE NULL END CASE END

    CASE 表达式结果 的返回类型 是所有结果值的聚合类型:

    • 如果所有类型都是数字,则聚合类型也是数字:

      • 如果至少一个参数是双精度,则结果为双精度。

      • 否则,如果至少有一个参数 DECIMAL ,则结果为 DECIMAL

      • 否则,结果是整数类型(有一个例外):

        • 如果所有的整数类型都是有符号或无符号的所有的结果都是一样的符号和精度最高的所有指定整数类型的(也就是 TINYINT SMALLINT MEDIUMINT INT ,或 BIGINT )。

        • 如果存在有符号和无符号整数类型的组合,则结果将被签名并且精度可能更高。 例如,如果类型是有符号 INT 和无符号的 INT ,则结果将被签名 BIGINT

        • 例外是无符号 BIGINT 与任何有符号整数类型的组合。 结果是 DECIMAL 具有足够的精度和规模0。

    • 如果所有类型都是 BIT ,结果是 BIT 否则, BIT 参数被视为类似于 BIGINT

    • 如果所有类型都是 YEAR ,结果是 YEAR 否则, YEAR 参数被视为类似于 INT

    • 如果所有类型都是字符串( CHAR VARCHAR ),则结果的 VARCHAR 最大长度由操作数的最长字符长度确定。

    • 如果所有类型都是字符或二进制字符串,则结果为 VARBINARY

    • SET 并被 ENUM 视为类似于 VARCHAR ; 结果是 VARCHAR

    • 如果所有类型都是 JSON ,结果是 JSON

    • 如果所有类型都是时间的,则结果是暂时的:

    • 如果所有类型都是 GEOMETRY ,结果是 GEOMETRY

    • 如果是任何类型 BLOB ,结果是 BLOB

    • 对于所有其他类型组合,结果是 VARCHAR

    • NULL 类型聚合会忽略 文字 操作数。

    mysql> SELECT CASE 1 WHEN 1 THEN 'one'
        - >     WHEN 2 THEN 'two' ELSE 'more' END;
            - >'一个'
    MySQL的> SELECT CASE WHEN 1>0 THEN 'true' ELSE 'false' END;
            - >'true'
    mysql> SELECT CASE BINARY 'B'
        - >     WHEN 'a' THEN 1 WHEN 'b' THEN 2 END;
            - > NULL
    
  • IF(expr1,expr2,expr3)

    如果 expr1 TRUE expr1 <> 0 expr1 <> NULL ),则 IF() 返回 expr2 否则,它返回 expr3

    注意

    还有一个 声明 ,与 此处描述 功能 不同 请参见 第13.6.5.2节“IF语法” IF IF()

    如果只有一个 expr2 expr3 明确 NULL ,则 IF() 函数 的结果类型 是非 NULL 表达式 的类型

    默认返回类型 IF() (在存储到临时表时可能很重要)计算如下:

    • 如果 expr2 expr3 生成一个字符串,结果是一个字符串。

      如果 expr2 expr3 都是字符串,则如果任一字符串区分大小写,则结果区分大小写。

    • 如果 expr2 expr3 生成浮点值,则结果为浮点值。

    • 如果 expr2 expr3 生成整数,则结果为整数。

    MySQL的> SELECT IF(1>2,2,3);
            - > 3
    MySQL的> SELECT IF(1<2,'yes','no');
            - >'是'
    MySQL的> SELECT IF(STRCMP('test','test1'),'no','yes');
            - >'不'
    
  • IFNULL(expr1,expr2)

    如果 expr1 不是 NULL ,则 IFNULL() 返回 expr1 ; 否则它会返回 expr2

    MySQL的> SELECT IFNULL(1,0);
            - > 1
    MySQL的> SELECT IFNULL(NULL,10);
            - > 10
    MySQL的> SELECT IFNULL(1/0,10);
            - > 10
    MySQL的> SELECT IFNULL(1/0,'yes');
            - >'是'
    

    的默认返回值类型 是更为 一般 两个表达式的,顺序 考虑基于表达式的表的情况,或者MySQL必须在内部存储 临时表中 返回的值的情况 IFNULL(expr1,expr2) STRING REAL INTEGER IFNULL()

    
    mysql> CREATE TABLE tmp SELECT IFNULL(1,'test') AS test;
    mysql>DESCRIBE tmp;
    + ------- + -------------- + ------ + ------ + --------- + --- ---- +
    | 领域| 输入| 空| 钥匙| 默认| 额外的|
    + ------- + -------------- + ------ + ------ + --------- + --- ---- +
    | 测试| varbinary(4)| 没有| | | |
    + ------- + -------------- + ------ + ------ + --------- + --- ---- +
    

    在此示例中, test 的类型 VARBINARY(4) (字符串类型)。

  • NULLIF(expr1,expr2)

    返回 NULL if 为true,否则返回 这是一样的 expr1 = expr2 expr1 CASE WHEN expr1 = expr2 THEN NULL ELSE expr1 END

    返回值与第一个参数的类型相同。

    MySQL的> SELECT NULLIF(1,1);
            - > NULL
    MySQL的> SELECT NULLIF(1,2);
            - > 1
    
    注意

    expr1 如果参数不相等, MySQL将评估 两次。

12.5字符串函数

表12.7字符串运算符

名称 描述
ASCII() 返回最左侧字符的数值
BIN() 返回包含数字的二进制表示的字符串
BIT_LENGTH() 以位为单位返回参数长度
CHAR() 返回传递的每个整数的字符
CHAR_LENGTH() 返回参数中的字符数
CHARACTER_LENGTH() CHAR_LENGTH()的同义词
CONCAT() 返回连接字符串
CONCAT_WS() 返回与分隔符连接
ELT() 返回索引号处的字符串
EXPORT_SET() 返回一个字符串,使得对于值位中设置的每个位,您获得一个on字符串,并且对于每个未设置的位,您将获得一个关闭字符串
FIELD() 后续参数中第一个参数的索引(位置)
FIND_IN_SET() 第二个参数中第一个参数的索引(位置)
FORMAT() 返回格式化为指定小数位数的数字
FROM_BASE64() 解码base64编码的字符串并返回结果
HEX() 十进制或字符串值的十六进制表示
INSERT() 在指定位置插入子字符串,直到指定的字符数
INSTR() 返回第一次出现的子串的索引
LCASE() LOWER()的同义词
LEFT() 返回指定的最左边的字符数
LENGTH() 以字节为单位返回字符串的长度
LIKE 简单的模式匹配
LOAD_FILE() 加载指定的文件
LOCATE() 返回第一次出现的子串的位置
LOWER() 以小写形式返回参数
LPAD() 返回字符串参数,使用指定的字符串进行左填充
LTRIM() 删除前导空格
MAKE_SET() 返回一组以逗号分隔的字符串,这些字符串具有相应的位设置位
MATCH 执行全文搜索
MID() 返回从指定位置开始的子字符串
NOT LIKE 简单模式匹配的否定
NOT REGEXP REGEXP的否定
OCT() 返回包含数字的八进制表示的字符串
OCTET_LENGTH() LENGTH()的同义词
ORD() 返回参数最左侧字符的字符代码
POSITION() LOCATE()的同义词
QUOTE() 转义参数以在SQL语句中使用
REGEXP string是否匹配正则表达式
REGEXP_INSTR() 匹配正则表达式的子串的起始索引
REGEXP_LIKE() string是否匹配正则表达式
REGEXP_REPLACE() 替换匹配正则表达式的子字符串
REGEXP_SUBSTR() 返回子串匹配正则表达式
REPEAT() 重复指定次数的字符串
REPLACE() 替换指定字符串的出现次数
REVERSE() 反转字符串中的字符
RIGHT() 返回指定的最右边的字符数
RLIKE string是否匹配正则表达式
RPAD() 追加指定次数的字符串
RTRIM() 删除尾随空格
SOUNDEX() 返回soundex字符串
SOUNDS LIKE 比较声音
SPACE() 返回指定数量的空格的字符串
STRCMP() 比较两个字符串
SUBSTR() 返回指定的子字符串
SUBSTRING() 返回指定的子字符串
SUBSTRING_INDEX() 在指定的分隔符出现次数之前从字符串返回子字符串
TO_BASE64() 返回转换为base-64字符串的参数
TRIM() 删除前导和尾随空格
UCASE() UPPER()的同义词
UNHEX() 返回包含数字的十六进制表示的字符串
UPPER() 转换为大写
WEIGHT_STRING() 返回字符串的权重字符串

NULL 如果结果的长度大于 max_allowed_packet 系统变量 的值,则 返回字符串值函数 请参见 第5.1.1节“配置服务器”

对于在字符串位置上操作的函数,第一个位置编号为1。

对于采用长度参数的函数,非整数参数将四舍五入为最接近的整数。

  • ASCII(str)

    返回字符串最左侧字符的数值 str 返回 0 if str 是否为空字符串。 NULL 如果 str 是,则 返回 NULL ASCII() 适用于8位字符。

    MySQL的> SELECT ASCII('2');
            - > 50
    MySQL的> SELECT ASCII(2);
            - > 50
    MySQL的> SELECT ASCII('dx');
            - > 100
    

    另请参见该 ORD() 功能。

  • BIN(N)

    返回二进制值的字符串表示形式 N ,其中 N longlong( BIGINT )数字。 这相当于 如果 是,则 返回 CONV(N,10,2) NULL N NULL

    MySQL的> SELECT BIN(12);
            - >'1100'
    
  • BIT_LENGTH(str)

    str 以位 为单位返回字符串的长度

    MySQL的> SELECT BIT_LENGTH('text');
            - > 32
    
  • CHAR(N,... [USING charset_name])

    CHAR() 将每个参数解释 N 为一个整数,并返回一个字符串,该字符串由这些整数的代码值给出的字符组成。 NULL 值被跳过。

    MySQL的> SELECT CHAR(77,121,83,81,'76');
            - >'MySQL'
    MySQL的> SELECT CHAR(77,77.3,'77.3');
            - >'MMM'
    

    CHAR() 大于255的参数将转换为多个结果字节。 例如, CHAR(256) 等同于 CHAR(1,0) CHAR(256*256) 等同于 CHAR(1,0,0)

    MySQL的> SELECT HEX(CHAR(1,0)), HEX(CHAR(256));
    + ---------------- + ---------------- +
    | 十六进制(CHAR(1,0))| HEX(CHAR(256))|
    + ---------------- + ---------------- +
    | 0100 | 0100 |
    + ---------------- + ---------------- +
    MySQL的> SELECT HEX(CHAR(1,0,0)), HEX(CHAR(256*256));
    + ------------------ + -------------------- +
    | 十六进制(CHAR(1,0,0))| HEX(CHAR(256 * 256))|
    + ------------------ + -------------------- +
    | 010000 | 010000 |
    + ------------------ + -------------------- +
    

    默认情况下, CHAR() 返回二进制字符串。 要在给定字符集中生成字符串,请使用optional USING 子句:

    MySQL的> SELECT CHARSET(CHAR(X'65')), CHARSET(CHAR(X'65' USING utf8));
    + ---------------------- + -------------------------- ------- +
    | CHARSET(CHAR(X'65'))| CHARSET(CHAR(X'65'使用utf8))|
    + ---------------------- + -------------------------- ------- +
    | 二进制| utf8 |
    + ---------------------- + -------------------------- ------- +
    

    如果 USING 给定并且结果字符串对于给定字符集是非法的,则发出警告。 此外,如果启用了严格的SQL模式,则结果 CHAR() 将变为 NULL

  • CHAR_LENGTH(str)

    返回字符串的长度 str ,以字符为单位。 多字节字符计为单个字符。 这意味着对于包含五个2字节字符的字符串, LENGTH() 返回 10 ,而 CHAR_LENGTH() 返回 5

  • CHARACTER_LENGTH(str)

    CHARACTER_LENGTH() 是...的同义词 CHAR_LENGTH()

  • CONCAT(str1,str2,...)

    返回连接参数产生的字符串。 可能有一个或多个参数。 如果所有参数都是非二进制字符串,则结果为非二进制字符串。 如果参数包含任何二进制字符串,则结果为二进制字符串。 数字参数将转换为其等效的非二进制字符串形式。

    CONCAT() NULL 如果有任何参数则 返回 NULL

    MySQL的> SELECT CONCAT('My', 'S', 'QL');
            - >'MySQL'
    MySQL的> SELECT CONCAT('My', NULL, 'QL');
            - > NULL
    MySQL的> SELECT CONCAT(14.3);
            - > '14 .3'
    

    对于带引号的字符串,可以通过将字符串放在彼此旁边来执行连接:

    MySQL的> SELECT 'My' 'S' 'QL';
            - >'MySQL'
    
  • CONCAT_WS(separator,str1,str2,...)

    CONCAT_WS() 代表Concatenate With Separator,是一种特殊的形式 CONCAT() 第一个参数是其余参数的分隔符。 在要连接的字符串之间添加分隔符。 分隔符可以是字符串,其余参数也可以。 如果是分隔符 NULL ,结果是 NULL

    MySQL的> SELECT CONCAT_WS(',','First name','Second name','Last Name');
            - >'名字,第二个名字,姓氏'
    MySQL的> SELECT CONCAT_WS(',','First name',NULL,'Last Name');
            - >'名字,姓氏'
    

    CONCAT_WS() 不会跳过空字符串。 但是,它会 NULL 在分隔符参数后 跳过任何 值。

  • ELT(N,str1,str2,str3,...)

    ELT() 返回 N 字符串列表 第th个元素: str1 if N = 1 str2 if N = 2 ,依此类推。 返回 NULL if N 小于 1 或大于参数的数量。 ELT() 是补充 FIELD()

    MySQL的> SELECT ELT(1, 'Aa', 'Bb', 'Cc', 'Dd');
            - >'Aa'
    MySQL的> SELECT ELT(4, 'Aa', 'Bb', 'Cc', 'Dd');
            - >'Dd'
    
  • EXPORT_SET(bits,on,off[,separator[,number_of_bits]])

    返回一个字符串,使得对于值中设置的每个位 bits ,您将获得一个 on 字符串,并且对于未在该值中设置的每个位,您将获得一个 off 字符串。 比特 bits 被从右到左(从低以高序位)检查。 字符串从左到右添加到结果中,由 separator 字符串 分隔 (默认为逗号字符 , )。 检查的位数由 number_of_bits 下式 给出 ,如果未指定,则默认值为64。 number_of_bits 如果大于64,则静默地剪切为64.它被视为无符号整数,因此值-1实际上与64相同。

    MySQL的> SELECT EXPORT_SET(5,'Y','N',',',4);
            - >'Y,N,Y,N'
    MySQL的> SELECT EXPORT_SET(6,'1','0',',',10);
            - >'0,1,1,0,0,0,0,0,0,0'
    
  • FIELD(str,str1,str2,str3,...)

    返回的索引(位置) str str1 str2 str3 ... 列表。 0 如果 str 找不到则 返回

    如果所有参数 FIELD() 都是字符串, 则将所有参数 作为字符串进行比较。 如果所有参数都是数字,则将它们作为数字进行比较。 否则,参数将被比较为double。

    如果 str NULL ,返回值是 0 因为 NULL 与任何值的失败相等性比较。 FIELD() 是补充 ELT()

    MySQL的> SELECT FIELD('Bb', 'Aa', 'Bb', 'Cc', 'Dd', 'Ff');
            - > 2
    MySQL的> SELECT FIELD('Gg', 'Aa', 'Bb', 'Cc', 'Dd', 'Ff');
            - > 0
    
  • FIND_IN_SET(str,strlist)

    N 如果字符串 str 位于 strlist N 字符串 组成 的字符串列表中 返回1到1范围内的值 字符串列表是由 , 字符 分隔的子字符串组成的字符串 如果第一个参数是常量字符串而第二个参数是类型列, 则优化 SET FIND_IN_SET() 函数以使用位算术。 返回 0 if str 不在 strlist 或if strlist 是空字符串。 NULL 如果任一参数是,则 返回 NULL 如果第一个参数包含逗号,则此函数无法正常工作( , )性格。

    MySQL的> SELECT FIND_IN_SET('b','a,b,c,d');
            - > 2
    
  • FORMAT(X,D[,locale])

    将数字格式化 X 为格式 '#,###,###.##' ,舍入到 D 小数位,并将结果作为字符串返回。 如果 D 是的话 0 ,则结果没有小数点或小数部分。

    可选的第三个参数允许指定区域设置用于结果编号的小数点,千位分隔符和分隔符之间的分组。 允许的区域设置值与 lc_time_names 系统变量 的合法值相同 (请参见 第10.15节“MySQL服务器区域设置支持” )。 如果未指定区域设置,则默认为 'en_US'

    MySQL的> SELECT FORMAT(12332.123456, 4);
            - > '12,332.1235'
    MySQL的> SELECT FORMAT(12332.1,4);
            - > '12,332.1000'
    MySQL的> SELECT FORMAT(12332.2,0);
            - > '12,332'
    MySQL的> SELECT FORMAT(12332.2,2,'de_DE');
            - > '12 .332,20'
    
  • FROM_BASE64(str)

    采用使用的base-64编码规则编码的字符串 TO_BASE64() ,并将解码结果作为二进制字符串返回。 结果是 NULL 参数是否是 NULL 有效的base-64字符串。 有关 TO_BASE64() 编码和解码规则的详细信息, 请参阅说明

    MySQL的> SELECT TO_BASE64('abc'), FROM_BASE64(TO_BASE64('abc'));
            - >'JWJj','abc'
    
  • HEX(str) HEX(N)

    对于字符串参数 str HEX() 返回十六进制字符串表示形式, str 其中每个字符的每个字节 str 都转换为两个十六进制数字。 (多字节字符因此变为两位以上。)此操作的反转由。执行 UNHEX() 功能

    对于数字参数 N HEX() 返回 N 被视为longlong( BIGINT )数字 的值的十六进制字符串表示形式 这相当于 该操作的反转由执行 CONV(N,10,16) CONV(HEX(N),16,10)

    MySQL的> SELECT X'616263', HEX('abc'), UNHEX(HEX('abc'));
            - >'abc',616263,'abc'
    MySQL的> SELECT HEX(255), CONV(HEX(255),16,10);
            - >'FF',255
    
  • INSERT(str,pos,len,newstr)

    返回字符串 str ,在位置开始子 pos len 长期被字符串替换的字符 newstr 如果 pos 不在 字符串 的长度内, 则返回原始 字符串。 pos 如果 len 不在字符串其余部分的长度内, 则从位置替换字符串 的其余部分。 NULL 如果有任何参数,则 返回 NULL

    MySQL的> SELECT INSERT('Quadratic', 3, 4, 'What');
            - >'QuWhattic'
    MySQL的> SELECT INSERT('Quadratic', -1, 4, 'What');
            - >'Quadratic'
    MySQL的> SELECT INSERT('Quadratic', 3, 100, 'What');
            - >'QuWhat'
    

    此功能是多字节安全的。

  • INSTR(str,substr)

    返回 substr string中 第一次出现的子 字符串的位置 str LOCATE() 除了参数的顺序相反之外,这 与双参数形式 相同。

    MySQL的> SELECT INSTR('foobarbar', 'bar');
            - > 4
    MySQL的> SELECT INSTR('xbar', 'foobar');
            - > 0
    

    此函数是多字节安全的,并且仅当至少一个参数是二进制字符串时才区分大小写。

  • LCASE(str)

    LCASE() 是...的同义词 LOWER()

    LCASE() LOWER() 存储视图的定义时,视图中 使用的内容将被重写 (缺陷号码#12844279)

  • LEFT(str,len)

    返回 len 字符串中 最左边的 字符 str ,或者 NULL 如果有任何参数 NULL

    MySQL的> SELECT LEFT('foobarbar', 5);
            - >'fooba'
    

    此功能是多字节安全的。

  • LENGTH(str)

    返回字符串的长度 str ,以字节为单位。 多字节字符计为多个字节。 这意味着对于包含五个2字节字符的字符串, LENGTH() 返回 10 ,而 CHAR_LENGTH() 返回 5

    MySQL的> SELECT LENGTH('text');
            - > 4
    
    注意

    Length() 开放GIS空间功能被命名为 ST_Length() MySQL中。

  • LOAD_FILE(file_name)

    读取文件并以字符串形式返回文件内容。 要使用此功能,文件必须位于服务器主机上,您必须指定文件的完整路径名,并且您必须具有该 FILE 权限。 该文件必须是服务器可读的,其大小小于 max_allowed_packet 字节。 如果 secure_file_priv 系统变量设置为非空目录名,则要加载的文件必须位于该目录中。 (在MySQL 8.0.17之前,文件必须是所有人都可读的,而不仅仅是服务器可读的。)

    如果由于不满足上述条件之一而导致文件不存在或无法读取,则返回该函数 NULL

    character_set_filesystem 系统变量控制给定为文字字符串文件名的解释。

    MySQL的> UPDATE t
                SET blob_col=LOAD_FILE('/tmp/picture')
                WHERE id=1;
    
  • LOCATE(substr,str) LOCATE(substr,str,pos)

    第一个语法返回 substr string中 第一次出现的substring的位置 str 第二种语法返回 substr string中 第一次出现的substring的 str 位置,从position开始 pos 0 如果 substr 不在,则 返回 str NULL 如果有任何参数,则 返回 NULL

    MySQL的> SELECT LOCATE('bar', 'foobarbar');
            - > 4
    MySQL的> SELECT LOCATE('xbar', 'foobar');
            - > 0
    MySQL的> SELECT LOCATE('bar', 'foobarbar', 5);
            - > 7
    

    此函数是多字节安全的,并且仅当至少一个参数是二进制字符串时才区分大小写。

  • LOWER(str)

    返回 str 根据当前字符集映射将所有字符更改为小写 的字符串 默认是 utf8mb4

    MySQL的> SELECT LOWER('QUADRATICALLY');
            - >'quadratically'
    

    LOWER() (并且 UPPER() 当施加到二进制字符串()是无效的 BINARY VARBINARY BLOB )。 要执行lettercase转换,请将字符串转换为非二进制字符串:

    mysql> SET @str = BINARY 'New York';
    mysql>SELECT LOWER(@str), LOWER(CONVERT(@str USING utf8mb4));
    + ------------- + ----------------------------------- -  +
    | LOWER(@str)| LOWER(CONVERT(@str使用utf8mb4))|
    + ------------- + ----------------------------------- -  +
    | 纽约| 纽约|
    + ------------- + ----------------------------------- -  +
    

    对于Unicode字符集 的排序规则 LOWER() UPPER() 根据排序规则名称中的Unicode排序规则算法(UCA)版本(如果有)和UCA 4.0.0(如果未指定版本)工作。 例如, utf8mb4_0900_ai_ci 并且 utf8_unicode_520_ci 根据分别UCA 9.0.0和5.2.0,工作,而 utf8_unicode_ci 作品根据UCA 4.0.0。 请参见 第10.10.1节“Unicode字符集”

    此功能是多字节安全的。

    LCASE() 视图中使用的内容将被重写为 LOWER()

  • LPAD(str,len,padstr)

    返回字符串 str ,用 字符串 左边填充 padstr len 字符 长度 如果 str 长于 len ,则返回值缩短为 len 字符。

    MySQL的> SELECT LPAD('hi',4,'??');
            - >'?? hi'
    MySQL的> SELECT LPAD('hi',1,'??');
            - >'h'
    
  • LTRIM(str)

    返回 str 删除了前导空格字符 的字符串

    MySQL的> SELECT LTRIM('  barbar');
            - >'barbar'
    

    此功能是多字节安全的。

  • MAKE_SET(bits,str1,str2,...)

    返回一个设置值(包含由 , 字符 分隔的子字符串的字符串 ),包含具有 bits set中 相应位的字符串 str1 对应于位0, str2 位1,依此类推。 NULL 在价值观 str1 str2 ... 不附加到该结果。

    MySQL的> SELECT MAKE_SET(1,'a','b','c');
            - >'a'
    MySQL的> SELECT MAKE_SET(1 | 4,'hello','nice','world');
            - >'你好,世界'
    MySQL的> SELECT MAKE_SET(1 | 4,'hello','nice',NULL,'world');
            - >'你好'
    MySQL的> SELECT MAKE_SET(0,'a','b','c');
            - >''
    
  • MID(str,pos,len)

    MID(str,pos,len) 是...的同义词 SUBSTRING(str,pos,len)

  • OCT(N)

    返回八进制值的字符串表示形式 N ,其中 N longlong( BIGINT )数字。 这相当于 如果 是,则 返回 CONV(N,10,8) NULL N NULL

    MySQL的> SELECT OCT(12);
            - >'14'
    
  • OCTET_LENGTH(str)

    OCTET_LENGTH() 是...的同义词 LENGTH()

  • ORD(str)

    如果字符串的最左边的字符 str 是多字节字符,则返回该字符的代码,使用以下公式从其组成字节的数值计算:

      (第1字节代码)
    +(第2字节代码* 256)
    +(第3字节代码* 256 ^ 2)...
    

    如果最左边的字符不是多字节字符,则 ORD() 返回与...相同的值 ASCII() 函数

    MySQL的> SELECT ORD('2');
            - > 50
    
  • POSITION(substr IN str)

    POSITION(substr IN str) 是...的同义词 LOCATE(substr,str)

  • QUOTE(str)

    引用字符串以生成可在SQL语句中用作正确转义的数据值的结果。 返回的字符串用单引号括起来,每个反斜杠( \ ),单引号( ' ),ASCII NUL 和Control + Z 实例都以反斜杠 开头。 如果参数是 NULL ,则返回值是单词 NULL 而不包含单引号。

    MySQL的> SELECT QUOTE('Don\'t!');
            - >'不要!'
    MySQL的> SELECT QUOTE(NULL);
            - > NULL
    

    为了比较,请参见 第9.1.1节“字符串文字” 第28.7.7.56节“mysql_real_escape_string_quote()”中 文字字符串的引用规则和C API中的引用规则

  • REPEAT(str,count)

    返回由字符串 str 重复 count 次数 组成的字符串 如果 count 小于1,则返回空字符串。 NULL 如果 str 或是, count 返回 NULL

    MySQL的> SELECT REPEAT('MySQL', 3);
            - >'MySQLMySQLMySQL'
    
  • REPLACE(str,from_str,to_str)

    返回 str 字符串 from_str 替换 为字符串 的所有 字符串 to_str REPLACE() 搜索时执行区分大小写的匹配 from_str

    MySQL的> SELECT REPLACE('www.mysql.com', 'w', 'Ww');
            - >'WwWwWw.mysql.com'
    

    此功能是多字节安全的。

  • REVERSE(str)

    返回字符串 str 顺序颠倒 的字符串

    MySQL的> SELECT REVERSE('abc');
            - >'cba'
    

    此功能是多字节安全的。

  • RIGHT(str,len)

    返回 len 字符串中 最右边的 字符 str ,或者 NULL 是否有任何参数 NULL

    MySQL的> SELECT RIGHT('foobarbar', 4);
            - >'rbar'
    

    此功能是多字节安全的。

  • RPAD(str,len,padstr)

    返回字符串 str ,右边用字符串填充 padstr 为一个 len 字符 长度 如果 str 长于 len ,则返回值缩短为 len 字符。

    MySQL的> SELECT RPAD('hi',5,'?');
            - >'你好???
    MySQL的> SELECT RPAD('hi',1,'?');
            - >'h'
    

    此功能是多字节安全的。

  • RTRIM(str)

    返回 str 删除了尾随空格字符 的字符串

    MySQL的> SELECT RTRIM('barbar   ');
            - >'barbar'
    

    此功能是多字节安全的。

  • SOUNDEX(str)

    从中返回soundex字符串 str 听起来几乎相同的两个弦应具有相同的soundex弦。 标准soundex字符串长度为四个字符,但该 SOUNDEX() 函数返回一个任意长的字符串。 您可以 SUBSTRING() 在结果上 使用 以获得标准的soundex字符串。 str 忽略 所有非字母字符 AZ范围之外的所有国际字母字符都被视为元音。

    重要

    使用时 SOUNDEX() ,您应该了解以下限制:

    • 目前实现的此功能旨在与仅使用英语的字符串一起使用。 其他语言的字符串可能无法产生可靠的结果。

    • 无法保证此函数能够为使用多字节字符集的字符串提供一致的结果,包括 utf-8 有关更多信息,请参阅Bug#22638。

    MySQL的> SELECT SOUNDEX('Hello');
            - >'H400'
    MySQL的> SELECT SOUNDEX('Quadratically');
            - >'Q36324'
    
    注意

    此函数实现了原始的Soundex算法,而不是更流行的增强版本(也由D. Knuth描述)。 区别在于原始版本首先丢弃元音并重复第二个元素,而增强版本首先丢弃重复元素,然后丢弃元音元素。

  • expr1 SOUNDS LIKE expr2

    这是一样的 SOUNDEX(expr1) = SOUNDEX(expr2)

  • SPACE(N)

    返回由 N 空格字符 组成的字符串

    MySQL的> SELECT SPACE(6);
            - >''
    
  • SUBSTR(str,pos) SUBSTR(str FROM pos) SUBSTR(str,pos,len) SUBSTR(str FROM pos FOR len)

    SUBSTR() 是...的同义词 SUBSTRING()

  • SUBSTRING(str,pos) SUBSTRING(str FROM pos) SUBSTRING(str,pos,len) SUBSTRING(str FROM pos FOR len)

    没有 len 参数 的表单 str 位置开始 返回字符串的子字符串 pos 带有 len 参数 的表单 len 从字符串 返回一个子字符串 字符 str ,从位置开始 pos 使用的表单 FROM 是标准SQL语法。 也可以使用负值 pos 在这种情况下,子字符串的开头是字符串 pos 末尾的字符,而不是字符串的开头。 负值可以用于 pos 该函数的任何形式。

    对于所有形式 SUBSTRING() ,将从中提取子字符串的字符串中第一个字符的位置计算为 1

    MySQL的> SELECT SUBSTRING('Quadratically',5);
            - >'ratically'
    MySQL的> SELECT SUBSTRING('foobarbar' FROM 4);
            - >'barbar'
    MySQL的> SELECT SUBSTRING('Quadratically',5,6);
            - >'ratica'
    MySQL的> SELECT SUBSTRING('Sakila', -3);
            - >'ila'
    MySQL的> SELECT SUBSTRING('Sakila', -5, 3);
            - >'aki'
    MySQL的> SELECT SUBSTRING('Sakila' FROM -4 FOR 2);
            - >'ki'
    

    此功能是多字节安全的。

    如果 len 小于1,则结果为空字符串。

  • SUBSTRING_INDEX(str,delim,count)

    str count 出现分隔符 之前 从字符串返回子字符串 delim 如果 count 为正,则返回最终分隔符左侧的所有内容(从左侧开始计算)。 如果 count 是否定的,则返回最终分隔符右侧的所有内容(从右侧开始计算)。 SUBSTRING_INDEX() 搜索时执行区分大小写的匹配 delim

    MySQL的> SELECT SUBSTRING_INDEX('www.mysql.com', '.', 2);
            - >'www.mysql'
    MySQL的> SELECT SUBSTRING_INDEX('www.mysql.com', '.', -2);
            - >'mysql.com'
    

    此功能是多字节安全的。

  • TO_BASE64(str)

    将字符串参数转换为base-64编码形式,并将结果作为带有连接字符集和排序规则的字符串返回。 如果参数不是字符串,则在转换发生之前将其转换为字符串。 结果是 NULL 如果参数是 NULL 可以使用该 FROM_BASE64() 函数对 Base-64编码的字符串进行解码

    MySQL的> SELECT TO_BASE64('abc'), FROM_BASE64(TO_BASE64('abc'));
            - >'JWJj','abc'
    

    存在不同的base-64编码方案。 这些是由所使用的编码和解码规则 TO_BASE64() FROM_BASE64()

    • 字母值62的编码是 '+'

    • 字母值63的编码是 '/'

    • 编码输出由4个可打印字符组成。 输入数据的每3个字节使用4个字符进行编码。 如果最后一个组不完整,则用 '=' 字符 填充 长度为4。

    • 在编码输出的每76个字符之后添加换行符以将长输出分成多行。

    • 解码识别并忽略换行符,回车符,制表符和空格。

  • TRIM([{BOTH | LEADING | TRAILING} [remstr] FROM] str) TRIM([remstr FROM] str)

    返回 删除 str 了所有 remstr 前缀或后缀 的字符串 如果没有给出说明符 BOTH LEADING 或者 TRAILING 给出 BOTH remstr 是可选的,如果未指定,则删除空格。

    MySQL的> SELECT TRIM('  bar   ');
            - >'酒吧'
    MySQL的> SELECT TRIM(LEADING 'x' FROM 'xxxbarxxx');
            - >'barxxx'
    MySQL的> SELECT TRIM(BOTH 'x' FROM 'xxxbarxxx');
            - >'酒吧'
    MySQL的> SELECT TRIM(TRAILING 'xyz' FROM 'barxxyz');
            - >'barx'
    

    此功能是多字节安全的。

  • UCASE(str)

    UCASE() 是...的同义词 UPPER()

    UCASE() 视图中使用的内容将被重写为 UPPER()

  • UNHEX(str)

    对于字符串参数 str 参数中的 每对字符解释为十六进制数,并将其转换为数字表示的字节。 返回值是二进制字符串。 UNHEX(str)

    MySQL的> SELECT UNHEX('4D7953514C');
            - >'MySQL'
    MySQL的> SELECT X'4D7953514C';
            - >'MySQL'
    MySQL的> SELECT UNHEX(HEX('string'));
            - >'string'
    MySQL的> SELECT HEX(UNHEX('1267'));
            - >'1267'
    

    在参数字符串中的字符必须是合法的十六进制数字: '0' ... '9' 'A' ... 'F' 'a' ... 'f' 如果参数包含任何非十六进制数字,则结果为 NULL

    MySQL的> SELECT UNHEX('GG');
    + ------------- +
    | UNHEX('GG')|
    + ------------- +
    | NULL |
    + ------------- +
    

    NULL 可发生的结果,如果该参数 UNHEX() 是一 BINARY ,列,因为值是用0x00填充字节存储时,但这些字节不剥离上检索。 例如, '41' 存储到 CHAR(3) 列中 '41 ' 并作为 '41' (带有尾随垫空间被剥离) 检索 ,因此 UNHEX() 对于列值返回 'A' 相比之下 '41' ,存储在一 BINARY(3) 列中 '41\0' 并检索为 '41\0' (尾部填充 0x00 字节未被剥离)。 '\0' 这不是一个合法的十六进制数字 UNHEX() 列值返回 NULL

    对于数字参数 N 不执行 倒数 改用。 请参阅说明 HEX(N) UNHEX() CONV(HEX(N),16,10) HEX()

  • UPPER(str)

    返回 str 根据当前字符集映射将所有字符更改为大写 的字符串 默认是 utf8mb4

    MySQL的> SELECT UPPER('Hej');
            - >'HEJ'
    

    有关 LOWER() 同样适用的信息, 请参阅说明 UPPER() 这包括有关如何执行二进制串的大小写转换信息( BINARY VARBINARY BLOB ),用于这些功能是无效的,以及约壳体折叠的Unicode字符集的信息。

    此功能是多字节安全的。

    UCASE() 视图中使用的内容将被重写为 UPPER()

  • WEIGHT_STRING(str [AS {CHAR|BINARY}(N)] [flags])

    此函数返回输入字符串的权重字符串。 返回值是二进制字符串,表示字符串的比较和排序值。 它具有以下属性:

    WEIGHT_STRING() 是一个供内部使用的调试功能。 它的行为可以在MySQL版本之间发生变化, 它可用于测试和调试排序规则,尤其是在添加新排序规则时。 请参见 第10.13节“将字符集添加到字符集”

    该列表简要总结了这些论点。 列表后面的讨论中给出了更多细节。

    • str :输入字符串表达式。

    • AS 子句:可选; 将输入字符串转换为给定的类型和长度。

    • flags : 可选的; 没用过。

    输入字符串 str 是字符串表达式。 如果输入是一个非二进制(字符)串,诸如 CHAR VARCHAR TEXT 值,则返回值将包含该字符串核对权重。 如果输入是二进制(字节)字符串,如a BINARY VARBINARY BLOB value,则返回值与输入相同(二进制字符串中每个字节的权重是字节值)。 如果输入是 NULL ,则 WEIGHT_STRING() 返回 NULL

    例子:

    mysql> SET @s = _utf8mb4 'AB' COLLATE utf8mb4_0900_ai_ci;
    mysql>SELECT @s, HEX(@s), HEX(WEIGHT_STRING(@s));
    + ------ + --------- + ------------------------ +
    | @s | 十六进制(@s)| HEX(WEIGHT_STRING(@s))|
    + ------ + --------- + ------------------------ +
    | AB | 4142 | 1C471C60 |
    + ------ + --------- + ------------------------ +
    
    mysql> SET @s = _utf8mb4 'ab' COLLATE utf8mb4_0900_ai_ci;
    mysql>SELECT @s, HEX(@s), HEX(WEIGHT_STRING(@s));
    + ------ + --------- + ------------------------ +
    | @s | 十六进制(@s)| HEX(WEIGHT_STRING(@s))|
    + ------ + --------- + ------------------------ +
    | ab | 6162 | 1C471C60 |
    + ------ + --------- + ------------------------ +
    
    mysql> SET @s = CAST('AB' AS BINARY);
    mysql>SELECT @s, HEX(@s), HEX(WEIGHT_STRING(@s));
    + ------ + --------- + ------------------------ +
    | @s | 十六进制(@s)| HEX(WEIGHT_STRING(@s))|
    + ------ + --------- + ------------------------ +
    | AB | 4142 | 4142 |
    + ------ + --------- + ------------------------ +
    
    mysql> SET @s = CAST('ab' AS BINARY);
    mysql>SELECT @s, HEX(@s), HEX(WEIGHT_STRING(@s));
    + ------ + --------- + ------------------------ +
    | @s | 十六进制(@s)| HEX(WEIGHT_STRING(@s))|
    + ------ + --------- + ------------------------ +
    | ab | 6162 | 6162 |
    + ------ + --------- + ------------------------ +
    

    前面的示例用于 HEX() 显示 WEIGHT_STRING() 结果。 因为结果是二进制值, HEX() 当结果包含非打印值时,特别有用,以可打印的形式显示它:

    mysql> SET @s = CONVERT(X'C39F' USING utf8) COLLATE utf8_czech_ci;
    mysql>SELECT HEX(WEIGHT_STRING(@s));
    + ------------------------ +
    | HEX(WEIGHT_STRING(@s))|
    + ------------------------ +
    | 0FEA0FEA |
    + ------------------------ +
    

    对于非 NULL 返回值,值的数据类型是 VARBINARY 其长度是否在最大长度内 VARBINARY ,否则数据类型为 BLOB

    AS 可以给出 子句以将输入字符串转换为非二进制或二进制字符串并将其强制为给定长度:

    • AS CHAR(N) 将字符串强制转换为非二进制字符串,并将其填充在右侧,并使用空格填充一定长度的 N 字符。 N 必须至少为1.如果 N 小于输入字符串的长度,则字符串将截断为 N 字符。 截断没有警告。

    • AS BINARY(N) 类似但是将字符串转换为二进制字符串, N 以字节(而不是字符)来度量,并且填充使用 0x00 字节(而不是空格)。

    mysql> SET NAMES 'latin1';
    mysql>SELECT HEX(WEIGHT_STRING('ab' AS CHAR(4)));
    + ------------------------------- +
    | HEX(WEIGHT_STRING('ab'AS CHAR(4)))|
    + ------------------------------- +
    | 41422020 |
    + ------------------------------- +
    mysql> SET NAMES 'utf8';
    mysql>SELECT HEX(WEIGHT_STRING('ab' AS CHAR(4)));
    + ------------------------------- +
    | HEX(WEIGHT_STRING('ab'AS CHAR(4)))|
    + ------------------------------- +
    | 0041004200200020 |
    + ------------------------------- +
    
    MySQL的> SELECT HEX(WEIGHT_STRING('ab' AS BINARY(4)));
    + --------------------------------------- +
    | HEX(WEIGHT_STRING('ab'AS BINARY(4)))|
    + --------------------------------------- +
    | 61620000 |
    + --------------------------------------- +
    

    flags 条款目前尚未使用。

12.5.1字符串比较函数

表12.8字符串比较运算符

名称 描述
LIKE 简单的模式匹配
NOT LIKE 简单模式匹配的否定
STRCMP() 比较两个字符串

如果字符串函数被赋予二进制字符串作为参数,则结果字符串也是二进制字符串。 转换为字符串的数字被视为二进制字符串。 这仅影响比较。

通常,如果字符串比较中的任何表达式区分大小写,则以区分大小写的方式执行比较。

  • expr LIKE pat [ESCAPE 'escape_char']

    使用SQL模式进行模式匹配。 返回 1 TRUE )或 0 FALSE )。 如果是, expr 或者 pat NULL ,结果是 NULL

    模式不必是文字字符串。 例如,它可以指定为字符串表达式或表列。

    根据SQL标准, LIKE 在每个字符的基础上执行匹配,因此它可以产生与 = 比较运算符 不同的结果

    MySQL的> SELECT 'ä' LIKE 'ae' COLLATE latin1_german2_ci;
    + ----------------------------------------- +
    | 'ä'LIKE'ae'COLLATE latin1_german2_ci |
    + ----------------------------------------- +
    | 0 |
    + ----------------------------------------- +
    MySQL的> SELECT 'ä' = 'ae' COLLATE latin1_german2_ci;
    + -------------------------------------- +
    | 'ä'='ae'COLLATE latin1_german2_ci |
    + -------------------------------------- +
    | 1 |
    + -------------------------------------- +
    

    特别是,尾随空格很重要,但 运营商 进行的比较 不符合 CHAR VARCHAR 比较 =

    MySQL的> SELECT 'a' = 'a ', 'a' LIKE 'a ';
    + ------------ + --------------- +
    | 'a'='a'| 'a'喜欢'a'|
    + ------------ + --------------- +
    | 1 | 0 |
    + ------------ + --------------- +
    1排(0.00秒)
    

    有了 LIKE 可以使用的图案以下两个通配符:

    • % 匹配任意数量的字符,甚至零个字符。

    • _ 恰好匹配一个字符。

    MySQL的> SELECT 'David!' LIKE 'David_';
            - > 1
    MySQL的> SELECT 'David!' LIKE '%D%v%';
            - > 1
    

    要测试通配符的文字实例,请在其前面加上转义字符。 如果您未指定 ESCAPE 字符, \ 则假定。

    • \% 匹配一个 % 字符。

    • \_ 匹配一个 _ 字符。

    MySQL的> SELECT 'David!' LIKE 'David\_';
            - > 0
    MySQL的> SELECT 'David_' LIKE 'David\_';
            - > 1
    

    要指定其他转义字符,请使用以下 ESCAPE 子句:

    MySQL的> SELECT 'David_' LIKE 'David|_' ESCAPE '|';
            - > 1
    

    转义序列应为空或一个字符长。 表达式必须在执行时计算为常量。 如果 NO_BACKSLASH_ESCAPES 启用 SQL模式,则序列不能为空。

    以下两个语句说明字符串比较不区分大小写,除非其中一个操作数区分大小写(使用区分大小写的排序规则或是二进制字符串):

    MySQL的> SELECT 'abc' LIKE 'ABC';
            - > 1
    MySQL的> SELECT 'abc' LIKE _utf8mb4 'ABC' COLLATE utf8mb4_0900_as_cs;
            - > 0
    MySQL的> SELECT 'abc' LIKE _utf8mb4 'ABC' COLLATE utf8mb4_bin;
            - > 0
    MySQL的> SELECT 'abc' LIKE BINARY 'ABC';
            - > 0
    

    作为标准SQL的扩展,MySQL允许 LIKE 使用数字表达式。

    MySQL的> SELECT 10 LIKE '1%';
            - > 1
    
    注意

    因为MySQL在字符串中使用C转义语法(例如, \n 表示换行符),所以必须 \ 将在 LIKE 字符串中 使用的 任何 一个 加倍 例如,要搜索 \n ,请将其指定为 \\n 要搜索 \ ,请将其指定为 \\\\ ; 这是因为反斜杠被解析器剥离一次,并且在进行模式匹配时再次剥离,留下一个反斜杠来匹配。

    例外:在模式字符串的末尾,反斜杠可以指定为 \\ 在字符串的末尾,反斜杠代表自己,因为没有任何东西可以逃脱。 假设一个表包含以下值:

    MySQL的> SELECT filename FROM t1;
    + -------------- +
    | 文件名|
    + -------------- +
    | C:|
    | C:\ |
    | C:\ Programs |
    | C:\ Programs \ |
    + -------------- +
    

    要测试以反斜杠结尾的值,可以使用以下任一模式匹配值:

    MySQL的> SELECT filename, filename LIKE '%\\' FROM t1;
    + -------------- + --------------------- +
    | 文件名| filename LIKE'%\\'|
    + -------------- + --------------------- +
    | C:| 0 |
    | C:\ | 1 |
    | C:\ Programs | 0 |
    | C:\ Programs \ | 1 |
    + -------------- + --------------------- +
    
    MySQL的> SELECT filename, filename LIKE '%\\\\' FROM t1;
    + -------------- + ----------------------- +
    | 文件名| 文件名LIKE'%\\\\'|
    + -------------- + ----------------------- +
    | C:| 0 |
    | C:\ | 1 |
    | C:\ Programs | 0 |
    | C:\ Programs \ | 1 |
    + -------------- + ----------------------- +
    
  • expr NOT LIKE pat [ESCAPE 'escape_char']

    这是一样的 NOT (expr LIKE pat [ESCAPE 'escape_char'])

    注意

    涉及 NOT LIKE 与包含列的比较的 聚合查询 NULL 可能会产生意外结果。 例如,请考虑以下表格和数据:

    CREATE TABLE foo(bar VARCHAR(10));
    
    INSERT INTO foo VALUES(NULL),(NULL);
    

    查询 SELECT COUNT(*) FROM foo WHERE bar LIKE '%baz%'; 返回 0 你可能会认为 SELECT COUNT(*) FROM foo WHERE bar NOT LIKE '%baz%'; 会返回 2 但是,情况并非如此:第二个查询返回 0 这是因为 无论价值如何, 总是返回 对于涉及 和使用 或的 比较的 聚合查询也是如此 在这种情况下,您必须明确测试 使用 (而不是 ),如下所示: NULL NOT LIKE expr NULL expr NULL NOT RLIKE NOT REGEXP NOT NULL OR AND

    SELECT COUNT(*)FROM foo WHERE bar NOT LIKE'%baz%'或bar is NULL;
    
  • STRCMP(expr1,expr2)

    STRCMP() 0 如果字符串相同, -1 如果第一个参数根据当前排序顺序小于第二个参数 返回 1 否则返回。

    MySQL的> SELECT STRCMP('text', 'text2');
            - > -1
    MySQL的> SELECT STRCMP('text2', 'text');
            - > 1
    MySQL的> SELECT STRCMP('text', 'text');
            - > 0
    

    STRCMP() 使用参数的排序规则执行比较。

    mysql> SET @s1 = _utf8mb4 'x' COLLATE utf8mb4_0900_ai_ci;
    mysql> SET @s2 = _utf8mb4 'X' COLLATE utf8mb4_0900_ai_ci;
    mysql> SET @s3 = _utf8mb4 'x' COLLATE utf8mb4_0900_as_cs;
    mysql> SET @s4 = _utf8mb4 'X' COLLATE utf8mb4_0900_as_cs;
    mysql>SELECT STRCMP(@s1, @s2), STRCMP(@s3, @s4);
    + ------------------ + ------------------ +
    | STRCMP(@ s1,@ s2)| STRCMP(@ s3,@ s4)|
    + ------------------ + ------------------ +
    | 0 | -1 |
    + ------------------ + ------------------ +
    

    如果排序规则不兼容,则必须将其中一个参数转换为与另一个相互兼容。 请参见 第10.8.4节“表达式中的校对强制性”

    mysql> SET @ s1 = _utf8mb4'x'COLLATE utf8mb4_0900_ai_ci;
    mysql> SET @ s2 = _utf8mb4'X'COLLATE utf8mb4_0900_ai_ci;
    mysql> SET @ s3 = _utf8mb4'x'COLLATE utf8mb4_0900_as_cs;
    mysql> SET @ s4 = _utf8mb4'X'COLLATE utf8mb4_0900_as_cs;
    - >
    MySQL的> SELECT STRCMP(@s1, @s3);
    ERROR 1267(HY000):非法混合排序(utf8mb4_0900_ai_ci,IMPLICIT)
    和(utf8mb4_0900_as_cs,IMPLICIT)用于操作'strcmp'
    MySQL的> SELECT STRCMP(@s1, @s3 COLLATE utf8mb4_0900_ai_ci);
    + --------------------------------------------- +
    | STRCMP(@ s1,@ s3 COLLATE utf8mb4_0900_ai_ci)|
    + --------------------------------------------- +
    | 0 |
    + --------------------------------------------- +
    

12.5.2正则表达式

表12.9正则表达式函数和运算符

名称 描述
NOT REGEXP REGEXP的否定
REGEXP string是否匹配正则表达式
REGEXP_INSTR() 匹配正则表达式的子串的起始索引
REGEXP_LIKE() string是否匹配正则表达式
REGEXP_REPLACE() 替换匹配正则表达式的子字符串
REGEXP_SUBSTR() 返回子串匹配正则表达式
RLIKE string是否匹配正则表达式

正则表达式是为复杂搜索指定模式的强大方法。 本节讨论可用于正则表达式匹配的函数和运算符,并通过示例说明可用于正则表达式运算的一些特殊字符和构造。 另请参见 第3.3.4.7节“模式匹配”

MySQL使用国际Unicode组件(ICU)实现正则表达式支持,ICU提供完整的Unicode支持并且是多字节安全的。 (在MySQL 8.0.4之前,MySQL使用Henry Spencer的正则表达式实现,它以字节方式运行并且不是多字节安全的。有关使用正则表达式的应用程序可能受实现更改影响的方式的信息,请参阅 正则表达式兼容性注意事项 。)

正则表达式函数和运算符

  • expr NOT REGEXP pat expr NOT RLIKE pat

    这是一样的 NOT (expr REGEXP pat)

  • expr REGEXP pat expr RLIKE pat

    如果字符串 expr 与模式指定的正则表达式匹配,则 返回1,否则返回 pat 0。 如果 expr 或者 pat NULL ,返回值是 NULL

    REGEXP 并且 RLIKE 是同义词 REGEXP_LIKE()

    有关如何进行匹配的其他信息,请参阅说明 REGEXP_LIKE()

    MySQL的> SELECT 'Michael!' REGEXP '.*';
    + ------------------------ +
    | “迈克尔!” REGEXP'。*'|
    + ------------------------ +
    | 1 |
    + ------------------------ +
    MySQL的> SELECT 'new*\n*line' REGEXP 'new\\*.\\*line';
    + --------------------------------------- +
    | 'new * \ n * line'REGEXP'new \\ *。\\ * line'|
    + --------------------------------------- +
    | 0 |
    + --------------------------------------- +
    MySQL的> SELECT 'a' REGEXP '^[a-d]';
    + --------------------- +
    | 'a'REGEXP'^ [ad]'|
    + --------------------- +
    | 1 |
    + --------------------- +
    MySQL的> SELECT 'a' REGEXP 'A', 'a' REGEXP BINARY 'A';
    + ---------------- + ----------------------- +
    | 'a'REGEXP'A'| 'a'REGEXP BINARY'A'|
    + ---------------- + ----------------------- +
    | 1 | 0 |
    + ---------------- + ----------------------- +
    
  • REGEXP_INSTR(expr, pat[, pos[, occurrence[, return_option[, match_type]]]])

    返回与 expr 模式指定的正则表达式匹配 的字符串子字符串的起始索引 pat ,如果没有匹配则返回0。 如果 expr 或者 pat NULL ,返回值是 NULL 字符索引从1开始。

    REGEXP_INSTR() 采用这些可选参数:

    • pos expr 开始搜索的位置。 如果省略,则默认值为1。

    • occurrence :要搜索哪个匹配项。 如果省略,则默认值为1。

    • return_option :返回哪种类型的职位。 如果此值为0,则 REGEXP_INSTR() 返回匹配的子字符串的第一个字符的位置。 如果此值为1,则 REGEXP_INSTR() 返回匹配的子字符串后面的位置。 如果省略,则默认值为0。

    • match_type :一个字符串,指定如何执行匹配。 含义如上所述 REGEXP_LIKE()

    有关如何进行匹配的其他信息,请参阅说明 REGEXP_LIKE()

    MySQL的> SELECT REGEXP_INSTR('dog cat dog', 'dog');
    + ------------------------------------ +
    | REGEXP_INSTR('狗猫狗','狗')|
    + ------------------------------------ +
    | 1 |
    + ------------------------------------ +
    MySQL的> SELECT REGEXP_INSTR('dog cat dog', 'dog', 2);
    + --------------------------------------- +
    | REGEXP_INSTR('狗猫狗','狗',2)|
    + --------------------------------------- +
    | 9 |
    + --------------------------------------- +
    MySQL的> SELECT REGEXP_INSTR('aa aaa aaaa', 'a{2}');
    + ------------------------------- +
    | REGEXP_INSTR('aa aaa aaaa','a {2}')|
    + ------------------------------- +
    | 1 |
    + ------------------------------- +
    MySQL的> SELECT REGEXP_INSTR('aa aaa aaaa', 'a{4}');
    + ------------------------------- +
    | REGEXP_INSTR('aa aaa aaaa','a {4}')|
    + ------------------------------- +
    | 8 |
    + ------------------------------- +
    
  • REGEXP_LIKE(expr, pat[, match_type])

    如果字符串 expr 与模式指定的正则表达式匹配,则 返回1,否则返回 pat 0。 如果 expr 或者 pat NULL ,返回值是 NULL

    该模式可以是扩展的正则表达式,其语法在 正则表达式语法中 讨论 模式不必是文字字符串。 例如,它可以指定为字符串表达式或表列。

    可选 match_type 参数是一个字符串,可以包含指定如何执行匹配的任何或所有以下字符:

    • c :区分大小写的匹配。

    • i :不区分大小写的匹配。

    • m :多行模式。 识别字符串中的行终止符。 默认行为是仅在字符串表达式的开头和结尾处匹配行终止符。

    • n . 字符匹配行终止符。 默认设置是 . 匹配以在行尾停止。

    • u :仅限Unix的行结尾。 只有换行字符识别为结束一条线 . ^ 以及 $ 匹配运算符。

    如果在其中指定了指定矛盾选项的字符 match_type ,则最右边的 字符 优先。

    默认情况下,正则表达式操作 在决定字符类型和执行比较时 使用 expr pat 参数 的字符集和排序规则 如果参数具有不同的字符集或排序规则,则应用强制性规则,如 第10.8.4节“表达式中的排序规范性”中所述 可以使用显式排序规则指定参数来更改比较行为。

    MySQL的> SELECT REGEXP_LIKE('CamelCase', 'CAMELCASE');
    + --------------------------------------- +
    | REGEXP_LIKE('CamelCase','CAMELCASE')|
    + --------------------------------------- +
    | 1 |
    + --------------------------------------- +
    MySQL的> SELECT REGEXP_LIKE('CamelCase', 'CAMELCASE' COLLATE utf8mb4_0900_as_cs);
    + ------------------------------------------------- ----------------- +
    | REGEXP_LIKE('CamelCase','CAMELCASE'COLLATE utf8mb4_0900_as_cs)|
    + ------------------------------------------------- ----------------- +
    | 0 |
    + ------------------------------------------------- ----------------- +
    

    match_type 可以使用 c i 字符 指定 覆盖默认区分大小写。 例外:如果任一参数是二进制字符串,则参数将以区分大小写的方式处理为二进制字符串,即使 match_type 包含该 i 字符也是如此。

    注意

    因为MySQL在字符串中使用C转义语法(例如, \n 表示换行符),所以必须 \ 将您在 expr pat 参数中 使用的 任何 一个 加倍

    MySQL的> SELECT REGEXP_LIKE('Michael!', '.*');
    + ------------------------------- +
    | REGEXP_LIKE('迈克尔!','。*')|
    + ------------------------------- +
    | 1 |
    + ------------------------------- +
    MySQL的> SELECT REGEXP_LIKE('new*\n*line', 'new\\*.\\*line');
    + ---------------------------------------------- +
    | REGEXP_LIKE('new * \ n * line','new \\ *。\\ * line')|
    + ---------------------------------------------- +
    | 0 |
    + ---------------------------------------------- +
    MySQL的> SELECT REGEXP_LIKE('a', '^[a-d]');
    + ---------------------------- +
    | REGEXP_LIKE('a','^ [ad]')|
    + ---------------------------- +
    | 1 |
    + ---------------------------- +
    MySQL的> SELECT REGEXP_LIKE('a', 'A'), REGEXP_LIKE('a', BINARY 'A');
    + ----------------------- + ------------------------- ----- +
    | REGEXP_LIKE('a','A')| REGEXP_LIKE('a',BINARY'A')|
    + ----------------------- + ------------------------- ----- +
    | 1 | 0 |
    + ----------------------- + ------------------------- ----- +
    
    MySQL的> SELECT REGEXP_LIKE('abc', 'ABC');
    + --------------------------- +
    | REGEXP_LIKE('abc','ABC')|
    + --------------------------- +
    | 1 |
    + --------------------------- +
    MySQL的> SELECT REGEXP_LIKE('abc', 'ABC', 'c');
    + -------------------------------- +
    | REGEXP_LIKE('abc','ABC','c')|
    + -------------------------------- +
    | 0 |
    + -------------------------------- +
    
  • REGEXP_REPLACE(expr, pat, repl[, pos[, occurrence[, match_type]]])

    将字符串 expr 中与模式指定的正则表达式匹配的匹配项 pat 替换为替换字符串 repl ,并返回结果字符串。 如果 expr pat 或者 repl 就是 NULL ,返回值 NULL

    REGEXP_REPLACE() 采用这些可选参数:

    • pos expr 开始搜索的位置。 如果省略,则默认值为1。

    • occurrence :要替换哪个匹配项。 如果省略,则默认值为0(表示 替换所有出现次数 )。

    • match_type :一个字符串,指定如何执行匹配。 含义如上所述 REGEXP_LIKE()

    在MySQL 8.0.17之前,此函数返回的结果使用了 UTF-16 字符集; 在MySQL 8.0.17及更高版本中,使用搜索匹配的表达式的字符集和排序规则。 (Bug#94203,Bug#29308212)

    有关如何进行匹配的其他信息,请参阅说明 REGEXP_LIKE()

    MySQL的> SELECT REGEXP_REPLACE('a b c', 'b', 'X');
    + ----------------------------------- +
    | REGEXP_REPLACE('ab c','b','X')|
    + ----------------------------------- +
    | 一个X c |
    + ----------------------------------- +
    MySQL的> SELECT REGEXP_REPLACE('abc def ghi', '[a-z]+', 'X', 1, 3);
    + ------------------------------------------------- --- +
    | REGEXP_REPLACE('abc def ghi','[az] +','X',1,3)|
    + ------------------------------------------------- --- +
    | abc def X |
    + ------------------------------------------------- --- +
    
  • REGEXP_SUBSTR(expr, pat[, pos[, occurrence[, match_type]]])

    如果没有匹配 返回与 expr 模式指定的正则表达式匹配 的字符串的子字符串 如果 或者 ,返回值是 pat NULL expr pat NULL NULL

    REGEXP_SUBSTR() 采用这些可选参数:

    • pos expr 开始搜索的位置。 如果省略,则默认值为1。

    • occurrence :要搜索哪个匹配项。 如果省略,则默认值为1。

    • match_type :一个字符串,指定如何执行匹配。 含义如上所述 REGEXP_LIKE()

    在MySQL 8.0.17之前,此函数返回的结果使用了 UTF-16 字符集; 在MySQL 8.0.17及更高版本中,使用搜索匹配的表达式的字符集和排序规则。 (Bug#94203,Bug#29308212)

    有关如何进行匹配的其他信息,请参阅说明 REGEXP_LIKE()

    MySQL的> SELECT REGEXP_SUBSTR('abc def ghi', '[a-z]+');
    + ---------------------------------------- +
    | REGEXP_SUBSTR('abc def ghi','[az] +')|
    + ---------------------------------------- +
    | abc |
    + ---------------------------------------- +
    MySQL的> SELECT REGEXP_SUBSTR('abc def ghi', '[a-z]+', 1, 3);
    + ---------------------------------------------- +
    | REGEXP_SUBSTR('abc def ghi','[az] +',1,3)|
    + ---------------------------------------------- +
    | ghi |
    + ---------------------------------------------- +
    

正则表达式语法

正则表达式描述了一组字符串。 最简单的正则表达式是其中没有特殊字符的表达式。 例如,正则表达式 hello 匹配 hello ,没有别的。

非平凡的正则表达式使用某些特殊结构,以便它们可以匹配多个字符串。 例如,正则表达式 hello|world 包含 | 交替运算符并匹配 hello world

作为一个更复杂的实例中,正则表达式 B[an]*s 匹配的任何串的 Bananas Baaaaas Bs ,和任何其他字符串开头的 B ,与结束 s ,和含有任何数目的 a n 在字符之间。

以下列表介绍了可在正则表达式中使用的一些基本特殊字符和构造。 有关用于实现正则表达式支持的ICU库支持的完整正则表达式语法的信息,请访问 International Components for Unicode网站

  • ^

    匹配字符串的开头。

    mysql> SELECT REGEXP_LIKE('fo\nfo', '^fo$');                   - > 0
    mysql> SELECT REGEXP_LIKE('fofo', '^fo');                      - > 1
    
  • $

    匹配字符串的结尾。

    mysql> SELECT REGEXP_LIKE('fo\no', '^fo\no$');                 - > 1
    mysql> SELECT REGEXP_LIKE('fo\no', '^fo$');                    - > 0
    
  • .

    匹配任何字符(包括回车符和换行符,但要在字符串中间匹配这些字符, 必须给出 m (多行)匹配控制字符或 (?m) 模式内修饰符)。

    mysql> SELECT REGEXP_LIKE('fofo', '^f.*$');                    - > 1
    mysql> SELECT REGEXP_LIKE('fo\r\nfo', '^f.*$');                - > 0
    mysql> SELECT REGEXP_LIKE('fo\r\nfo', '^f.*$', 'm');           - > 1
    mysql> SELECT REGEXP_LIKE('fo\r\nfo', '(?m)^f.*$');           - > 1
    
  • a*

    匹配零个或多个 a 字符的 任何序列

    mysql> SELECT REGEXP_LIKE('Ban', '^Ba*n');                     - > 1
    mysql> SELECT REGEXP_LIKE('Baaan', '^Ba*n');                   - > 1
    mysql> SELECT REGEXP_LIKE('Bn', '^Ba*n');                      - > 1
    
  • a+

    匹配一个或多个 a 字符的 任何序列

    mysql> SELECT REGEXP_LIKE('Ban', '^Ba+n');                     - > 1
    mysql> SELECT REGEXP_LIKE('Bn', '^Ba+n');                      - > 0
    
  • a?

    匹配零个或一个 a 字符。

    mysql> SELECT REGEXP_LIKE('Bn', '^Ba?n');                      - > 1
    mysql> SELECT REGEXP_LIKE('Ban', '^Ba?n');                     - > 1
    mysql> SELECT REGEXP_LIKE('Baan', '^Ba?n');                    - > 0
    
  • de|abc

    轮换; 匹配任一序列 de abc

    mysql> SELECT REGEXP_LIKE('pi', 'pi|apa');                     - > 1
    mysql> SELECT REGEXP_LIKE('axe', 'pi|apa');                    - > 0
    mysql> SELECT REGEXP_LIKE('apa', 'pi|apa');                    - > 1
    mysql> SELECT REGEXP_LIKE('apa', '^(pi|apa)$');                - > 1
    mysql> SELECT REGEXP_LIKE('pi', '^(pi|apa)$');                 - > 1
    mysql> SELECT REGEXP_LIKE('pix', '^(pi|apa)$');                - > 0
    
  • (abc)*

    匹配序列的零个或多个实例 abc

    mysql> SELECT REGEXP_LIKE('pi', '^(pi)*$');                    - > 1
    mysql> SELECT REGEXP_LIKE('pip', '^(pi)*$');                   - > 0
    mysql> SELECT REGEXP_LIKE('pipi', '^(pi)*$');                  - > 1
    
  • {1} {2,3}

    重复; 表示法提供了一种更通用的方法来编写正则表达式,这些正则表达式匹配模式的前一个原子(或 片段 )的 多次出现 并且 是整数。 {n} {m,n} m n

    • a*

      可以写成 a{0,}

    • a+

      可以写成 a{1,}

    • a?

      可以写成 a{0,1}

    更确切地说, 匹配完全匹配的 实例 匹配 或更多的实例 通过 实例 匹配 ,包括在内。 如果两个 给出, 必须小于或等于 a{n} n a a{n,} n a a{m,n} m n a m n m n

    mysql> SELECT REGEXP_LIKE('abcde', 'a[bcd]{2}e');              - > 0
    mysql> SELECT REGEXP_LIKE('abcde', 'a[bcd]{3}e');              - > 1
    mysql> SELECT REGEXP_LIKE('abcde', 'a[bcd]{1,10}e');           - > 1
    
  • [a-dX] [^a-dX]

    匹配任何字符,该字符(或不是,如果 ^ 被使用)任一 a b c d X - 其它两个字符之间的字符形成一个所有字符从所述第一字符向所述第二匹配范围。 例如, [0-9] 匹配任何十进制数字。 要包含文字 ] 字符,它必须紧跟在左括号后面 [ 要包含文字 - 字符,必须先写入或最后写入。 任何在a内没有特定含义的字符 [] 对只匹配自己。

    mysql> SELECT REGEXP_LIKE('aXbc', '[a-dXYZ]');                 - > 1
    mysql> SELECT REGEXP_LIKE('aXbc', '^[a-dXYZ]$');               - > 0
    mysql> SELECT REGEXP_LIKE('aXbc', '^[a-dXYZ]+$');              - > 1
    mysql> SELECT REGEXP_LIKE('aXbc', '^[^a-dXYZ]+$');             - > 0
    mysql> SELECT REGEXP_LIKE('gheis', '^[^a-dXYZ]+$');            - > 1
    mysql> SELECT REGEXP_LIKE('gheisa', '^[^a-dXYZ]+$');           - > 0
    
  • [=character_class=]

    在括号表达式(使用 [ 编写 ] )中, [=character_class=] 表示等价类。 它匹配具有相同排序值的所有字符,包括其自身。 例如,如果 o (+) 是一个等价类的成员, [[=o=]] [[=(+)=]] ,和 [o(+)] 都是同义。 等价类不能用作范围的端点。

  • [:character_class:]

    在括号表达式(使用 [ 编写 ] )中, [:character_class:] 表示与属于该类的所有字符匹配的字符类。 下表列出了标准类名。 这些名称代表 ctype(3) 手册页中 定义的字符类 特定区域设置可以提供其他类名。 字符类不能用作范围的端点。

    字符类名称 含义
    alnum 字母数字字符
    alpha 字母字符
    blank 空白字符
    cntrl 控制字符
    digit 数字字符
    graph 图形字符
    lower 小写字母字符
    print 图形或空格字符
    punct 标点字符
    space 空格,制表符,换行符和回车符
    upper 大写字母字符
    xdigit 十六进制数字字符
    mysql> SELECT REGEXP_LIKE('justalnums', '[[:alnum:]]+');       - > 1
    mysql> SELECT REGEXP_LIKE('!!', '[[:alnum:]]+');               - > 0
    

要在正则表达式中使用特殊字符的文字实例,请在其前面加上两个反斜杠(\)字符。 MySQL解析器解释其中一个反斜杠,正则表达式库解释另一个反斜杠。 例如,要匹配 1+2 包含特殊 + 字符 的字符串 ,只有以下正则表达式中的最后一个是正确的:

mysql> SELECT REGEXP_LIKE('1+2', '1+2');                       - > 0
mysql> SELECT REGEXP_LIKE('1+2', '1\+2');                      - > 0
mysql> SELECT REGEXP_LIKE('1+2', '1\\+2');                     - > 1

正则表达式资源控制

REGEXP_LIKE() 和类似的函数使用可以通过设置系统变量来控制的资源:

  • 匹配引擎将内存用于其内部堆栈。 要以字节为单位控制堆栈的最大可用内存,请设置 regexp_stack_limit 系统变量。

  • 匹配引擎分步运行。 要控制引擎执行的最大步数(以及间接执行时间),请设置 regexp_time_limit 系统变量。 由于此限制表示为步数,因此仅间接影响执行时间。 通常,它大约为毫秒。

正则表达式兼容性注意事项

在MySQL 8.0.4之前,MySQL使用Henry Spencer正则表达式库来支持正则表达式操作,而不是使用Unicode的国际组件(ICU)。 以下讨论描述了可能影响应用程序的Spencer和ICU库之间的差异:

  • 使用Spencer库, REGEXP RLIKE 运算符以字节方式工作,因此它们不是多字节安全的,并且可能会产生多字节字符集的意外结果。 此外,这些运算符通过字节值比较字符,并且即使给定的排序规则将重音字符视为相等,重音字符也可能无法比较。

    ICU具有完整的Unicode支持并且是多字节安全的。 它的正则表达式函数将所有字符串视为 UTF-16 您应该记住,位置索引基于16位块而不是代码点。 这意味着,当传递给这些函数时,使用多个块的字符可能会产生意外结果,如下所示:

    MySQL的> SELECT REGEXP_INSTR('🍣🍣b', 'b');
    + -------------------------- +
    | REGEXP_INSTR('?? b','b')|
    + -------------------------- +
    | 5 |
    + -------------------------- +
    1排(0.00秒)
    
    MySQL的> SELECT REGEXP_INSTR('🍣🍣bxxx', 'b', 4);
    + -------------------------------- +
    | REGEXP_INSTR('?? bxxx','b',4)|
    + -------------------------------- +
    | 5 |
    + -------------------------------- +
    1排(0.00秒)
    

    Unicode基本多语言平面中的字符(包括大多数现代语言使用的字符)在这方面是安全的:

    MySQL的> SELECT REGEXP_INSTR('бжb', 'b');
    + ---------------------------- +
    | REGEXP_INSTR('бжb','b')|
    + ---------------------------- +
    | 3 |
    + ---------------------------- +
    1排(0.00秒)
    
    MySQL的> SELECT REGEXP_INSTR('עבb', 'b');
    + ---------------------------- +
    | REGEXP_INSTR('עבb','b')|
    + ---------------------------- +
    | 3 |
    + ---------------------------- +
    1排(0.00秒)
    
    MySQL的> SELECT REGEXP_INSTR('µå周çб', '周');
    + ------------------------------------ +
    | REGEXP_INSTR('μå周çб','周')|
    + ------------------------------------ +
    | 3 |
    + ------------------------------------ +
    1排(0.00秒)
    

    表情符号,例如 前两个例子中使用 寿司 字符 🍣 (U + 1F363),不包括在基本多语言平面中,而是包含在Unicode的辅助多语言平面中。 表情符号和其他4字节字符可能会出现另一个问题 REGEXP_SUBSTR() 或类似的功能开始在角色中间搜索。 以下示例中的两个语句中的每一个都从第一个参数中的第二个2字节位置开始。 第一个语句适用于仅由2字节(BMP)字符组成的字符串。 第二个语句包含4字节字符,这些字符在结果中被错误地解释,因为前两个字节被剥离,因此字符数据的其余部分未对齐。

    MySQL的> SELECT REGEXP_SUBSTR('周周周周', '.*', 2);
    + ---------------------------------------- +
    | REGEXP_SUBSTR('周周周周','。*',2)|
    + ---------------------------------------- +
    | 周周周|
    + ---------------------------------------- +
    1排(0.00秒)
    
    MySQL的> SELECT REGEXP_SUBSTR('🍣🍣🍣🍣', '.*', 2);
    + -------------------------------- +
    | REGEXP_SUBSTR('????','。*',2)|
    + -------------------------------- +
    | ?㳟揘㳟揘㳟揘|
    + -------------------------------- +
    1排(0.00秒)
    
  • 对于 . 运算符,Spencer库将字符串终止符(回车符,换行符)与字符串表达式中的任何位置匹配,包括在中间。 要匹配字符串中间的行终止符和ICU,请指定 m 匹配控制字符。

  • Spencer库支持单词开头和单词结束边界标记( [[:<:]] 以及 [[:>:]] 表示法)。 ICU没有。 对于ICU,您可以使用 \b 匹配字边界; 加倍反斜杠,因为MySQL将其解释为字符串中的转义字符。

  • Spencer库支持整理元素括号表达式( [.characters.] 表示法)。 ICU没有。

  • 对于重复计数( {n} {m,n} 表示法),Spencer库最多为255.虽然可以通过设置 regexp_time_limit 系统变量 来限制匹配引擎步骤的最大数量,但ICU没有此限制

  • ICU将括号解释为元字符。 ( 在正则表达式中 指定文字左括号 ,必须对其进行转义:

    MySQL的> SELECT REGEXP_LIKE('(', '(');
    ERROR 3692(HY000):正则表达式中的括号不匹配。
    MySQL的> SELECT REGEXP_LIKE('(', '\\(');
    + ------------------------- +
    | REGEXP_LIKE('(','\\(')|
    + ------------------------- +
    | 1 |
    + ------------------------- +
    

12.5.3函数结果的字符集和校对

MySQL有许多返回字符串的运算符和函数。 本节回答了这样一个问题:这种字符串的字符集和整理是什么?

对于采用字符串输入并将字符串结果作为输出返回的简单函数,输出的字符集和排序规则与主输入值的字符集和排序规则相同。 例如, 返回一个字符串和排序规则相同的字符串 这同样适用于 ,和 UPPER(X) X INSTR() LCASE() LOWER() LTRIM() MID() REPEAT() REPLACE() REVERSE() RIGHT() RPAD() RTRIM() SOUNDEX() SUBSTRING() TRIM() UCASE() UPPER()

注意

REPLACE() 与所有其他函数不同, 函数始终忽略字符串输入的排序规则并执行区分大小写的比较。

如果字符串输入或函数结果是二进制字符串,则该字符串具有 binary 字符集和排序规则。 这可以通过使用 CHARSET() COLLATION() 函数 来检查 ,这两个函数都返回 binary 二进制字符串参数:

MySQL的> SELECT CHARSET(BINARY 'a'), COLLATION(BINARY 'a');
+ --------------------- + ----------------------- +
| CHARSET(BINARY'a')| COLLATION(BINARY'a')|
+ --------------------- + ----------------------- +
| 二进制| 二进制|
+ --------------------- + ----------------------- +

对于组合多个字符串输入并返回单个字符串输出的操作, 标准SQL 聚合规则 适用于确定结果的排序 规则

  • 如果发生显式 ,请使用 COLLATE Y Y

  • 如果显式 发生,则引发错误。 COLLATE Y COLLATE Z

  • 否则,如果所有归类都是 Y ,请使用 Y

  • 否则,结果没有排序规则。

例如,使用 ,得到的校对是 这同样适用于 ,和 CASE ... WHEN a THEN b WHEN b THEN c COLLATE X END X UNION || CONCAT() ELT() GREATEST() IF() LEAST()

对于转换为字符数据的操作,字符集和从该操作得到的字符串核对由定义 character_set_connection collation_connection 用于确定默认的连接字符集和归类的系统变量(见 第10.4节,“连接字符集和校对” ) 。 这仅适用于 BIN_TO_UUID() CAST() CONV() FORMAT() HEX() ,和 SPACE()

对于虚拟生成列的表达式,会出现前一个原则的例外情况。 在这样的表达式中,表的字符集被用于 BIN_TO_UUID() CONV() HEX() 结果,而不管连接字符集。

如果对字符串函数返回的结果的字符集或排序规则有任何疑问,请使用 CHARSET() COLLATION() 函数查找:

MySQL的> SELECT USER(), CHARSET(USER()), COLLATION(USER());
+ ---------------- + ----------------- + -------------- ----- +
| USER()| CHARSET(USER())| COLLATION(USER())|
+ ---------------- + ----------------- + -------------- ----- +
| 测试@ localhost | utf8 | utf8_general_ci |
+ ---------------- + ----------------- + -------------- ----- +
MySQL的> SELECT CHARSET(COMPRESS('abc')), COLLATION(COMPRESS('abc'));
+ -------------------------- + ---------------------- ------ +
| CHARSET(COMPRESS('abc'))| COLLATION(COMPRESS('abc'))|
+ -------------------------- + ---------------------- ------ +
| 二进制| 二进制|
+ -------------------------- + ---------------------- ------ +

12.6数字函数和运算符

表12.10数字函数和运算符

名称 描述
ABS() 返回绝对值
ACOS() 返回反余弦
ASIN() 返回圆弧正弦
ATAN() 返回反正切
ATAN2() ATAN() 返回两个参数的反正切
CEIL() 返回不小于参数的最小整数值
CEILING() 返回不小于参数的最小整数值
CONV() 转换不同数字基数之间的数字
COS() 返回余弦
COT() 归还余切
CRC32() 计算循环冗余校验值
DEGREES() 将弧度转换为度数
DIV 整数除法
/ 分部运营商
EXP() 提升到的力量
FLOOR() 返回不大于参数的最大整数值
LN() 返回参数的自然对数
LOG() 返回第一个参数的自然对数
LOG10() 返回参数的以10为底的对数
LOG2() 返回参数的base-2对数
- 减号运算符
MOD() 归还剩下的
% MOD 模数运算符
PI() 返回pi的值
+ 加法运算符
POW() 将引发的参数返回到指定的幂
POWER() 将引发的参数返回到指定的幂
RADIANS() 返回参数转换为弧度
RAND() 返回随机浮点值
ROUND() 围绕论点
SIGN() 返回参数的符号
SIN() 返回参数的正弦值
SQRT() 返回参数的平方根
TAN() 返回参数的正切值
* 乘法运算符
TRUNCATE() 截断到指定的小数位数
- 更改参数的符号

12.6.1算术运算符

表12.11算术运算符

名称 描述
DIV 整数除法
/ 分部运营商
- 减号运算符
% MOD 模数运算符
+ 加法运算符
* 乘法运算符
- 更改参数的符号

通常的算术运算符可用。 结果根据以下规则确定:

  • ,和 的情况下 - 如果两个操作数都是整数, 则以 (64位)精度 计算结果 + * BIGINT

  • 如果两个操作数都是整数且其中任何一个都是无符号的,则结果是无符号整数。 对于减法,如果 NO_UNSIGNED_SUBTRACTION 启用 SQL模式,即使任何操作数未签名,结果也会被签名。

  • 如果任何一个操作数 + - / * % 是一个真正的或字符串值,其结果的精度与最大精度运算的精度。

  • 在执行的除法中 / ,使用两个精确值操作数时的结果比例是第一个操作数的比例加上 div_precision_increment 系统变量 的值 (默认为4)。 例如,表达式的结果 5.05 / 0.014 具有六个小数位( 360.714286 的比例

这些规则适用于每个操作,因此嵌套计算意味着每个组件的精度。 因此, (14620 / 9432456) / (24250 / 9432456) 首先解析 (0.0014) / (0.0026) ,最终结果有8个小数位( 0.60288653 )。

由于这些规则及其应用方式,应注意确保计算的组件和子组件使用适当的精度级别。 请参见 第12.10节“强制转换函数和运算符”

有关在数值表达式求值中处理溢出的信息,请参见 第11.2.6节“超出范围和溢出处理”

算术运算符适用于数字。 对于其他类型的值,可以使用替代操作。 例如,要添加日期值,请使用 DATE_ADD() ; 请参见 第12.7节“日期和时间函数”

  • +

    加成:

    MySQL的> SELECT 3+5;
            - > 8
    
  • -

    减法:

    MySQL的> SELECT 3-5;
            - > -2
    
  • -

    一元减。 此运算符更改操作数的符号。

    MySQL的> SELECT - 2;
            - > -2
    
    注意

    如果此运算符与a一起使用 BIGINT ,则返回值也是a BIGINT 这意味着您应该避免使用 - 值为-2 63的 整数

  • *

    乘法:

    MySQL的> SELECT 3*5;
            - > 15
    MySQL的> SELECT 18014398509481984*18014398509481984.0;
            - > 324518553658426726783156020576256.0
    MySQL的> SELECT 18014398509481984*18014398509481984;
            - >超出范围的错误
    

    最后一个表达式产生错误,因为整数乘法的结果超过了64位 BIGINT 计算 范围 (参见 第11.2节“数字类型” 。)

  • /

    师:

    MySQL的> SELECT 3/5;
            - > 0.60
    

    除以零产生 NULL 结果:

    MySQL的> SELECT 102/(1-1);
            - > NULL
    

    BIGINT 仅当在其结果转换为整数的上下文中执行时,才 使用 算术 计算除法

  • DIV

    整数除法。 从除法中丢弃会导致小数点右边的任何小数部分。

    如果任一操作数具有非整数类型,则 在将结果转换为之前 ,操作数将转换为 DECIMAL 并使用 DECIMAL 算术进行 除法 BIGINT 如果结果超出 BIGINT 范围,则会发生错误。

    MySQL的> SELECT 5 DIV 2, -5 DIV 2, 5 DIV -2, -5 DIV -2;
            - > 2,-2,-2,2
    
  • N % M N MOD M

    模数运算。 返回 N 除以 的余数 M 欲了解更多信息,请参阅说明 MOD() 功能 节12.6.2,“数学函数”

12.6.2数学函数

表12.12数学函数

名称 描述
ABS() 返回绝对值
ACOS() 返回反余弦
ASIN() 返回圆弧正弦
ATAN() 返回反正切
ATAN2() ATAN() 返回两个参数的反正切
CEIL() 返回不小于参数的最小整数值
CEILING() 返回不小于参数的最小整数值
CONV() 转换不同数字基数之间的数字
COS() 返回余弦
COT() 归还余切
CRC32() 计算循环冗余校验值
DEGREES() 将弧度转换为度数
EXP() 提升到的力量
FLOOR() 返回不大于参数的最大整数值
LN() 返回参数的自然对数
LOG() 返回第一个参数的自然对数
LOG10() 返回参数的以10为底的对数
LOG2() 返回参数的base-2对数
MOD() 归还剩下的
PI() 返回pi的值
POW() 将引发的参数返回到指定的幂
POWER() 将引发的参数返回到指定的幂
RADIANS() 返回参数转换为弧度
RAND() 返回随机浮点值
ROUND() 围绕论点
SIGN() 返回参数的符号
SIN() 返回参数的正弦值
SQRT() 返回参数的平方根
TAN() 返回参数的正切值
TRUNCATE() 截断到指定的小数位数

所有数学函数 NULL 在发生错误时 返回

  • ABS(X)

    返回绝对值 X

    MySQL的> SELECT ABS(2);
            - > 2
    MySQL的> SELECT ABS(-32);
            - > 32
    

    此功能可安全地与 BIGINT 一起使用

  • ACOS(X)

    返回反余弦值 X ,即余弦值为的值 X 返回 NULL 如果 X 不在范围内 -1 1

    MySQL的> SELECT ACOS(1);
            - > 0
    MySQL的> SELECT ACOS(1.0001);
            - > NULL
    MySQL的> SELECT ACOS(0);
            - > 1.5707963267949
    
  • ASIN(X)

    返回正弦 X 值的正弦值,即正弦值 X 返回 NULL 如果 X 不在范围内 -1 1

    MySQL的> SELECT ASIN(0.2);
            - > 0.20135792079033
    MySQL的> SELECT ASIN('foo');
    
    + ------------- +
    | ASIN('foo')|
    + ------------- +
    | 0 |
    + ------------- +
    1排,1警告(0.00秒)
    
    MySQL的> SHOW WARNINGS;
    + --------- + ------ + -------------------------------- --------- +
    | 等级| 代码| 消息|
    + --------- + ------ + -------------------------------- --------- +
    | 警告| 1292 | 截断不正确的DOUBLE值:'foo'|
    + --------- + ------ + -------------------------------- --------- +
    
  • ATAN(X)

    返回 X 其正切值的反正切值 X

    MySQL的> SELECT ATAN(2);
            - > 1.1071487177941
    MySQL的> SELECT ATAN(-2);
            - > -1.1071487177941
    
  • ATAN(Y,X) ATAN2(Y,X)

    返回两个变量的反正切 X Y 它类似于计算反正切 ,除了两个参数的符号用于确定结果的象限。 Y / X

    MySQL的> SELECT ATAN(-2,2);
            - > -0.78539816339745
    MySQL的> SELECT ATAN2(PI(),0);
            - > 1.5707963267949
    
  • CEIL(X)

    CEIL() 是...的同义词 CEILING()

  • CEILING(X)

    返回不小于的最小整数值 X

    MySQL的> SELECT CEILING(1.23);
            - > 2
    MySQL的> SELECT CEILING(-1.23);
            - > -1
    

    对于精确值数字参数,返回值具有精确值数字类型。 对于字符串或浮点参数,返回值具有浮点类型。

  • CONV(N,from_base,to_base)

    转换不同数字基数之间的数字。 返回数字的字符串表示形式 N ,从base转换 from_base 为base to_base NULL 如果有任何参数,则 返回 NULL 该参数 N 被解释为整数,但可以指定为整数或字符串。 最小基数是 2 ,最大基数是 36 如果 from_base 是负数, N 则视为带符号的数字。 否则, N 被视为未签名。 CONV() 使用64位精度。

    MySQL的> SELECT CONV('a',16,2);
            - >'1010'
    MySQL的> SELECT CONV('6E',18,8);
            - >'172'
    MySQL的> SELECT CONV(-17,10,-18);
            - >'-H'
    MySQL的> SELECT CONV(10+'10'+'10'+X'0a',10,10);
            - > '40'
    
  • COS(X)

    返回余弦 X X 以弧度为单位给出。

    MySQL的> SELECT COS(PI());
            - > -1
    
  • COT(X)

    返回的余切 X

    MySQL的> SELECT COT(12);
            - > -1.5726734063977
    MySQL的> SELECT COT(0);
            - >超出范围的错误
    
  • CRC32(expr)

    计算循环冗余校验值并返回32位无符号值。 结果是 NULL 如果参数是 NULL 该参数应该是一个字符串,并且(如果可能的话)被视为一个,如果不是的话。

    MySQL的> SELECT CRC32('MySQL');
            - > 3259397556
    MySQL的> SELECT CRC32('mysql');
            - > 2501908538
    
  • DEGREES(X)

    返回 X 从弧度转换为度数 的参数

    MySQL的> SELECT DEGREES(PI());
            - > 180
    MySQL的> SELECT DEGREES(PI() / 2);
            - > 90
    
  • EXP(X)

    返回 e 的值 (自然对数的基数)提升到的幂 X 此函数的反函数是 LOG() (仅使用单个参数)或 LN()

    MySQL的> SELECT EXP(2);
            - > 7.3890560989307
    MySQL的> SELECT EXP(-2);
            - > 0.13533528323661
    MySQL的> SELECT EXP(0);
            - > 1
    
  • FLOOR(X)

    返回不大于的最大整数值 X

    MySQL的> SELECT FLOOR(1.23), FLOOR(-1.23);
            - > 1,-2
    

    对于精确值数字参数,返回值具有精确值数字类型。 对于字符串或浮点参数,返回值具有浮点类型。

  • FORMAT(X,D)

    将数字格式化 X 为格式 '#,###,###.##' ,舍入到 D 小数位,并将结果作为字符串返回。 有关详细信息,请参见 第12.5节“字符串函数”

  • HEX(N_or_S)

    此函数可用于获取十进制数或字符串的十六进制表示形式; 它的表达方式根据参数的类型而有所不同。 有关详细信息,请参见 第12.5节“字符串函数”中的 此函数的说明

  • LN(X)

    返回自然对数 X ; 也就是碱基 ê 的对数 X 如果 X 小于或等于0.0E0,函数返回 NULL 和警告 的对数无效参数 报道。

    MySQL的> SELECT LN(2);
            - > 0.69314718055995
    MySQL的> SELECT LN(-2);
            - > NULL
    

    这个功能就是代名词 该函数的反函数是 函数。 LOG(X) EXP()

  • LOG(X) LOG(B,X)

    如果使用一个参数调用,则此函数返回自然对数 X 如果 X 小于或等于0.0E0,函数返回 NULL 和警告 的对数无效参数 报道。

    此函数的反函数(使用单个参数调用时)是 EXP() 函数。

    MySQL的> SELECT LOG(2);
            - > 0.69314718055995
    MySQL的> SELECT LOG(-2);
            - > NULL
    

    如果使用两个参数调用,则此函数返回 X 基数 的对数 B 如果 X 小于或等于0,或者 B 小于或等于1,则 NULL 返回。

    MySQL的> SELECT LOG(2,65536);
            - > 16
    MySQL的> SELECT LOG(10,100);
            - > 2
    MySQL的> SELECT LOG(1,100);
            - > NULL
    

    LOG(B,X) 相当于 LOG(X) / LOG(B)

  • LOG2(X)

    返回的基数为2的对数 X 如果 X 小于或等于0.0E0,函数返回 NULL 和警告 的对数无效参数 报道。

    MySQL的> SELECT LOG2(65536);
            - > 16
    MySQL的> SELECT LOG2(-100);
            - > NULL
    

    LOG2() 有助于找出一个数字需要存储的位数。 此函数等效于表达式 LOG(X) / LOG(2)

  • LOG10(X)

    返回基数为10的对数 X 如果 X 小于或等于0.0E0,函数返回 NULL 和警告 的对数无效参数 报道。

    MySQL的> SELECT LOG10(2);
            - > 0.30102999566398
    MySQL的> SELECT LOG10(100);
            - > 2
    MySQL的> SELECT LOG10(-100);
            - > NULL
    

    LOG10(X) 相当于 LOG(10,X)

  • MOD(N,M) N % M N MOD M

    模数运算。 返回 N 除以 的余数 M

    MySQL的> SELECT MOD(234, 10);
            - > 4
    MySQL的> SELECT 253 % 7;
            - > 1
    MySQL的> SELECT MOD(29,9);
            - > 2
    MySQL的> SELECT 29 MOD 9;
            - > 2
    

    此功能可安全地与 BIGINT 一起使用

    MOD() 也适用于具有小数部分的值,并在除法后返回精确的余数:

    MySQL的> SELECT MOD(34.5,3);
            - > 1.5
    

    MOD(N,0) 回报 NULL

  • PI()

    返回π(pi)的值。 显示的默认小数位数为7,但MySQL在内部使用完整的双精度值。

    MySQL的> SELECT PI();
            - > 3.141593
    MySQL的> SELECT PI()+0.000000000000000000;
            - > 3.141592653589793116
    
  • POW(X,Y)

    返回 X raise的幂值 Y

    MySQL的> SELECT POW(2,2);
            - > 4
    MySQL的> SELECT POW(2,-2);
            - > 0.25
    
  • POWER(X,Y)

    这是一个同义词 POW()

  • RADIANS(X)

    返回参数 X ,从度数转换为弧度。 (注意π弧度等于180度。)

    MySQL的> SELECT RADIANS(90);
            - > 1.5707963267949
    
  • RAND([N])

    返回 <= < v 范围内 的随机浮点值 要获取 范围 <= < 的随机整数 ,请使用表达式 - 例如,要获取范围 <= < 范围内的随机整数 ,请使用以下语句: 0 v 1.0 R i R j FLOOR(i + RAND() * (j i)) 7 R 12

    SELECT FLOOR(7 +(RAND()* 5));
    

    如果 N 指定 了整数参数 ,则将其用作种子值:

    • 使用常量初始化参数,在执行之前,在准备语句时初始化种子。

    • 使用非常量初始值设定项参数(例如列名称),使用每次调用的值初始化种子 RAND()

    这种行为的一个含义是,对于相等的参数值, 每次都返回相同的值,从而产生可重复的列值序列。 在下面的示例中,生成的值序列在 它出现的两个位置都是相同的。 RAND(N) RAND(3)

    
    MySQL的> CREATE TABLE t (i INT);
    查询OK,0行受影响(0.42秒)
    
    MySQL的> INSERT INTO t VALUES(1),(2),(3);
    查询OK,3行受影响(0.00秒)
    记录:3个重复:0个警告:0
    
    MySQL的> SELECT i, RAND() FROM t;
    + ------ + ------------------ +
    | 我| 兰德()|
    + ------ + ------------------ +
    | 1 | 0.61914388706828 |
    | 2 | 0.93845168309142 |
    | 3 | 0.83482678498591 |
    + ------ + ------------------ +
    3组(0.00秒)
    
    MySQL的> SELECT i, RAND(3) FROM t;
    + ------ + ------------------ +
    | 我| 兰德(3)|
    + ------ + ------------------ +
    | 1 | 0.90576975597606 |
    | 2 | 0.37307905813035 |
    | 3 | 0.14808605345719 |
    + ------ + ------------------ +
    3组(0.00秒)
    
    MySQL的> SELECT i, RAND() FROM t;
    + ------ + ------------------ +
    | 我| 兰德()|
    + ------ + ------------------ +
    | 1 | 0.35877890638893 |
    | 2 | 0.28941420772058 |
    | 3 | 0.37073435016976 |
    + ------ + ------------------ +
    3组(0.00秒)
    
    MySQL的> SELECT i, RAND(3) FROM t;
    + ------ + ------------------ +
    | 我| 兰德(3)|
    + ------ + ------------------ +
    | 1 | 0.90576975597606 |
    | 2 | 0.37307905813035 |
    | 3 | 0.14808605345719 |
    + ------ + ------------------ +
    3行(0.01秒)
    

    RAND() WHERE 子句中计算每一行(从一个表中选择时)或行组合(从多表连接中选择时)。 因此,出于优化程序的目的, RAND() 它不是常量值,不能用于索引优化。 有关更多信息,请参见 第8.2.1.19节“函数调用优化”

    RAND() ORDER BY or GROUP BY 子句中 使用 具有 的列 可能会产生意外结果,因为对于任一子句, RAND() 可以对同一行多次计算表达式,每次返回不同的结果。 如果目标是以随机顺序检索行,则可以使用如下语句:

    SELECT * FROM tbl_nameORDER BY RAND();
    

    从一组行中选择一个随机样本,结合 ORDER BY RAND() LIMIT

    SELECT * FROM table1,table2 WHERE a = b AND c <d ORDER BY RAND()LIMIT 1000;
    

    RAND() 并不意味着是一个完美的随机发生器。 这是一种快速生成按需随机数的方法,可以在同一MySQL版本的平台之间移植。

    此函数对于基于语句的复制不安全。 如果在 binlog_format 设置 为时使用此功能,则会记录警告 STATEMENT

  • ROUND(X) ROUND(X,D)

    将参数舍入 X D 小数位。 舍入算法取决于数据类型 X D 如果未指定,则默认为0。 D 可以为负,导致 D 值的小数点左边的数字 X 变为零。

    MySQL的> SELECT ROUND(-1.23);
            - > -1
    MySQL的> SELECT ROUND(-1.58);
            - > -2
    MySQL的> SELECT ROUND(1.58);
            - > 2
    MySQL的> SELECT ROUND(1.298, 1);
            - > 1.3
    MySQL的> SELECT ROUND(1.298, 0);
            - > 1
    MySQL的> SELECT ROUND(23.298, -1);
            - > 20
    

    返回值与第一个参数具有相同的类型(假设它是整数,双精度或十进制)。 这意味着对于整数参数,结果是一个整数(没有小数位):

    MySQL的> SELECT ROUND(150.000,2), ROUND(150,2);
    + ------------------ + -------------- +
    | ROUND(150.000,2)| ROUND(150,2)|
    + ------------------ + -------------- +
    | 150.00 | 150 |
    + ------------------ + -------------- +
    

    ROUND() 根据第一个参数的类型使用以下规则:

    • 对于精确值数字, ROUND() 使用 从零开始的一半 向最近的方向 规则:如果为正数,则向下舍入到下一个整数或向下舍入到下一个整数负。 (换句话说,它从零开始舍入。)小数小于.5的值如果为正则向下舍入到下一个整数,如果为负,则向下舍入到下一个整数。

    • 对于近似值数字,结果取决于C库。 在许多系统中,这意味着 ROUND() 使用 舍入到最接近的偶数 规则:具有正好在两个整数之间的小数部分的值被舍入到最接近的偶数整数。

    以下示例显示精确值和近似值的舍入方式有何不同:

    MySQL的> SELECT ROUND(2.5), ROUND(25E-1);
    + ------------ + -------------- +
    | ROUND(2.5)| ROUND(25E-1)|
    + ------------ + -------------- +
    | 3 | 2 |
    + ------------ + -------------- +
    

    有关更多信息,请参见 第12.25节“精确数学”

  • SIGN(X)

    返回参数的符号为 -1 0 或者 1 ,根据是否 X 是负数,零或正。

    MySQL的> SELECT SIGN(-32);
            - > -1
    MySQL的> SELECT SIGN(0);
            - > 0
    MySQL的> SELECT SIGN(234);
            - > 1
    
  • SIN(X)

    返回的正弦值 X ,其中 X 以弧度给出。

    MySQL的> SELECT SIN(PI());
            - > 1.2246063538224e-16
    MySQL的> SELECT ROUND(SIN(PI()));
            - > 0
    
  • SQRT(X)

    返回非负数的平方根 X

    MySQL的> SELECT SQRT(4);
            - > 2
    MySQL的> SELECT SQRT(20);
            - > 4.4721359549996
    MySQL的> SELECT SQRT(-16);
            - > NULL
    
  • TAN(X)

    返回切线 X ,其中 X 以弧度为单位。

    MySQL的> SELECT TAN(PI());
            - > -1.2246063538224e-16
    MySQL的> SELECT TAN(PI()+1);
            - > 1.5574077246549
    
  • TRUNCATE(X,D)

    返回数字 X ,截断为 D 小数位。 如果 D 0 ,则结果没有小数点或小数部分。 D 可以为负,导致 D 值的小数点左边的数字 X 变为零。

    MySQL的> SELECT TRUNCATE(1.223,1);
            - > 1.2
    MySQL的> SELECT TRUNCATE(1.999,1);
            - > 1.9
    MySQL的> SELECT TRUNCATE(1.999,0);
            - > 1
    MySQL的> SELECT TRUNCATE(-1.999,1);
            - > -1.9
    MySQL的> SELECT TRUNCATE(122,-2);
           - > 100
    MySQL的> SELECT TRUNCATE(10.28*100,0);
           - > 1028
    

    所有数字都向零舍入。

12。7日期和时间函数

本节介绍可用于处理时间值的函数。 有关 每种日期和时间类型具有的值范围以及可以指定值的有效格式的说明, 请参见 第11.3节“日期和时间类型”

表12。13日期和时间函数

名称 描述
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() 返回月中的某一天(0-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() 从日期参数返回季度
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() 在datetime表达式中添加间隔
TIMESTAMPDIFF() 从日期时间表达式中减去间隔
TO_DAYS() 返回转换为days的日期参数
TO_SECONDS() 返回自0年以来转换为秒的日期或日期时间参数
UNIX_TIMESTAMP() 返回Unix时间戳
UTC_DATE() 返回当前的UTC日期
UTC_TIME() 返回当前的UTC时间
UTC_TIMESTAMP() 返回当前的UTC日期和时间
WEEK() 返回周数
WEEKDAY() 返回工作日索引
WEEKOFYEAR() 返回日期的日历周(1-53)
YEAR() 回归年份
YEARWEEK() 返回年份和星期

这是一个使用日期函数的示例。 以下查询选择具有 date_col 最近30天内值的 所有行

mysql> 
    - >SELECT something FROM tbl_nameWHERE DATE_SUB(CURDATE(),INTERVAL 30 DAY) <= date_col;

该查询还会选择日期位于将来的行。

期望日期值的函数通常接受日期时间值并忽略时间部分。 期望时间值的函数通常接受日期时间值并忽略日期部分。

返回当前日期或时间的函数在查询执行开始时每个查询仅