Site Message: mysql下载更新5.0.22
当前位置:HOME >> 手册 >> 参考手册[OLD] >> 正文
用于 SELECT 和 WHERE 子句的函数(3)
来源: Post Time:2006-03-04 Poster:colin

6.3.2.1 字符串比较函数

在必要的时候,MySQL 会自动地将数字转换到字符串,反之亦然:

mysql> SELECT 1+"1";
        -> 2
mysql> SELECT CONCAT(2,' test');
        -> '2 test'

如果你希望明确地将一个数字转换为字符串,将它参数传递到 CONCAT() 中。

如果将一个二进制字符串作为参数传递给一个字符串函数,结果返回也是一个二进制字符串。一个数字被转换到字符串,该字符串被视为是一个二进制字符串。这仅仅会影响结果。

通常,只要字符串比较中的任何一个表达式是区分大小写的,比较就会以字母大小写敏感方式执行。

expr LIKE pat [ESCAPE 'escape-char']
使用 SQL 的简单的正规表达式进行比较的模式匹配。返回 1 (TRUE) 或 0 (FALSE)。可以在模式中使用下面所示的两个通配符字符与 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
下面两个语句表明,字符串比较是忽略大小写的,除非任一操作数是一个二进制字符串:
mysql> SELECT 'abc' LIKE 'ABC';
        -> 1
mysql> SELECT 'abc' LIKE BINARY 'ABC';
        -> 0
LIKE 允许用在一个数字表达式上。(这是 MySQL 对 ANSI SQL LIKE 的扩展。)
mysql> SELECT 10 LIKE '1%';
        -> 1
注意:因为 MySQL 在字符串中使用的是 C 的转义句法(例如 “\n”),所以在 LIKE 字符串中使用的任何一个 “\” 必须被双写。例如,为了查找 “\n”,必须以 “\\n” 形式指定它。为了查找 “\”,必须指定它为 “\\\\” (反斜线被语法分析器剥离一次,另一次在模式匹配时完成,留下一条单独的反斜线被匹配)。

expr NOT LIKE pat [ESCAPE 'escape-char']
相同于 NOT (expr LIKE pat [ESCAPE 'escape-char'])

expr SOUNDS LIKE expr
等同于 SOUNDEX(expr)=SOUNDEX(expr) (适用于 MySQL 4.1 或更新的版本)。

expr REGEXP pat
expr RLIKE pat
依照模式 pat 对字符串表达式 expr 执行一个模式比较。模式可以是一个扩展的正则表达式。查看章节 G MySQL 正则表达式。Returns 如果表达式 expr 匹配 pat,返回 1,否则返回 0RLIKEREGEXP 的同义词,它提供了与 mSQL 的兼容。注意:MySQL 在字符串中使用的是 C 的转义句法(例如 “\n”),所以在 REGEXP 字符串中使用的任何一个 “\” 必须被双写。在 MySQL 3.23.4 中,REGEXP 对于正常的(不是二进制)字符串是忽略大小写的:
mysql> SELECT 'Monty!' REGEXP 'm%y%%';
        -> 0
mysql> SELECT 'Monty!' REGEXP '.*';
        -> 1
mysql> SELECT 'new*\n*line' REGEXP 'new\\*.\\*line';
        -> 1
mysql> SELECT "a" REGEXP "A", "a" REGEXP BINARY "A";
        -> 1  0
mysql> SELECT "a" REGEXP "^[a-d]";
        -> 1
当决定一个字符的类型时,REGEXPRLIKE 使用当前使用的字符集(缺省为 ISO-8859-1 Latin1)。

expr NOT REGEXP pat
expr NOT RLIKE pat
等同于 NOT (expr REGEXP pat)

STRCMP(expr1,expr2)
如果字符串是相同,STRCMP() 返回 0,如果第一个参数根据当前排序次序小于第二个参数,返回 -1,否则返回 1
mysql> SELECT STRCMP('text', 'text2');
        -> -1
mysql> SELECT STRCMP('text2', 'text');
        -> 1
mysql> SELECT STRCMP('text', 'text');
        -> 0

