您的位置:首页 > Web前端

MySQL 5.7 Reference Manual Chapter 13 Functions and Operators 参考手册第十三章函数与操作符内容总结

2016-12-01 18:18 721 查看
默认函数名和左括号之间不能存在空格,用来帮助 MySQL 解释器区分函数调用和表名列名引用

为了简洁表示,接下来所有的示例将采用简短输出

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 maxNOT (expr BETWEEN min AND max)
IS and IS NOT and IS NULL and IS NOT NULL

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)


略 略 略
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