表达式可以在SQL语句中的某些地方使用,SELECT
中的ORDER BY
和HAVING
子句内, SELECT, DELETE,UPDATE
这些语句中的WHERE
内,SET
语句内。表达式可以使用文字值,列值,NULL
,内置函数,存储函数,用户定义函数和运算符来编写。本章介绍了在MySQL中编写表达式所允许的函数和运算符。
有关编写存储函数和用户定义函数的说明,请参见 第23.2节“使用存储例程(过程和函数)”,以及 第28.4节“向MySQL添加新功能”。有关服务器如何解释对不同类型函数的引用的规则,请参见 第9.2.4节“函数名称解析和处理”。
除非在文档中对特定的函数或运算符另有说明,否则 包含的NULL
的表达式返回值始终是NULL
。
注意
默认情况下,函数名称和后面的括号之间不能有空格。这有助于MySQL解析器区分函数调用和对恰好与函数同名的表或列的引用。但是,括号内的函数参数周围有空格无所谓。
可以通过使用参数--sql-mode=IGNORE_SPACE
选项启动MySQL服务器,告诉服务器在函数名后面可以接受空格 ,(请参见 第5.1.10节“服务器的SQL模式”。)为Mysql的API函数mysql_real_connect()
提供CLIENT_IGNORE_SPACE
选项也能达成一样的目的。这两种忽略空格的结果是函数名会被当做保留字。
为简洁起见,本章中的大多数示例都以缩写形式显示mysql程序的输出,而不再是以完整的形式输出。
名字 | 功能 |
---|---|
ABS() | 返回绝对值 |
ACOS() | 返回反余弦 |
ADDDATE() | 将时间值(间隔)添加到日期值 |
ADDTIME() | 添加时间 |
AES_DECRYPT() | 使用AES解密 |
AES_ENCRYPT() | 使用AES加密 |
AND, && | 逻辑和 |
ANY_VALUE() | 禁止ONLY_FULL_GROUP_BY值拒绝 |
Area() (5.7.6已弃用) | 返回Polygon或MultiPolygon区域 |
AsBinary(),AsWKB()(5.7.6弃用) | 从内部几何格式转换为WKB |
ASCII() | 返回最左边那个字符的数值 |
ASIN() | 返回反正弦 |
= | 赋值(作为SET 语句的一部分 ,或作为UPDATE 语句中SET 子句的 一部分) |
:= | 赋值 |
AsText(),AsWKT()(5.7.6弃用) | 从内部几何格式转换为WKT |
ASYMMETRIC_DECRYPT() | 使用私钥或公钥解密密文 |
ASYMMETRIC_DERIVE() | 从非对称密钥导出对称密钥 |
ASYMMETRIC_ENCRYPT() | 使用私钥或公钥加密明文 |
ASYMMETRIC_SIGN() | 从摘要生成签名 |
ASYMMETRIC_VERIFY() | 验证签名是否与摘要匹配 |
ATAN() | 返回反正切 |
ATAN2(), ATAN() | 返回两个参数的反正切 |
AVG() | 返回参数的平均值 |
BENCHMARK() | 反复执行表达式 |
BETWEEN … AND … | 检查值是否在值范围内 |
BIN() | 返回包含数字的二进制表示的字符串 |
BINARY | 将字符串转换为二进制字符串 |
BIT_AND() | 按位与 |
BIT_COUNT() | 返回某数字二进制中1的个数 |
BIT_LENGTH() | 以位为单位返回参数的长度 |
BIT_OR() | 按位或 |
BIT_XOR() | 按位异或 |
& | 按位与 |
~ | 按位反转 |
^ | 按位异或 |
Buffer() (5.7.6弃用) | 返回距离几何体的给定距离内的点的几何 |
CASE | 状况 |
CAST() | 将值转换为特定类型 |
CEIL() | 返回不小于参数的最小整数值 |
CEILING() | 返回不小于参数的最小整数值 |
Centroid() (5.7.6弃用) | 返回一个点的质心 |
CHAR() | 返回传递的整数对应的字符 |
CHAR_LENGTH() | 返回参数中的字符串长度 |
CHARACTER_LENGTH() | CHAR_LENGTH的同义词 |
CHARSET() | 返回参数的字符集 |
COALESCE() | 返回第一个非NUL L参数 |
COERCIBILITY() | 不知怎么翻译 |
COLLATION() | 返回字符串参数的校对字符集 |
COMPRESS() | 将结果作为二进制字符串返回 |
CONCAT() | 连接字符串并返回 |
CONCAT_WS() | 用分隔符连接字符串并返回 |
CONNECTION_ID() | 返回连接的连接ID(线程ID) |
Contains() (5.7.6弃用) | 一个几何的MBR是否包含另一个几何的MBR |
CONV() | 用不同数字基数转换某个数字 |
CONVERT() | 将值转换为特定类型 |
CONVERT_TZ() | 从一个时区转换为另一个时区 |
ConvexHull() (5.7.6弃用) | 返回几何体的凸包 |
COS() | 返回余弦 |
COT() | 返回余切 |
COUNT() | 返回的行数 |
COUNT(DISTINCT) | 返回不同值的计数 |
CRC32() | 计算循环冗余校验值 |
CREATE_ASYMMETRIC_PRIV_KEY() | 创建私钥 |
CREATE_ASYMMETRIC_PUB_KEY() | 创建公钥 |
CREATE_DH_PARAMETERS() | 生成共享DH密钥 |
CREATE_DIGEST() | 从字符串生成摘要 |
Crosses() (5.7.6弃用) | 一个几何是否与另一个几何相交 |
CURDATE() | 返回当前日期 |
CURRENT_DATE(), CURRENT_DATE | CURDATE()的同义词 |
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() (5.7.2弃用) | 解码使用ENCODE()加密的字符串 |
DEFAULT() | 返回表中某列的设置的默认值 |
DEGREES() | 将弧度转换为度数 |
DES_DECRYPT() (5.7.6弃用) | 解密一个字符串 |
DES_ENCRYPT() (5.7.6弃用) | 加密字符串 |
Dimension() (5.7.6弃用) | 几何尺寸 |
Disjoint() (5.7.6弃用) | 两个几何形状的MBR是否不相交 |
Distance() (5.7.6弃用) | 一个几何与另一个几何的距离 |
DIV | 整数除法 |
/ | 除法操作符 |
ELT() | 返回索引号处的字符串 |
ENCODE() (已5.7.2弃用) | 编码一个字符串 |
ENCRYPT() (5.7.6弃用) | 加密字符串 |
EndPoint() (5.7.6弃用) | LineString的终点 |
Envelope() (5.7.6弃用) | 返回几何的MBR |
= | 等号运算符 |
<=> | 可以包含NULL 的安全等于运算符 |
Equals() (5.7.6弃用) | 两个几何的MBR是否相等 |
EXP() | 计算指数 |
EXPORT_SET() | 返回一个字符串,使得对于值位中设置的每个位,您获得一个on字符串,并且对于每个未设置的位,您将得到一个关闭字符串 |
ExteriorRing() (5.7.6弃用) | 返回Polygon的外环 |
EXTRACT() | 提取日期 的某个部分 |
ExtractValue() | 使用XPath表示法从XML字符串中提取值 |
FIELD() | 返回后续参数中第一个参数的索引(位置) |
FIND_IN_SET() | 返回第二个参数中第一个参数的索引位置 |
FLOOR() | 返回不大于参数的最大整数值 |
FORMAT() | 返回格式化为指定小数位数的数字 |
FOUND_ROWS() | 对于带有LIMIT子句的SELECT,返回的行数没有LIMIT子句 |
FROM_BASE64() | 解码base64编码的字符串并返回结果 |
FROM_DAYS() | 将日期号码转换为日期 |
FROM_UNIXTIME() | 将Unix时间戳格式化为日期 |
GeomCollFromText(),GeometryCollectionFromText()(5.7.6弃用) | 从WKT返回几何集合 |
GeomCollFromWKB(),GeometryCollectionFromWKB()(5.7.6弃用) | 从WKB返回几何集合 |
GeometryCollection() | 从几何构造几何集合 |
GeometryN() (5.7.6弃用) | 从几何集合中返回第N个几何 |
GeometryType() (5.7.6弃用) | 返回几何类型的名称 |
GeomFromText(),GeometryFromText()(5.7.6弃用) | 从WKT返回几何 |
GeomFromWKB(),GeometryFromWKB()(5.7.6弃用) | 从WKB返回几何 |
GET_FORMAT() | 返回日期格式字符串 |
GET_LOCK() | 获取命名锁 |
GLength() (5.7.6弃用) | 返回LineString的长度 |
> | 大于操作符 |
>= | 大于等于操作符 |
GREATEST() | 返回最大的参数 |
GROUP_CONCAT() | 返回一个连接的字符串 |
GTID_SUBSET() | 如果子集中的所有GTID也已设置,则返回true;否则返回false。 |
GTID_SUBTRACT() | 返回集合中不在子集中的所有GTID。 |
HEX() | 返回十进制或字符串值的十六进制表示形式 |
HOUR() | 提取小时 |
IF() | if / else |
IFNULL() | if / else 反过来 |
IN() | 检查值是否在一组值内 |
INET_ATON() | 返回IP地址的数值 |
INET_NTOA() | 从数值返回IP地址 |
INET6_ATON() | 返回IPv6地址的数值 |
INET6_NTOA() | 从数值返回IPv6地址 |
INSERT() | 在指定位置插入一个子字符串,直到指定的字符数插完位置 |
INSTR() | 返回第一次出现的子串的索引 |
InteriorRingN() (5.7.6弃用) | 返回Polygon的第N个内环 |
Intersects() (5.7.6弃用) | 两个几何的MBR是否相交 |
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() | 命名锁是否正在使用; 如果正在使用则返回连接标识符 |
IsClosed() (5.7.6弃用) | 几何是否封闭且简单 |
IsEmpty() (5.7.6弃用) | 占位符功能 |
ISNULL() | 测试参数是否为NULL |
IsSimple() (5.7.6弃用) | 几何是否简单 |
JSON_APPEND() (5.7.9弃用) | 将数据附加到JSON文档 |
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() (5.7.22弃用) | 合并JSON文档,保留重复键。JSON_MERGE_PRESERVE()的不再使用的同义词 |
JSON_MERGE_PATCH() | 合并JSON文档,替换重复键的值 |
JSON_MERGE_PRESERVE() | 合并JSON文档,保留重复键 |
JSON_OBJECT() | 创建JSON对象 |
JSON_OBJECTAGG() | 将结果集作为单个JSON对象返回 |
JSON_PRETTY() | 以人类可读的格式打印JSON文档,每个数组元素或对象成员打印在一个新行上,相对于其父级缩进两个空格。 |
JSON_QUOTE() | 引用JSON文档 |
JSON_REMOVE() | 从JSON文档中删除数据 |
JSON_REPLACE() | 替换JSON文档中的值 |
JSON_SEARCH() | JSON文档中的值路径 |
JSON_SET() | 将数据插入JSON文档 |
JSON_STORAGE_SIZE() | 用于存储JSON文档的二进制表示的空间; 对于JSON列,在任何部分更新之前插入文档时使用的空间 |
JSON_TYPE() | JSON值的类型 |
JSON_UNQUOTE() | 取消引用JSON值 |
JSON_VALID() | JSON值是否有效 |
LAST_DAY | 返回参数的月份的最后一天 |
LAST_INSERT_ID() | 最后一次INSERT的AUTOINCREMENT列的值 |
LCASE() | LOWER()的同义词 |
LEAST() | 返回最小的参数 |
LEFT() | 返回指定的最左边的字符数 |
<< | 左移 |
LENGTH() | 以字节为单位返回字符串的长度 |
< | 小于操作符 |
<= | 小于等于操作符 |
LIKE | 简单的模式匹配 |
LineFromText(),LineStringFromText()(5.7.6弃用) | 从WKT构造LineString |
LineFromWKB(),LineStringFromWKB()(5.7.6弃用) | 从WKB构造LineString |
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是否不相交 |
MBREqual() (5.7.6弃用) | 两个几何的MBR是否相等 |
MBREquals() | 两个几何的MBR是否相等 |
MBRIntersects() | 两个几何的MBR是否相交 |
MBROverlaps() | 两个几何的MBR是否重叠 |
MBRTouches() | 两种几何形状的MBR是否接触 |
MBRWithin() | 一个几何的MBR是否在另一个几何的MBR内 |
MD5() | 计算MD5校验和 |
MICROSECOND() | 从参数返回微秒 |
MID() | 返回从指定位置开始的子字符串 |
MIN() | 返回最小值 |
- | 减号运算符 |
MINUTE() | 从参数中返回分钟 |
MLineFromText(),MultiLineStringFromText()(5.7.6弃用) | 从WKT构造MultiLineString |
MLineFromWKB(),MultiLineStringFromWKB()(5.7.6弃用) | 从WKB构造MultiLineString |
MOD() | 求模运算 |
%, MOD | 模数运算符 |
MONTH() | 从参数的日期返回月份 |
MONTHNAME() | 返回月份名称 |
MPointFromText(),MultiPointFromText()(5.7.6弃用) | 从WKT构造MultiPoint |
MPointFromWKB(),MultiPointFromWKB()(5.7.6弃用) | 从WKB构造MultiPoint |
MPolyFromText(),MultiPolygonFromText()(5.7.6弃用) | 从WKT构造MultiPolygon |
MPolyFromWKB(),MultiPolygonFromWKB()(5.7.6弃用) | 从WKB构造MultiPolygon |
MultiLineString() | 从LineString值构造MultiLineString |
MultiPoint() | 从Point值构造MultiPoint |
MultiPolygon() | 从Polygon值构造MultiPolygon |
NAME_CONST() | 使列具有给定名称 |
NOT, ! | 非… |
NOT BETWEEN … AND … | 检查值是否不在值范围内 |
!=, <> | 不等于操作符 |
NOT IN() | 检查值是否不在一组值内 |
NOT LIKE | 简单模式匹配的否定 |
NOT REGEXP | REGEXP的否定 |
NOW() | 返回当前日期和时间 |
NULLIF() | 如果expr1 = expr2,则返回NULL |
NumGeometries() (5.7.6弃用) | 返回几何集合中的几何数量 |
NumInteriorRings() (5.7.6弃用) | 返回多边形内圈的数量 |
NumPoints() (5.7.6弃用) | 返回LineString中的点数 |
OCT() | 返回包含数字的八进制表示的字符串 |
OCTET_LENGTH() | LENGTH()的同义词 |
OLD_PASSWORD() | 返回PASSWORD 4.1之前实现的值 |
ORD() | 返回参数最左侧字符的字符代码 |
Overlaps() (5.7.6弃用) | 两个几何的MBR是否重叠 |
PASSWORD() (已弃用5.7.6) | 计算并返回密码字符串 |
PERIOD_ADD() | 添加一个时期在一个月上 |
PERIOD_DIFF() | 返回两个时期之间的月数 |
PI() | 返回π的值 |
+ | 加法运算符 |
Point() | 从坐标构造点 |
PointFromText() (5.7.6弃用) | 从WKT构建点 |
PointFromWKB() (5.7.6弃用) | 从WKB构造点 |
PointN() (5.7.6弃用) | 从LineString返回第N个点 |
PolyFromText(),PolygonFromText()(5.7.6弃用) | 从WKT构造多边形 |
PolyFromWKB(),PolygonFromWKB()(5.7.6弃用) | 从WKB构造多边形 |
Polygon() | 从LineString参数构造多边形 |
POSITION() | LOCATE()的同义词 |
POW() | 回参数指定的幂运算值 |
POWER() | 返回参数指定的幂运算值 |
PROCEDURE ANALYSE() (5.7.18弃用) | 分析查询的结果 |
QUARTER() | 从日期参数返回季度 |
QUOTE() | 转义参数以在SQL语句中使用 |
RADIANS() 将参数转换为弧度 | |
RAND() | 返回随机浮点值 |
RANDOM_BYTES() | 返回一个随机字节向量 |
REGEXP | 字符串是否匹配正则表达式 |
RELEASE_ALL_LOCKS() | 释放所有当前命名的锁 |
RELEASE_LOCK() | 释放命名锁 |
REPEAT() | 重复指定次数的字符串 |
REPLACE() | 替换指定字符串的出现次数 |
REVERSE() | 反转字符串中的字符 |
RIGHT() | 返回指定的最右边的字符数 |
>> | 右移 |
RLIKE | 字符串是否匹配正则表达式 |
ROUND() | 四舍五入参数 |
ROW_COUNT() | 行数已更新 |
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 | 比较sounds |
SPACE() | 返回指定数量的空格的字符串 |
SQRT() | 返回参数的平方根 |
SRID() (5.7.6弃用) | 返回几何的空间参考系统ID |
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_Length() | 返回LineString的长度 |
ST_LineFromText(), ST_LineStringFromText() | 从WKT构造LineString |
ST_LineFromWKB(), ST_LineStringFromWKB() | 从WKB构造LineString |
ST_LongFromGeoHash() | 从geohash值返回经度 |
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_SymDifference() | 返回点设置两个几何的对称差异 |
ST_Touches() | 一个几何是否接触另一个 |
ST_Union() | 返回点集两个几何的并集 |
ST_Validate() | 返回验证的几何体 |
ST_Within() | 一个几何是否在另一个之内 |
ST_X() | 返回Point的X坐标 |
ST_Y() | 返回Point的Y坐标 |
StartPoint() (5.7.6弃用) | LineString的起始点 |
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年以来转换为秒的日期或日期时间参数 |
Touches() (5.7.6弃用) | 一个几何是否接触另一个 |
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() | 返回整数值通用标识符 |
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() | 返回字符串的权重字符串 |
Within() (5.7.6弃用) | 一个几何的MBR是否在另一个几何的MBR内 |
X() (5.7.6弃用) | 返回Point的X坐标 |
XOR | 逻辑异或 |
Y() (5.7.6弃用) | 返回Point的Y坐标 |
YEAR() | 回归年份 |
YEARWEEK() | 返回年份和星期 |
当运算符与不同类型的运算对象一起使用时,会发生类型转换以使运算对象兼容。某些转换是隐式发生的。例如,MySQL会根据需要自动将字符串转换为数字,反之亦然。
mysql> SELECT 1+'1';
-> 2
mysql> SELECT CONCAT(2,' test');
-> '2 test'
也可以使用CAST()
函数显式地将数字转换为字符串。转换在CONCAT()
函数中隐式发生, 因为它需要字符串参数。
mysql> SELECT 38.8, CAST(38.8 AS CHAR);
-> 38.8, '38.8'
mysql> SELECT 38.8, CONCAT(38.8);
-> 38.8, '38.8'
有关隐式数字到字符串转换的字符集以及适用于CREATE TABLE ... SELECT
语句的已修改规则的信息,请参阅本节后面的内容。
以下规则描述了比较操作的转换方式:
如果一个或两个参数都是NULL,则比较的结果是NULL,除了 NULL-safe <=>
相等比较运算符。因为NULL <=> NULL
,结果是真的。无需转换。
如果比较操作中的两个参数都是字符串,则将它们作为字符串进行比较。
如果两个参数都是整数,则将它们作为整数进行比较。
如果不与数字进行比较,十六进制值将被视为二进制字符串。
如果其中一个参数是TIMESTAMP
或 DATETIME
列而另一个参数是常量,则在执行比较之前将常量转换为时间戳。这样做是为了更友好的ODBC。这不针对传递给IN()的参数 。为安全起见,在进行比较时始终使用完整的日期时间,日期或时间字符串。例如,要在日期或时间值上使用使用BETWEEN获得最佳结果时 ,请使用CAST()显式将值转换为所需的数据类型。
5.1 来自一个或多个表的单行子查询不被视为常量。例如,如果子查询返回要与DATETIME 值进行比较的整数,则比较将作为两个整数完成。整数不会转换为时间值。要将操作数作为DATETIME值进行比较 ,请使用 CAST()显式转换子查询值DATETIME。
如果其中一个参数是十进制值,则比较取决于另一个参数。如果另一个参数是十进制或整数值,则将参数作为十进制值进行比较,如果另一个参数是浮点值,则将参数作为浮点值进行比较。
在所有其他情况下,参数被比较为浮点(实数)。
有关将值从一种时间类型转换为另一种时间类型的信息,请参见 第11.3.7节“日期和时间类型之间的转换”。
JSON值的比较发生在两个级别。第一级比较基于比较值的JSON类型。如果类型不同,则比较结果仅由哪种类型具有更高优先级来确定。如果这两个值具有相同的JSON类型,则使用特定于类型的规则进行第二级比较。为了比较JSON和非JSON值,将非JSON值转换为JSON,并将值作为JSON值进行比较。有关详细信息,请参阅 JSON值的比较和排序。
以下示例说明了将字符串转换为数字以进行比较操作:
mysql> SELECT 1 > '6x';
-> 0
mysql> SELECT 7 > '6x';
-> 1
mysql> SELECT 0 > 'x6';
-> 0
mysql> SELECT 0 = 'x6';
-> 1
为了比较字符串列和数字,MySQL不能使用列上的索引来快速查找值。如果 str_col
是索引字符串列,则在以下语句中执行查找时,不能使用索引:
SELECT * FROM tbl_name WHERE str_col=1;
这样做的原因是,有许多不同的字符串可以转换为价值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.6.4.8节“浮点值的问题”。
服务器包括dtoa (一个转换库),它提供了改进字符串或DECIMAL值与近似值(FLOAT/ DOUBLE)数字之间转换的基础 :
跨平台的一致转换结果,例如,消除了Unix与Windows转换差异。
在结果先前未提供足够精度的情况下精确表示值,例如接近IEEE限制的值。
将数字转换为字符串格式,并尽可能精确。精度dtoa始终与标准C库函数的精度相同或更好。
由于此库生成的转换在某些情况下与非dtoa结果不同,因此依赖于先前结果的应用程序中存在不兼容性的可能性。例如,依赖于先前转换的特定精确结果的应用程序可能需要进行调整以适应额外的精度。
该dtoa库提供具有以下属性的转换。D表示具有DECIMAL或字符串表示的值,F表示本机二进制(IEEE)格式的浮点数。
F- > D
以尽可能高的精度完成转换,返回D为F 读回时产生的最短字符串,并以IEEE指定的本机二进制格式舍入为最接近的值。
D- > F
转换完成,这 F是输入十进制字符串中最接近的本机二进制数 D。
这些性质暗示F- > D- > F
转换是无损的,除非F是 -inf,+inf,或 NaN。不支持后面的值,因为SQL标准将它们定义为FLOAT 或DOUBLE 的无效值。
对于D- > F- > D
转换,转换无损的充分条件是, D使用15个精度或更少位数字,而不是反规范值-inf, +inf,或NaN。在某些情况下,即使D的精度超过15位,转换也是无损的,但情况并非总是如此。
将数值或时间值隐式转换为字符串会生成一个值,该值具有由系统变量character_set_connection
和collation_connection
系统变量确定的字符集和排序规则。(这些变量通常设置为 SET NAMES。有关连接字符集的信息,请参见 第10.4节“连接字符集和排序”。)
这意味着,这样的转换结果中的字符(非二进制的)字符串(一个CHAR, VARCHAR或 LONGTEXT值),除了在连接字符集设置到为 binary。在这种情况下,转换结果是一个二进制串(一个BINARY, VARBINARY或 LONGBLOB值)。
对于整数表达式,the preceding remarks about expression evaluation apply somewhat differently for expression assignment
; 例如,在这样的声明中:
CREATE TABLE t SELECT integer_expr;
在这种情况下,由表达式生成的列中的表具有类型INT或 BIGINT取决于整数表达式的长度。如果表达式的最大长度不适合INT, 则使用BIGINT。长度取自SELECT结果集元数据的max_length值 (请参见 第28.7.5节“C API数据结构”)。这意味着您对于足够长的表达式可以强制使用BIGINT而不是 INT:
CREATE TABLE t SELECT 000000000000000000000;
名称 | 描述 |
---|---|
AND, && | 逻辑和 |
= | 赋值(作为SET 语句的一部分 ,或作为UPDATE语句中SET子句的一部分) |
:= |
分配值 |
BETWEEN ... AND ... |
检查值是否在值范围内 |
BINARY | 将字符串转换为二进制字符串 |
& | 按位AND |
~ | 按位反转 |
.|. |
按位OR |
^ | 按位异或 |
CASE | 流程情况操作符 |
DIV | 整数除法 |
/ | 除法操作符 |
= | 相等运算符 |
<=> | NULL-safe等于运算符 |
> | 大于运算符 |
>= | 大于或等于运算符 |
IS | 针对布尔值测试值 |
IS NOT | 针对布尔值测试值 |
IS NOT NULL | NOT NULL值测试 |
IS NULL | NULL值测试 |
-> | 评估路径后从JSON列返回值; 相当于JSON_EXTRACT()。 |
->> | 在评估路径并取消引用结果后,从JSON列返回值; 相当于JSON_UNQUOTE(JSON_EXTRACT())。 |
<< | 左移 |
< | 小于运算符 |
<= | 小于或等于运算符 |
LIKE | 简单的模式匹配 |
- | 减运算符 |
%, MOD | 模数运算符 |
NOT,! |
否定值 |
NOT BETWEEN ... AND ... |
检查值是否不在某范围内 |
!=, <> | 不等于运算符 |
NOT LIKE | 简单模式匹配的否定 |
NOT REGEXP | REGEXP的否定 |
||, OR |
逻辑或 |
+ | 加法运算符 |
REGEXP | 字符串是否匹配正则表达式 |
>> | 右转 |
RLIKE | 字符串是否匹配正则表达式 |
SOUNDS LIKE | 比较声音 |
* | 乘法运算符 |
- | 更改参数的符号 |
XOR | 逻辑异或 |
运算符优先级显示在以下列表中,从最高优先级到最低优先级。一行显示的运算符具有相同的优先级。
INTERVAL
BINARY, COLLATE
!
- (unary minus), ~ (unary bit inversion)
^
*, /, DIV, %, MOD
-, +
<<, >>
&
|
= (comparison), <=>, >=, >, <=, <, <>, !=, IS, LIKE, REGEXP, IN
BETWEEN, CASE, WHEN, THEN, ELSE
NOT
AND, &&
XOR
OR, ||
= (assignment), :=
=的优先级取决于它是用作比较运算符(=)还是用作赋值运算符(=)。当作为比较操作符使用,它具有和<=>, >=, >, <=, <, <>, !=, 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
名称 | 描述 |
---|---|
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()或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
.(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)
<=> 操作符相当于标准的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
mysql> SELECT 1 IS NOT UNKNOWN, 0 IS NOT UNKNOWN, NULL IS NOT UNKNOWN;
-> 1, 1, 0
mysql> SELECT 1 IS NULL, 0 IS NULL, NULL IS NULL;
-> 0, 0, 1
为了与ODBC程序配合使用,MySQL在使用IS NULL
时支持以下额外功能:
sql_auto_is_null
变量设置为1,则在成功插入自动生成的AUTO_INCREMENT
值的语句之后 ,您可以通过发出以下格式的语句来查找该值:SELECT * FROM tbl_name WHERE auto_col IS NULL
如果语句返回一行,则返回的值与调用LAST_INSERT_ID()
函数时的值相同 。有关详细信息,包括多行插入后的返回值,请参见 第12.15节“信息函数”。如果未成功插入任何AUTO_INCREMENT
值,则该SELECT语句不返回任何行。
可以通过设置sql_auto_is_null = 0
禁用AUTO_INCREMENT使用IS NULL比较 检索值 的行为 。请参见第5.1.8节“服务器系统变量”。
sql_auto_is_null
默认值为 0。
'0000-00-00'
:SELECT * FROM tbl_name WHERE date_column IS NULL
这是使一些ODBC应用程序工作所必需的,因为ODBC不支持'0000-00-00'
日期值。
请参阅 获取自动增量值,以及Connector / ODBC连接参数 FLAG_AUTO_IS_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。如果所有参数都是相同类型,则这相当于表达式(min <= expr AND expr <= max)
。否则,类型转换将根据第12.2节“表达式评估中的类型转换”中所述的规则进行 ,但应用于所有三个参数。mysql> SELECT 2 BETWEEN 1 AND 3, 2 BETWEEN 3 and 1;
-> 1, 0
mysql> SELECT 1 BETWEEN 2 AND 3;
-> 0
mysql> SELECT 'b' BETWEEN 'a' AND 'c';
-> 1
mysql> SELECT 2 BETWEEN 2 AND '3';
-> 1
mysql> SELECT 2 BETWEEN 2 AND 'x-3';
-> 0
为了在日期或时间值时使用BETWEEN获得最佳结果 ,请使用CAST()显式将值转换为所需的数据类型。示例:如果将一个DATETIME与两个 DATE值进行比较 ,请将DATE值转换 为 DATETIME值。如果使用字符串常量(例如与'2001-1-1'
)DATE进行比较,则将字符串转换为DATE。
这和NOT (expr BETWEEN min AND max)
是一样的。
返回的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'
如果有任何参数为NULL,则 GREATEST()返回 NULL。
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也会返回NULL。
mysql> select 12 in (NULL = NULL,NULL,NULL);
->NULL
mysql> select NULL in (NULL = NULL,NULL,NULL);
->NULL
mysql> select 12 in (14,NULL,13);
->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
mysql> SELECT ISNULL(0);
-> 0
mysql> SELECT ISNULL(NULL);
-> 1
ISNULL()可以用来代替=测试值是否NULL。(一个值和NULL比较,=
总是返回NULL)。
ISNULL()函数与IS NULL 比较运算符共享一些特殊行为 。请参阅说明 IS 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
(1)如果有任何参数是NULL,结果是NULL。无需进行比较。
(2)如果所有参数都是整数值,则将它们作为整数进行比较。
(3)如果至少一个参数是双精度,则将它们作为双精度值进行比较。否则,如果至少有一个参数是 DECIMAL值,则将它们作为DECIMAL 值进行比较。
(4)如果参数包含数字和字符串的混合,则将它们作为数字进行比较。
(5)如果任何参数是非二进制(字符)字符串,则将参数作为非二进制字符串进行比较。
(6)在所有其他情况下,参数将作为二进制字符串进行比较。
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'
名称 | 描述 |
---|---|
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
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> 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> 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
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 语句的一部分 ,或作为UPDATE语句中SET子句的 一部分) |
:= | 分配值 |
分配运算符。使运算符左侧的用户变量采用其右侧的值。右侧的值可以是文字值,另一个存储值的变量,或产生标量值的任何合法表达式,包括查询结果(假设此值是标量值)。您可以在同一SET 语句中执行多个分配 。您可以在同一语句中执行多个分配。
与=
不同, :=
操作符永远不会被解释为比较运算符。这意味着您可以在任何有效的SQL语句(而不仅仅是 SET 语句中)中使用:=
来为变量赋值。
mysql> SELECT @var1, @var2;
-> NULL, NULL
mysql> SELECT @var1 := 1, @var2;
-> 1, NULL
mysql> SELECT @var1, @var2;
-> 1, NULL
mysql> SELECT @var1, @var2 := @var1;
-> 1, 1
mysql> SELECT @var1, @var2;
-> 1, 1
mysql> SELECT @var1:=COUNT(*) FROM t1;
-> 4
mysql> SELECT @var1;
-> 4
您可以在非 SELECT语句中使用:=
进行值赋值,例如 UPDATE,如下所示:
mysql> SELECT @var1;
-> 4
mysql> SELECT * FROM t1;
-> 1, 3, 5, 7
mysql> UPDATE t1 SET c1 = 2 WHERE c1 = @var1:= 1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> SELECT @var1;
-> 1
mysql> SELECT * FROM t1;
-> 2, 3, 5, 7
虽然也可以使用:=
运算符在单个SQL语句中设置和读取同一变量的值,但 不建议这样做。 第9.4节“用户定义的变量”解释了为什么要避免这样做。
在 SET 语句中,=被视为赋值运算符,它使运算符左侧的用户变量采用其右侧的值。(换句话说,当在SET 语句中使用时 ,=
被视为与:=
相同。)右侧的值可以是文字值,另一个存储值的变量,或产生标量值的任何合法表达式,包括结果查询(假设此值是标量值)。您可以在同一SET 语句中执行多个分配 。
在 UPDATE的SET子句中, =
也充当赋值运算符; 但是,在这种情况下,如果满足任何WHERE条件,则它会使运算符左侧的列成为右侧赋予的值。您可以在UPDATE语句的同一SET子句中 进行多个赋值 。
在任何其他上下文中,=被视为 比较运算符。
有关更多信息,请参见第13.7.5.1节“变量赋值的SET语法”, 第13.2.12节“UPDATE语法”和第13.2.11节“子查询语法”。
如果结果的长度大于max_allowed_packet
系统变量的值,则字符串值函数返回NULL。请参见第5.1.1节“配置服务器”。
(1)对于在字符串位置上操作的函数,第一个位置编号为1。
(2)对于采用长度参数的函数,非整数参数舍入为最接近的整数。
功能:返回字符串str最左侧字符的数值(ascii码)。
如果 str是空字符串,返回 0。如果 str是NULL,则返回NULL。 ASCII()适用于8位字符。
mysql> SELECT ASCII('2');
-> 50
mysql> SELECT ASCII(2);
-> 50
mysql> SELECT ASCII('dx');
-> 100
mysql> SELECT ASCII('');
-> 0
mysql> SELECT ASCII(NULL);
-> NULL
另请参见ORD()方法。
功能:以字符串的表示形式,返回N的二进制值。
其中 N是 longlong 类型(BIGINT)数字。这相当于CONV(N,10,2)
。如果N 是NULL,则返回NULL。
mysql> SELECT BIN(12);
-> '1100'
mysql> SELECT BIN(12.956);
-> '1100'
功能:以位为单位返回字符串str的长度 。
mysql> SELECT BIT_LENGTH('t');
-> 8
mysql> SELECT BIT_LENGTH('text');
-> 32
mysql> SELECT BIT_LENGTH('中');# 一个中文3个字节=3*8位
-> 24
功能:CHAR()将每个参数 N解释为一个整数,并返回一个字符串,该字符串由这些整数的代码值代表的字符组成。NULL值被跳过。
mysql> SELECT CHAR(77,121,83,81,'76');
-> 'MySQL'
mysql> SELECT CHAR(77,77.3,'77.3');
-> 'MMM'
大于255的N参数将转换为多个结果字节。例如, CHAR(256)等同于 CHAR(1,0)
, CHAR(256*256)
等同于 CHAR(1,0,0)
:
mysql> SELECT HEX(CHAR(1,0)), HEX(CHAR(256));
+----------------+----------------+
| HEX(CHAR(1,0)) | HEX(CHAR(256)) |
+----------------+----------------+
| 0100 | 0100 |
+----------------+----------------+
mysql> SELECT HEX(CHAR(1,0,0)), HEX(CHAR(256*256));
+------------------+--------------------+
| HEX(CHAR(1,0,0)) | HEX(CHAR(256*256)) |
+------------------+--------------------+
| 010000 | 010000 |
+------------------+--------------------+
默认情况下,CHAR()返回二进制字符串。要在给定字符集中生成字符串,请使用可选的 USING子句:
mysql> SELECT CHARSET(CHAR(X'65')), CHARSET(CHAR(X'65' USING utf8));
+----------------------+---------------------------------+
| CHARSET(CHAR(X'65')) | CHARSET(CHAR(X'65' USING utf8)) |
+----------------------+---------------------------------+
| binary | utf8 |
+----------------------+---------------------------------+
如果USING给定并且结果字符串对于给定字符集是非法的,则发出警告。此外,如果启用了严格的SQL模式,则结果 CHAR()变为 NULL。
功能:返回字符串str的长度 ,以字符为单位
多字节字符计为单个字符。这意味着对于包含五个2字节字符的字符串, LENGTH()返回 10,而 CHAR_LENGTH()返回 5。
**CHARACTER_LENGTH(str)**是它的同义词
mysql> select char_length('abc');
-> 3
mysql> select char_length('中');
-> 1
mysql> select character_length(x'61');
-> 1
功能:返回连接参数产生的字符串
可能有一个或多个参数。
(1)如果所有参数都是非二进制字符串,则结果为非二进制字符串。
(2)如果参数包含任何二进制字符串,则结果为二进制字符串。
(3)数字参数将转换为其等效的非二进制字符串形式。
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()代表Concatenate With Separator
,是一种特殊的形式 CONCAT()。第一个参数是其余参数的分隔符。在要连接的字符串之间添加分隔符。分隔符可以是字符串,其余参数也可以是字符串。如果分隔符是NULL,结果是 NULL。
mysql> SELECT CONCAT_WS(',','First name','Second name','Last Name');
-> 'First name,Second name,Last Name'
mysql> SELECT CONCAT_WS(',','First name',NULL,'Last Name');
-> 'First name,Last Name'
CONCAT_WS()不会跳过空字符串。但是,它会跳过分隔符后边的任何NULL值。
功能:返回N字符串列表的 第Nth个元素
如果 N= 1返回str1, 如果 N= 2返回str2,依此类推。如果N小于1或大于参数的数量则返回NULL 。 ELT()是 FIELD()的补充。
mysql> SELECT ELT(1, 'Aa', 'Bb', 'Cc', 'Dd');
-> 'Aa'
mysql> SELECT ELT(4, 'Aa', 'Bb', 'Cc', 'Dd');
-> 'Dd'
功能:返回一个字符串,使得对于bits值中设置的每个位 ,您将获得一个 on字符串,并且对于未在该值中设置的每个位,您将获得一个off 字符串。
在bits中的bit被从右到左(从低到高序位)检查。字符串从左到右添加到结果中,由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'
mysql> select export_set(0b1101,'XX','O','-',8);
-> 'XX-O-XX-XX-O-O-O-O'
译者注:
(1)5 的 4位二进制为0101
,对于其中的1用Y
替换,对于其中的0,用N替换,每位之间用,
分割。
(2)6 的 4位二进制为0110
,但这里要求10位,末尾补0,结果是0110000000
。
功能:返回字符串str在列表str1, str2, str3,…中的索引(从1开始)。
如果找不到str 则返回0。
如果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
mysql> select field(123,234,345,123.0);
-> 3
功能:返回字符串str在strlist中的位置(strlist由N子字符串组成)。
返回1到N范围内的值 。字符串列表是由,
字符分隔的子字符串组成的字符串 。如果第一个参数是常量字符串而第二个参数是类型的列 SET,则该 FIND_IN_SET()函数被优化为使用位算术。如果str不在 strlist或者strlist是空字符串那么返回0。如果任一参数是NULL,则返回NULL。如果第一个参数包含逗号(,
),则此函数无法正常工作。
mysql> SELECT FIND_IN_SET('b','a,b,c,d');
-> 2
mysql> select find_in_set('ab','中文,ab,cd,ef,gh,ab');
-> 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'
功能:将一个已编码的字符串进行解码(编码采用的规则是TO_BASE64()
方法所采用的base-64编码规则),返回结果字符串。
如果str参数为NULL或者不是有效的base-64字符串,返回NULL。
mysql> SELECT TO_BASE64('abc'), FROM_BASE64(TO_BASE64('abc'));
-> 'JWJj', 'abc'
功能:
(1)对于字符串参数str, 返回十六进制字符串表示形式,str中每个字符的每个字节都转换为两个十六进制数字。(多字节字符因此变为两位以上。)此操作的逆过程由UNHEX()
完成 。
(2)对于数字参数N, 返回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
mysql> select hex('中');
-> D6D0