MATCH (col1,col2,...) AGAINST (expr)
MATCH (col1,col2,...) AGAINST (expr IN BOOLEAN MODE)
MATCH ... AGAINST() 用于全文搜索,返回在列 (col1,col2,...) 和查询 expr 之间文本的相关相似的尺度。相关性是一个正的浮点型数字。零相关性意味着不相似。MATCH ... AGAINST() 可用于 MySQL 3.23.23 或更新的版本中。IN BOOLEAN MODE 扩展在 MySQL 4.0.1 中被新加入。详细描述和使用范例,请查看 6.8 MySQL 全文搜索

6.3.2.2 字母大小写敏感性

BINARY
BINARY 操作符将跟在它后面的字符串强制作为一个二进制字符串。这可以很容易地强制一个列的比较以字母大小写敏感方式进行,即使该列没有定义为 BINARYBLOB?
mysql> SELECT "a" = "A";
        -> 1
mysql> SELECT BINARY "a" = "A";
        -> 0
BINARY stringCAST(string AS BINARY) 的缩写。查看章节 6.3.5 Cast 函数BINARY 在 MySQL 3.23.0 中被加入。 注意,当将一个索引列强制为 BINARY 时,在某些语境中,MySQL 将不能有效地使用索引。

如果希望对一个 blob 进行忽略字母大小的比较时,你通常可以在比较前将它转换到大写:

SELECT 'A' LIKE UPPER(blob_col) FROM table_name;

我们计划不久推出在不同字符集间的转化,以使字符串比较有更好的伸缩性。

6.3.3 数字函数

6.3.3.1 算术运算

常用的算术操作符均是可用的。注意,如果两个参数均是整型,`-', `+'`*'BIGINT (64 位)精度运算并返回结果!如果一个参数是一个无符号的整数,另一个参数也是一个整数,结果也将是一个无符号整数。查看章节 6.3.5 Cast 函数

+
加法:
mysql> SELECT 3+5;
        -> 8
-
减法:
mysql> SELECT 3-5;
        -> -2
*
乘法:
mysql> SELECT 3*5;
        -> 15
mysql> SELECT 18014398509481984*18014398509481984.0;
        -> 324518553658426726783156020576256.0
mysql> SELECT 18014398509481984*18014398509481984;
        -> 0
最后一个表达式的结果是错误的,这是因为乘法结果超过了 64 位 BIGINT 计算范围。
/
除法:
mysql> SELECT 3/5;
        -> 0.60
被 0 除将返回一个 NULL 结果:
mysql> SELECT 102/(1-1);
        -> NULL
只有当在一个结果被转换到一个整数的语境中执行时,除法将会以 BIGINT 进行算术计算。

6.3.3.2 数学函数

所有的数学函数在发生错误的情况下,均返回 NULL

-
一元减。 改变参数的符号:
mysql> SELECT - 2;
        -> -2
注意,如果这个操作符被用于一个 BIGINT,返回值也是一个 BIGINT!这就意味着,应该避免在一个可能有值 -2^63 的整数上使用 - 操作符!

ABS(X)
返回 X 的绝对值:
mysql> SELECT ABS(2);
        -> 2
mysql> SELECT ABS(-32);
        -> 32
这个函数可安全地使用于 BIGINT 值。

SIGN(X)
-101 方式返回参数的符号,它取决于参数 X 是负数、0 或正数。
mysql> SELECT SIGN(-32);
        -> -1
mysql> SELECT SIGN(0);
        -> 0
mysql> SELECT SIGN(234);
        -> 1
MOD(N,M)
%
取模 (就如 C 中的 % 操作符)。返回 NM 除后的余数:
mysql> SELECT MOD(234, 10);
        -> 4
mysql> SELECT 253 % 7;
        -> 1
mysql> SELECT MOD(29,9);
        -> 2
mysql> SELECT 29 MOD 9;
        -> 2
这个函数可安全地使用于 BIGINT 值。最后一个示例可在 MySQL 4.1 中工作。

