目录
表达式可以在几个点中使用
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函数和操作符
名称 | 描述 |
---|---|
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() |
返回年份和星期 |
当操作符与不同类型的操作数一起使用时,会发生类型转换以使操作数兼容。 某些转换是隐式发生的。 例如,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 * FROMtbl_name
WHEREstr_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.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 |
逻辑异或 |
运算符优先级显示在以下列表中,从最高优先级到最低优先级。 一行显示的运算符具有相同的优先级。
间隔 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比较运算符
名称 | 描述 |
---|---|
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))
测试针对一个布尔值,其中值
boolean_value
可以是
TRUE
,
FALSE
,或
UNKNOWN
。
MySQL的> SELECT 1 IS TRUE, 0 IS FALSE, NULL IS UNKNOWN;
- > 1,1,1
测试针对一个布尔值,其中值
boolean_value
可以是
TRUE
,
FALSE
,或
UNKNOWN
。
MySQL的> SELECT 1 IS NOT UNKNOWN, 0 IS NOT UNKNOWN, NULL IS NOT UNKNOWN;
- > 1,1,0
测试值是否为
NULL
。
MySQL的> SELECT 1 IS NULL, 0 IS NULL, NULL IS NULL;
- > 0,0,1
为了与ODBC程序配合使用,MySQL在使用时支持以下额外功能
IS
NULL
:
如果
sql_auto_is_null
variable设置为1,那么在成功插入自动生成的
AUTO_INCREMENT
值
的语句之后
,您可以通过发出以下形式的语句来查找该值:
SELECT * FROMtbl_name
WHERE为auto_col
NULL
如果语句返回一行,则返回的值与调用该
LAST_INSERT_ID()
函数时
的值相同
。
有关详细信息,包括多行插入后的返回值,请参见
第12.15节“信息函数”
。
如果未
AUTO_INCREMENT
成功插入
任何
值,则该
SELECT
语句不返回任何行。
可以通过设置禁用
AUTO_INCREMENT
使用
IS NULL
比较
检索
值
的行为
sql_auto_is_null
= 0
。
请参见
第5.1.8节“服务器系统变量”
。
默认值为
sql_auto_is_null
0。
对于
DATE
和
DATETIME
声明为列
NOT NULL
,您可以找到特殊的日子
'0000-00-00'
用这样的语句:
SELECT * FROMtbl_name
WHERE为date_column
NULL
这是使一些ODBC应用程序工作所必需的,因为ODBC不支持
'0000-00-00'
日期值。
请参阅
获取自动增量值
,以及
Connector / ODBC连接参数
FLAG_AUTO_IS_NULL
选项
的说明
。
测试值是否不是
NULL
。
MySQL的> SELECT 1 IS NOT NULL, 0 IS NOT NULL, NULL IS NOT NULL;
- > 1,1,0
如果
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
。
这是一样的
。
NOT
(
expr
BETWEEN
min
AND
max
)
返回
NULL
列表
中的第一个非
值,或者
NULL
如果没有非
NULL
值。
返回类型
COALESCE()
是参数类型的聚合类型。
MySQL的>SELECT COALESCE(NULL,1);
- > 1 MySQL的>SELECT COALESCE(NULL,NULL,NULL);
- > NULL
使用两个或多个参数,返回最大(最大值)参数。
使用与之相同的规则比较参数
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
。
返回
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的子查询”
。
这是一样的
。
NOT
(
expr
IN
(value
,...))
如果
expr
是
NULL
,则
ISNULL()
返回
1
,否则返回
0
。
MySQL的>SELECT ISNULL(1+1);
- > 0 MySQL的>SELECT ISNULL(1/0);
- > 1
ISNULL()
可以用来代替
=
测试值是否
NULL
。
(一值比较,以
NULL
使用
=
总是产率
NULL
)。
返回
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()
是比较参数类型的聚合类型。
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'
在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
逻辑不。
计算
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
运算符。
逻辑和。
计算
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
运算符。
逻辑或。
当两个操作数都是非操作数时
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
启用了
弃用,则不适用,
因为在这种情况下,
||
表示字符串连接。
逻辑异或。
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)
。
分配操作员。
使操作员左侧的用户变量采用其右侧的值。
右侧的值可以是文字值,另一个存储值的变量,或产生标量值的任何合法表达式,包括查询结果(假设此值是标量值)。
您可以在同一
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节“子查询语法” 。
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
表达式结果
的返回类型
是所有结果值的聚合类型:
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
如果
expr1
是
TRUE
(
和
expr1
<>
0
),则
expr1
<> NULLIF()
返回
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');
- >'不'
如果
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)
(字符串类型)。
返回
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.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。
对于采用长度参数的函数,非整数参数将四舍五入为最接近的整数。
返回字符串最左侧字符的数值
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()
功能。
返回二进制值的字符串表示形式
N
,其中
N
longlong(
BIGINT
)数字。
这相当于
。
如果
是,则
返回
。
CONV(
N
,10,2)NULL
N
NULL
MySQL的> SELECT BIN(12);
- >'1100'
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
。
返回字符串的长度
str
,以字符为单位。
多字节字符计为单个字符。
这意味着对于包含五个2字节字符的字符串,
LENGTH()
返回
10
,而
CHAR_LENGTH()
返回
5
。
CHARACTER_LENGTH()
是...的同义词
CHAR_LENGTH()
。
返回连接参数产生的字符串。 可能有一个或多个参数。 如果所有参数都是非二进制字符串,则结果为非二进制字符串。 如果参数包含任何二进制字符串,则结果为二进制字符串。 数字参数将转换为其等效的非二进制字符串形式。
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
字符串列表
的
第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'
返回的索引(位置)
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
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
将数字格式化
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'
采用使用的base-64编码规则编码的字符串
TO_BASE64()
,并将解码结果作为二进制字符串返回。
结果是
NULL
参数是否是
NULL
有效的base-64字符串。
有关
TO_BASE64()
编码和解码规则的详细信息,
请参阅说明
。
MySQL的> SELECT TO_BASE64('abc'), FROM_BASE64(TO_BASE64('abc'));
- >'JWJj','abc'
对于字符串参数
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
返回字符串
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'
此功能是多字节安全的。
返回
substr
string中
第一次出现的子
字符串的位置
str
。
LOCATE()
除了参数的顺序相反之外,这
与双参数形式
相同。
MySQL的>SELECT INSTR('foobarbar', 'bar');
- > 4 MySQL的>SELECT INSTR('xbar', 'foobar');
- > 0
此函数是多字节安全的,并且仅当至少一个参数是二进制字符串时才区分大小写。
LCASE()
在
LOWER()
存储视图的定义时,视图中
使用的内容将被重写
。
(缺陷号码#12844279)
返回
len
字符串中
最左边的
字符
str
,或者
NULL
如果有任何参数
NULL
。
MySQL的> SELECT LEFT('foobarbar', 5);
- >'fooba'
此功能是多字节安全的。
返回字符串的长度
str
,以字节为单位。
多字节字符计为多个字节。
这意味着对于包含五个2字节字符的字符串,
LENGTH()
返回
10
,而
CHAR_LENGTH()
返回
5
。
MySQL的> SELECT LENGTH('text');
- > 4
在
Length()
开放GIS空间功能被命名为
ST_Length()
MySQL中。
读取文件并以字符串形式返回文件内容。
要使用此功能,文件必须位于服务器主机上,您必须指定文件的完整路径名,并且您必须具有该
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
此函数是多字节安全的,并且仅当至少一个参数是二进制字符串时才区分大小写。
返回
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()
。
返回字符串
str
,用
字符串
左边填充
padstr
为
len
字符
长度
。
如果
str
长于
len
,则返回值缩短为
len
字符。
MySQL的>SELECT LPAD('hi',4,'??');
- >'?? hi' MySQL的>SELECT LPAD('hi',1,'??');
- >'h'
返回
str
删除了前导空格字符
的字符串
。
MySQL的> SELECT LTRIM(' barbar');
- >'barbar'
此功能是多字节安全的。
返回一个设置值(包含由
,
字符
分隔的子字符串的字符串
),包含具有
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
)SUBSTRING(
str
,pos
,len
)
返回八进制值的字符串表示形式
N
,其中
N
longlong(
BIGINT
)数字。
这相当于
。
如果
是,则
返回
CONV(
N
,10,8)NULL
N
NULL
。
MySQL的> SELECT OCT(12);
- >'14'
OCTET_LENGTH()
是...的同义词
LENGTH()
。
如果字符串的最左边的字符
str
是多字节字符,则返回该字符的代码,使用以下公式从其组成字节的数值计算:
(第1字节代码) +(第2字节代码* 256) +(第3字节代码* 256 ^ 2)...
如果最左边的字符不是多字节字符,则
ORD()
返回与...相同的值
ASCII()
函数
。
MySQL的> SELECT ORD('2');
- > 50
POSITION(
是...的同义词
。
substr
IN str
)LOCATE(
substr
,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中的引用规则 。
返回由字符串
str
重复
count
次数
组成的字符串
。
如果
count
小于1,则返回空字符串。
NULL
如果
str
或是,
count
则
返回
NULL
。
MySQL的> SELECT REPEAT('MySQL', 3);
- >'MySQLMySQLMySQL'
返回
str
字符串
from_str
替换
为字符串
的所有
字符串
to_str
。
REPLACE()
搜索时执行区分大小写的匹配
from_str
。
MySQL的> SELECT REPLACE('www.mysql.com', 'w', 'Ww');
- >'WwWwWw.mysql.com'
此功能是多字节安全的。
返回字符串
str
顺序颠倒
的字符串
。
MySQL的> SELECT REVERSE('abc');
- >'cba'
此功能是多字节安全的。
返回
len
字符串中
最右边的
字符
str
,或者
NULL
是否有任何参数
NULL
。
MySQL的> SELECT RIGHT('foobarbar', 4);
- >'rbar'
此功能是多字节安全的。
返回字符串
str
,右边用字符串填充
padstr
为一个
len
字符
长度
。
如果
str
长于
len
,则返回值缩短为
len
字符。
MySQL的>SELECT RPAD('hi',5,'?');
- >'你好??? MySQL的>SELECT RPAD('hi',1,'?');
- >'h'
此功能是多字节安全的。
返回
str
删除了尾随空格字符
的字符串
。
MySQL的> SELECT RTRIM('barbar ');
- >'barbar'
此功能是多字节安全的。
从中返回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描述)。 区别在于原始版本首先丢弃元音并重复第二个元素,而增强版本首先丢弃重复元素,然后丢弃元音元素。
这是一样的
。
SOUNDEX(
expr1
)
= SOUNDEX(expr2
)
返回由
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'
此功能是多字节安全的。
将字符串参数转换为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()
视图中使用的内容将被重写为
UPPER()
。
对于字符串参数
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()
返回
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(
str1
)WEIGHT_STRING(
str2
)str1
=
str2
str1
str2
如果
<
,则
(
之前排序
)
WEIGHT_STRING(
str1
)WEIGHT_STRING(
str2
)str1
<
str2
str1
str2
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
条款目前尚未使用。
如果字符串函数被赋予二进制字符串作为参数,则结果字符串也是二进制字符串。 转换为字符串的数字被视为二进制字符串。 这仅影响比较。
通常,如果字符串比较中的任何表达式区分大小写,则以区分大小写的方式执行比较。
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()
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.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 | + ------------------------- +
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
ENDX
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.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() |
截断到指定的小数位数 |
- |
更改参数的符号 |
通常的算术运算符可用。 结果根据以下规则确定:
如果两个操作数都是整数且其中任何一个都是无符号的,则结果是无符号整数。
对于减法,如果
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
乘法:
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
仅当在其结果转换为整数的上下文中执行时,才
使用
算术
计算除法
。
整数除法。 从除法中丢弃会导致小数点右边的任何小数部分。
如果任一操作数具有非整数类型,则
在将结果转换为之前
,操作数将转换为
DECIMAL
并使用
DECIMAL
算术进行
除法
BIGINT
。
如果结果超出
BIGINT
范围,则会发生错误。
MySQL的> SELECT 5 DIV 2, -5 DIV 2, 5 DIV -2, -5 DIV -2;
- > 2,-2,-2,2
模数运算。
返回
N
除以
的余数
M
。
欲了解更多信息,请参阅说明
MOD()
功能
节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
在发生错误时
返回
。
返回绝对值
X
。
MySQL的>SELECT ABS(2);
- > 2 MySQL的>SELECT ABS(-32);
- > 32
此功能可安全地与
BIGINT
值
一起使用
。
返回反余弦值
X
,即余弦值为的值
X
。
返回
NULL
如果
X
不在范围内
-1
来
1
。
MySQL的>SELECT ACOS(1);
- > 0 MySQL的>SELECT ACOS(1.0001);
- > NULL MySQL的>SELECT ACOS(0);
- > 1.5707963267949
返回正弦
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'| + --------- + ------ + -------------------------------- --------- +
返回
X
其正切值的反正切值
X
。
MySQL的>SELECT ATAN(2);
- > 1.1071487177941 MySQL的>SELECT ATAN(-2);
- > -1.1071487177941
返回两个变量的反正切
X
和
Y
。
它类似于计算反正切
,除了两个参数的符号用于确定结果的象限。
Y
/
X
MySQL的>SELECT ATAN(-2,2);
- > -0.78539816339745 MySQL的>SELECT ATAN2(PI(),0);
- > 1.5707963267949
返回不小于的最小整数值
X
。
MySQL的>SELECT CEILING(1.23);
- > 2 MySQL的>SELECT CEILING(-1.23);
- > -1
对于精确值数字参数,返回值具有精确值数字类型。 对于字符串或浮点参数,返回值具有浮点类型。
转换不同数字基数之间的数字。
返回数字的字符串表示形式
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'
返回余弦
X
,
X
以弧度为单位给出。
MySQL的> SELECT COS(PI());
- > -1
返回的余切
X
。
MySQL的>SELECT COT(12);
- > -1.5726734063977 MySQL的>SELECT COT(0);
- >超出范围的错误
计算循环冗余校验值并返回32位无符号值。
结果是
NULL
如果参数是
NULL
。
该参数应该是一个字符串,并且(如果可能的话)被视为一个,如果不是的话。
MySQL的>SELECT CRC32('MySQL');
- > 3259397556 MySQL的>SELECT CRC32('mysql');
- > 2501908538
返回
X
从弧度转换为度数
的参数
。
MySQL的>SELECT DEGREES(PI());
- > 180 MySQL的>SELECT DEGREES(PI() / 2);
- > 90
返回
e
的值
(自然对数的基数)提升到的幂
X
。
此函数的反函数是
LOG()
(仅使用单个参数)或
LN()
。
MySQL的>SELECT EXP(2);
- > 7.3890560989307 MySQL的>SELECT EXP(-2);
- > 0.13533528323661 MySQL的>SELECT EXP(0);
- > 1
返回不大于的最大整数值
X
。
MySQL的> SELECT FLOOR(1.23), FLOOR(-1.23);
- > 1,-2
对于精确值数字参数,返回值具有精确值数字类型。 对于字符串或浮点参数,返回值具有浮点类型。
将数字格式化
X
为格式
'#,###,###.##'
,舍入到
D
小数位,并将结果作为字符串返回。
有关详细信息,请参见
第12.5节“字符串函数”
。
此函数可用于获取十进制数或字符串的十六进制表示形式; 它的表达方式根据参数的类型而有所不同。 有关详细信息,请参见 第12.5节“字符串函数”中的 此函数的说明 。
返回自然对数
X
;
也就是碱基
ê
的对数
X
。
如果
X
小于或等于0.0E0,函数返回
NULL
和警告
“
的对数无效参数
”
报道。
MySQL的>SELECT LN(2);
- > 0.69314718055995 MySQL的>SELECT LN(-2);
- > NULL
如果使用一个参数调用,则此函数返回自然对数
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
)
返回的基数为2的对数
。
如果
X
X
小于或等于0.0E0,函数返回
NULL
和警告
“
的对数无效参数
”
报道。
MySQL的>SELECT LOG2(65536);
- > 16 MySQL的>SELECT LOG2(-100);
- > NULL
LOG2()
有助于找出一个数字需要存储的位数。
此函数等效于表达式
。
LOG(
X
)
/
LOG(2)
返回基数为10的对数
X
。
如果
X
小于或等于0.0E0,函数返回
NULL
和警告
“
的对数无效参数
”
报道。
MySQL的>SELECT LOG10(2);
- > 0.30102999566398 MySQL的>SELECT LOG10(100);
- > 2 MySQL的>SELECT LOG10(-100);
- > NULL
模数运算。
返回
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)的值。 显示的默认小数位数为7,但MySQL在内部使用完整的双精度值。
MySQL的>SELECT PI();
- > 3.141593 MySQL的>SELECT PI()+0.000000000000000000;
- > 3.141592653589793116
返回
X
raise的幂值
Y
。
MySQL的>SELECT POW(2,2);
- > 4 MySQL的>SELECT POW(2,-2);
- > 0.25
这是一个同义词
POW()
。
返回参数
X
,从度数转换为弧度。
(注意π弧度等于180度。)
MySQL的> SELECT RADIANS(90);
- > 1.5707963267949
返回
<=
<
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_name
ORDER 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
。
将参数舍入
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()
根据第一个参数的类型使用以下规则:
以下示例显示精确值和近似值的舍入方式有何不同:
MySQL的> SELECT ROUND(2.5), ROUND(25E-1);
+ ------------ + -------------- +
| ROUND(2.5)| ROUND(25E-1)|
+ ------------ + -------------- +
| 3 | 2 |
+ ------------ + -------------- +
有关更多信息,请参见 第12.25节“精确数学” 。
返回参数的符号为
-1
,
0
或者
1
,根据是否
X
是负数,零或正。
MySQL的>SELECT SIGN(-32);
- > -1 MySQL的>SELECT SIGN(0);
- > 0 MySQL的>SELECT SIGN(234);
- > 1
返回的正弦值
X
,其中
X
以弧度给出。
MySQL的>SELECT SIN(PI());
- > 1.2246063538224e-16 MySQL的>SELECT ROUND(SIN(PI()));
- > 0
返回非负数的平方根
X
。
MySQL的>SELECT SQRT(4);
- > 2 MySQL的>SELECT SQRT(20);
- > 4.4721359549996 MySQL的>SELECT SQRT(-16);
- > NULL
返回切线
X
,其中
X
以弧度为单位。
MySQL的>SELECT TAN(PI());
- > -1.2246063538224e-16 MySQL的>SELECT TAN(PI()+1);
- > 1.5574077246549
返回数字
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
所有数字都向零舍入。
本节介绍可用于处理时间值的函数。 有关 每种日期和时间类型具有的值范围以及可以指定值的有效格式的说明, 请参见 第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
FROMtbl_name
WHERE DATE_SUB(CURDATE(),INTERVAL 30 DAY) <=
date_col
;
该查询还会选择日期位于将来的行。
期望日期值的函数通常接受日期时间值并忽略时间部分。 期望时间值的函数通常接受日期时间值并忽略日期部分。
返回当前日期或时间的函数在查询执行开始时每个查询仅