MySQL 5.7 Reference Manual Chapter 13 Functions and Operators 参考手册第十三章函数与操作符内容总结
2016-12-01 18:18
721 查看
默认函数名和左括号之间不能存在空格,用来帮助 MySQL 解释器区分函数调用和表名列名引用
为了简洁表示,接下来所有的示例将采用简短输出
操作符操作不同类型,将发生类型转化,有时会隐式转化
显式转换数字至字符串用
用数字查询字符串列,MySQL 无法使用索引,因为很多不同的字符串可以转换成该数字,譬如
之所以会发生这种情况是因为转换成
显式转换解决这个问题
通过括号改变优先级
比较的结果是
默认字符串比较是不区分大小写
=
<=>
NULL 安全比较,和 = 类似,当都为 NULL 时返回1,任意一个为 NULL 时返回0
<>, !=
<=,<,>=,>
IS and IS NOT and IS NULL and IS NOT NULL
COALESCE(value,…) 返回第一个不为 NULL 的值
LEAST(value1,value2,…) 返最小值
GREATEST(value1,value2,…) 返最大值,返回 NULL 若其中一个为 NULL
expr IN (value,…) expr NOT IN (value,…) 存在返回1,不存在返回0
不要混合带引号和不带引号
ISNULL(expr)
INTERVAL(N,N1,N2,N3,…) Returns 0 if N < N1, 1 if N < N2 and so on or -1 if N is NULL
NOT, !
AND, &&
OR, ||
XOR
a XOR b equal (a AND (NOT b)) OR ((NOT a) and b)
= 在 SET 语法中赋值
:= 直接赋值
不像 = 符号,:= 符号永远不会解析成比较运算符,这就意味你可以使用它在任何合法的 SQL 语法里
= 符号只在两种场景中使用
* SET statement
* SET clause of an UPDATE statement
IF(expr1,expr2,expr3)
IFNULL(expr1,expr2)
NULLIF(expr1,expr2)
字符串操作函数
返回字符串长度超过限制,返回 NULL
字符位置从 1 开始
需要长度参数的函数,非整形参数将就近取整
很多函数声明 略
字符串比较 略
正则表达式 略
函数返回值字符集 略
算术运算符 略
数学函数 略
随机数生成
若想获得随机数 R
你可以检索随机行通过这种方式
日期和时间函数
一次查询中多次调用获取时间函数将为同一值
MySQL 中使用的日历 略
全文搜索函数 略
类型转换函数
BINARY 字符串转二进制字符串
CAST() 转换到任何指定类型
CONVERT() 转换到任何指定类型(多了字句用于不同字符集之间转换)
XML 函数 略
位操作符和函数 略
加密和压缩函数 略
信息函数 略
效率测试函数
略 略 略
为了简洁表示,接下来所有的示例将采用简短输出
mysql> SELECT MOD(29,9); +-----------+ | mod(29,9) | +-----------+ | 2 | +-----------+ 1 rows in set (0.00 sec) 简化如下输出 mysql> SELECT MOD(29,9); -> 2
操作符操作不同类型,将发生类型转化,有时会隐式转化
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'
mysql> SELECT 1 > '6x'; -> 0 mysql> SELECT 7 > '6x'; -> 1 mysql> SELECT 0 > 'x6'; -> 0 mysql> SELECT 0 = 'x6'; -> 1
用数字查询字符串列,MySQL 无法使用索引,因为很多不同的字符串可以转换成该数字,譬如
'1', ' 1', or '1a'
SELECT * FROM tbl_name WHERE str_col=1;
mysql> SELECT '18015376320243458' = 18015376320243458; -> 1 mysql> SELECT '18015376320243459' = 18015376320243459; -> 0
之所以会发生这种情况是因为转换成
floating-point numbers进行比较,只有
53 bits of precision(精度)
mysql> SELECT '18015376320243459'+0.0; -> 1.8015376320243e+16
显式转换解决这个问题
mysql> SELECT CAST('18015376320243459' AS UNSIGNED) = 18015376320243459; -> 1
通过括号改变优先级
mysql> SELECT 1+2*3; -> 7 mysql> SELECT (1+2)*3; -> 9
比较的结果是
1 (TRUE), 0 (FALSE), or NULL
默认字符串比较是不区分大小写
=
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
<=>
NULL 安全比较,和 = 类似,当都为 NULL 时返回1,任意一个为 NULL 时返回0
mysql> SELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL; -> 1, 1, 0 mysql> SELECT 1 = 1, NULL = NULL, 1 = NULL; -> 1, NULL, NULL
<>, !=
mysql> SELECT '.01' <> '0.01'; -> 1 mysql> SELECT .01 <> '0.01'; -> 0 mysql> SELECT 'zapp' <> 'zappp'; -> 1
<=,<,>=,>
表达式 | 等价 |
---|---|
(a, b) = (x, y) | (a = x) AND (b = y) |
(a, b) <=> (x, y) | (a <=> x) AND (b <=> y) |
(a, b) <> (x, y) and (a, b) != (x, y) | (a <> x) OR (b <> y) |
(a, b) <= (x, y) | (a < x) OR ((a = x) AND (b <= y)) |
(a, b) < (x, y) | (a < x) OR ((a = x) AND (b < y)) |
(a, b) >= (x, y) | (a > x) OR ((a = x) AND (b >= y)) |
(a, b) > (x, y) | (a > x) OR ((a = x) AND (b > y)) |
expr BETWEEN min AND max | (min <= expr AND expr <= max) |
expr NOT BETWEEN min AND max | NOT (expr BETWEEN min AND max) |
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 mysql> SELECT 1 IS NOT NULL, 0 IS NOT NULL, NULL IS NOT NULL; -> 1, 1, 0
COALESCE(value,…) 返回第一个不为 NULL 的值
mysql> SELECT COALESCE(NULL,1); -> 1 mysql> SELECT COALESCE(NULL,NULL,NULL); -> NULL
LEAST(value1,value2,…) 返最小值
GREATEST(value1,value2,…) 返最大值,返回 NULL 若其中一个为 NULL
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'
expr IN (value,…) expr NOT IN (value,…) 存在返回1,不存在返回0
mysql> SELECT 2 IN (0,3,5,7); -> 0 mysql> SELECT 'wefwf' IN ('wee','wefwf','weg'); -> 1 mysql> SELECT (3,4) IN ((1,2), (3,4)); -> 1 mysql> SELECT (3,4) IN ((1,2), (3,5)); -> 0
不要混合带引号和不带引号
SELECT val1 FROM tbl1 WHERE val1 IN (1,2,'a'); Instead, write it like this: SELECT val1 FROM tbl1 WHERE val1 IN ('1','2','a');
ISNULL(expr)
mysql> SELECT ISNULL(1+1); -> 0 mysql> SELECT ISNULL(1/0); -> 1
INTERVAL(N,N1,N2,N3,…) Returns 0 if N < N1, 1 if N < N2 and so on or -1 if N is NULL
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
NOT, !
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
AND, &&
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
OR, ||
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
XOR
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 equal (a AND (NOT b)) OR ((NOT a) and b)
= 在 SET 语法中赋值
:= 直接赋值
不像 = 符号,:= 符号永远不会解析成比较运算符,这就意味你可以使用它在任何合法的 SQL 语法里
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 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
= 符号只在两种场景中使用
* SET statement
* SET clause of an UPDATE statement
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
mysql> SELECT CASE 1 WHEN 1 THEN 'one' -> WHEN 2 THEN 'two' ELSE 'more' END; -> 'one' mysql> SELECT CASE WHEN 1>0 THEN 'true' ELSE 'false' END; -> 'true' mysql> SELECT CASE BINARY 'B' -> WHEN 'a' THEN 1 WHEN 'b' THEN 2 END; -> NULL
IF(expr1,expr2,expr3)
mysql> SELECT IF(1>2,2,3); -> 3 mysql> SELECT IF(1<2,'yes','no'); -> 'yes' mysql> SELECT IF(STRCMP('test','test1'),'no','yes'); -> 'no'
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'); -> 'yes'
NULLIF(expr1,expr2)
mysql> SELECT NULLIF(1,1); -> NULL mysql> SELECT NULLIF(1,2); -> 1
字符串操作函数
返回字符串长度超过限制,返回 NULL
字符位置从 1 开始
需要长度参数的函数,非整形参数将就近取整
很多函数声明 略
字符串比较 略
正则表达式 略
函数返回值字符集 略
算术运算符 略
数学函数 略
随机数生成
RAND(), RAND(N)N为随机数种子
若想获得随机数 R
i <= R < j用如下表达式
FLOOR(i + RAND() * (j − i))
你可以检索随机行通过这种方式
SELECT * FROM tbl_name ORDER BY RAND() SELECT * FROM table1, table2 WHERE a=b AND c<d ORDER BY RAND() LIMIT 1000
CEIL(X) CEILING(X)向上取整
FLOOR(X)向下取整
ROUND(X), ROUND(X,D)四舍五入
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 | +------------------+--------------+
日期和时间函数
一次查询中多次调用获取时间函数将为同一值
SELECT NOW(), NOW(); -> '2016-12-01 16:53:16', '2016-12-01 16:53:16'
MySQL 中使用的日历 略
全文搜索函数 略
类型转换函数
BINARY 字符串转二进制字符串
CAST() 转换到任何指定类型
CONVERT() 转换到任何指定类型(多了字句用于不同字符集之间转换)
SELECT CONVERT(_latin1'Müller' USING utf8);
XML 函数 略
位操作符和函数 略
加密和压缩函数 略
信息函数 略
效率测试函数
mysql> SELECT BENCHMARK(1000000,ENCODE('hello','goodbye')); +----------------------------------------------+ | BENCHMARK(1000000,ENCODE('hello','goodbye')) | +----------------------------------------------+ | 0 | +----------------------------------------------+ 1 row in set (4.74 sec)
略 略 略
相关文章推荐
- MySQL 5.7 Reference Manual Chapter 4 Tutorial 参考手册第四章教程内容总结
- MySQL 5.7 Reference Manual Chapter 10 Language Structure 参考手册第十章语言结构内容总结
- MySQL - 翻译 - 5.1Reference Manual参考手册 - 11.6. Date and Time Functions日期和时间函数 - FROM_UNIXTIME将UNIX时间戳格式化为日期
- PHP - Manual手册 - Function Reference函数参考 - Database Extensions数据库扩展 - Vendor Specific Database Extensions特定提供商数据库扩展 - MySQL - MyS
- PHP - Manual手册 - Function Reference函数参考 - Variable and Type Related Extensions变量和类型相关扩展 - Variable handling变量操作 - Variable handl
- PHP - Manual手册 - Function Reference函数参考 - Variable and Type Related Extensions变量和类型相关扩展 - Arrays数组 - Array Functions数组函数 - ksort
- PHP - Manual手册 - Function Reference函数参考 - File System Related Extensions文件系统相关扩展 - Filesystem文件系统 - Filesystem Functions文件系统函数 -
- PHP - Manual手册 - Function Reference函数参考 - Other Basic Extensions其他基本扩展 - Tidy - Tidy Functions - Tidy函数
- PHP - Manual手册 - Function Reference函数参考 - Text Processing文本处理 - Strings字符串 - String Functions字符串函数 - strip_tags字符串中去除HTML和PHP标记
- PHP - Manual手册 - Function Reference函数参考 - Session Extensions会话扩展 - Session Handling会话操作 - Installing/Configuring安装/配置 - Runtime
- PHP - Manual手册 - Function Reference函数参考 - File System Related Extensions文件系统相关扩展 - Directories目录 - Directory Functions目录函数 - sca
- PHP - Manual手册 - 函数参考 - CURL, Client URL Library Functions客户端URL库函数 - 概述
- Mysql官方参考文档(MySQL 5.7 Reference Manual )
- MySQL - 5.1 Reference Manual参考手册 - 12.8.6.2. CASE Statement - CASE语句
- PHP - Manual手册 - Function Reference函数参考 - File System Related Extensions文件系统相关扩展 - Filesystem文件系统 - Filesystem Functions文件系统函数 -
- PHP - Manual手册 - XXXIII. Error Handling and Logging Functions错误处理和日志函数 - 概述
- MySQL - 翻译 - 5.1 Reference Manual参考手册 - 5.1.3 Server System Variables服务器系统变量 - max_heap_table_size
- PHP - Manual手册 - 函数参考 - Directory 目录函数 - scandir列出指定路径中的文件和目录
- PHP - Manual手册 - 函数参考 - Tokenizer Functions解析器代号函数
- PHP - Manual手册 - 函数参考 - PHP Options&Information - PHP选项与信息 - extension_loaded查询是否加载指定的扩展