FLOOR(X)
返回不大于 X 的最大整数值:
mysql> SELECT FLOOR(1.23);
        -> 1
mysql> SELECT FLOOR(-1.23);
        -> -2
注意,返回值被转换为一个 BIGINT

CEILING(X)
返回不小于 X 的最小整数:
mysql> SELECT CEILING(1.23);
        -> 2
mysql> SELECT CEILING(-1.23);
        -> -1
注意,返回值被转换为一个 BIGINT

ROUND(X)
ROUND(X,D)
将参数 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
注意,当参数在两个整数之间时, ROUND() 的行为取决于 C 库的实现。某些取整到最近的偶数,总是向下取,总是向上取,也可能总是接近于零。如果你需要某种取整类型,应该使用一个明确定义的函数比如 TRUNCATE()FLOOR() 代替。

DIV
整除。类似于 FLOOR(),但是它可安全地用于 BIGINT 值。
mysql> SELECT 5 DIV 2
	-> 2
DIV 在 MySQL 4.1.0 中新加入。

EXP(X)
返回值 e (自然对数的底) 的 X 次方:
mysql> SELECT EXP(2);
        -> 7.389056
mysql> SELECT EXP(-2);
        -> 0.135335
LN(X)
返回 X 的自然对数:
mysql> SELECT LN(2);
        -> 0.693147
mysql> SELECT LN(-2);
        -> NULL
这个函数在 MySQL 4.0.3 被新加入。在 MySQL 中,它是 LOG(X) 的同义词。

LOG(X)
LOG(B,X)
如果以一个参数调用,它返回 X 的自然对数:
mysql> SELECT LOG(2);
        -> 0.693147
mysql> SELECT LOG(-2);
        -> NULL
如果以两个参数调用,这个函数返回 X 任意底 B 的对数:
mysql> SELECT LOG(2,65536);
        -> 16.000000
mysql> SELECT LOG(1,100);
        -> NULL
任意底选项在 MySQL 4.0.3 中被加入。LOG(B,X) 等价于 LOG(X)/LOG(B)

LOG2(X)
返回 X 的以 2 为底的对数:
mysql> SELECT LOG2(65536);
        -> 16.000000
mysql> SELECT LOG2(-100);
        -> NULL
LOG2() 通常可以用于计数出一个数字需要多少个比特位用于存储它。这个函数在 MySQL 4.0.3 中被添加。在更早的版本中,可以使用 LOG(X)/LOG(2) 来代替它。

LOG10(X)
返回 X 以 10 为底的对数:
mysql> SELECT LOG10(2);
        -> 0.301030
mysql> SELECT LOG10(100);
        -> 2.000000
mysql> SELECT LOG10(-100);
        -> NULL
POW(X,Y)
POWER(X,Y)
返回 XY 幂:
mysql> SELECT POW(2,2);
        -> 4.000000
mysql> SELECT POW(2,-2);
        -> 0.250000
SQRT(X)
返回 X 的非否平方根:
mysql> SELECT SQRT(4);
        -> 2.000000
mysql> SELECT SQRT(20);
        -> 4.472136
PI()
返回 PI 值(圆周率)。缺少显示 5 位小数,但是在 MySQL 内部,为 PI 使用全部的双精度。
mysql> SELECT PI();
        -> 3.141593
mysql> SELECT PI()+0.000000000000000000;
        -> 3.141592653589793116
COS(X)
返回 X 的余弦,在这里,X 以弧度给出:
mysql> SELECT COS(PI());
        -> -1.000000
SIN(X)
返回 X 的正弦,在这里,X 以弧度给出:
mysql> SELECT SIN(PI());
        -> 0.000000
TAN(X)
返回 X 的正切,在这里,X 以弧度给出:
mysql> SELECT TAN(PI()+1);
        -> 1.557408
ACOS(X)
返回 X 的反余弦,更确切地说,返回余弦值为 X 的值。如果 X 不在 -11 之间的范围内,返回 NULL
mysql> SELECT ACOS(1);
        -> 0.000000
mysql> SELECT ACOS(1.0001);
        -> NULL
mysql> SELECT ACOS(0);
        -> 1.570796
ASIN(X)
返回 X 的反正弦,更确切地说,返回正弦值为 X 的值。如果 X 不在 -11 之间的范围内,返回 NULL
mysql> SELECT ASIN(0.2);
        -> 0.201358
mysql> SELECT ASIN('foo');
        -> 0.000000
ATAN(X)
返回 X 的反正切, 更确切地说,返回正切值为 X 的值:
mysql> SELECT ATAN(2);
        -> 1.107149
mysql> SELECT ATAN(-2);
        -> -1.107149
ATAN(Y,X)
ATAN2(Y,X)
返回两个变量 XY 的反正切。它类似于计算 Y / X 的反正切,除了两个参数的符号用于决定结果的象限:
mysql> SELECT ATAN(-2,2);
        -> -0.785398
mysql> SELECT ATAN2(PI(),0);
        -> 1.570796
COT(X)
返回 X 的余切:
mysql> SELECT COT(12);
        -> -1.57267341
mysql> SELECT COT(0);
        -> NULL
RAND()
RAND(N)
返回一个范围在 01.0 之间的随机浮点值。如果一个整数参数 N 被指定,它被当做种子值使用(用于产生一个可重复的数值):
mysql> SELECT RAND();
        -> 0.9233482386203
mysql> SELECT RAND(20);
        -> 0.15888261251047
mysql> SELECT RAND(20);
        -> 0.15888261251047
mysql> SELECT RAND();
        -> 0.63553050033332
mysql> SELECT RAND();
        -> 0.70100469486881
在一个 ORDER BY 子句中,不可以使用 RAND() 值使用一个列,因为 ORDER BY 将多次重复计算列。从 MySQL 3.23 开始,你可以使用:SELECT * FROM table_name ORDER BY RAND(),这有利于得到一个来自 SELECT * FROM table1,table2 WHERE a=b AND c的集合中的随机样本。 注意,在一个 WHERE 子句中的 RAND() 将在每次 WHERE 执行时被重新计算。 RAND() 并不是预期完美的随机数发生器,但是可以代替做为产生特别的随机数一个快速的方法,这样便于在两个不同平台下的同一 MySQL 版本间移动。

LEAST(X,Y,...)
有两个或更多个参数,返回最小(最小值)的参数。参数使用下列规则进行比较:
  • 如果返回值用于一个 INTEGER 语境,或所有的参数是整数值,它们作为整数比较。
  • 如果返回值用于一个 REAL 语境,或所有的参数均是实数值,它们作为实数被比较。
  • 如果任何一个参数是字母大小写敏感的,参数作为大小写敏感的字符串进行比较。
  • 在其它情况下,参数做为忽略大小写的字符中进行比较:
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"
在早于 MySQL 3.22.5 的版本中,你可以使用 MIN() 代替 LEAST

GREATEST(X,Y,...)
返回最大(最大值)参数。参数使用与 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"
在早于 MySQL 3.22.5 的版本中,可以使用 MAX() 代替 GREATEST

DEGREES(X)
将参数 X 从弧度转换为角度,然后返回:
mysql> SELECT DEGREES(PI());
        -> 180.000000
RADIANS(X)
将参数 X 从角度转换为弧度,然后返回:
mysql> SELECT RADIANS(90);
        -> 1.570796
TRUNCATE(X,D)
将数值 X 截到 D 个小数,然后返回。如果 D0,结果将不包含小数点和小数部分:
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 3.23.51 开始,所有数字被四舍五入到零。 如果 D 是负数,那么数字的整个部分被对准零位输出:
mysql> SELECT TRUNCATE(122,-2);
       -> 100
注意, 十进值小数在计算机中通常不以精确数字存储,而是双精度型的值,你可能会被下列结果所愚弄:
mysql> SELECT TRUNCATE(10.28*100,0);
       -> 1027
上面结果的发生是因为 10.28 实际上是以某些像 10.2799999999999999 的形式被存储的。

>>> 进入论坛讨论 <<<

热点文章
相关文章
Powered by MYSQL.CN © 2005, 2006