服务器 频道

SELECT和WHERE子句中的函数


    通常,如果在字符串比较中的任何表达式是区分大小写的,比较以大小写敏感的方式执行。

expr LIKE pat [ESCAPE ''escape-char'']
使用SQL的简单的正规表达式比较的模式匹配。返回1(TRUE)或0(FALSE)。用LIKE,你可以在模式中使用下列2个通配符字符: %  匹配任何数目的字符,甚至零个字符
_  精确匹配一个字符

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

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 REGEXP pat
 
expr RLIKE pat
    执行一个字符串表达式expr对一个模式pat的模式匹配。模式可以是一个扩充的正则表达式。见MySQL 正则表达式句法的 H 描述.如果expr匹配pat,返回1,否则返回0。RLIKE是REGEXP的一个同义词,提供了与mSQL的兼容性。注意:因为MySQL在字符串中使用C转义语法(例如,“\n”), 你必须在你的REGEXP字符串重复任何“\”。在MySQL3.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

当决定一个字符的类型时,REGEXP和RLIKE使用当前的字符集(缺省为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
 
     类型转换运算符
    BINARY
    BINARY操作符强制跟随它后面的字符串为一个二进制字符串。即使列没被定义为BINARY或BLOB,这是一个强制列比较区分大小写的简易方法。
mysql> select "a" = "A";
        -> 1
mysql> select BINARY "a" = "A";
        -> 0

BINARY在MySQL 3.23.0中被引入。

    控制流函数
IFNULL(expr1,expr2)
如果expr1不是NULL,IFNULL()返回expr1,否则它返回expr2。IFNULL()返回一个数字或字符串值,取决于它被使用的上下文环境。
mysql> select IFNULL(1,0);
        -> 1
mysql> select IFNULL(0,10);
        -> 0
mysql> select IFNULL(1/0,10);
        -> 10
mysql> select IFNULL(1/0,''yes'');
        -> ''yes''
 
    IF(expr1,expr2,expr3)
    如果expr1是TRUE(expr1<>0且expr1<>NULL),那么IF()返回expr2,否则它返回expr3。IF()返回一个数字或字符串值,取决于它被使用的上下文。
mysql> select IF(1>2,2,3);
        -> 3
mysql> select IF(1<2,''yes'',''no'');
        -> ''yes''
mysql> select IF(strcmp(''test'',''test1''),''yes'',''no'');
        -> ''no''

expr1作为整数值被计算,它意味着如果你正在测试浮点或字符串值,你应该使用一个比较操作来做。

mysql> select IF(0.1,1,0);
        -> 0
mysql> select IF(0.1<>0,1,0);
        -> 1

    在上面的第一种情况中,IF(0.1)返回0,因为0.1被变换到整数值, 导致测试IF(0)。这可能不是你期望的。在第二种情况中,比较测试原来的浮点值看它是否是非零,比较的结果被用作一个整数。

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
    第一个版本返回result,其中value=compare-value。第二个版本中如果第一个条件为真,返回result。如果没有匹配的result值,那么结果在ELSE后的result被返回。如果没有ELSE部分,那么NULL被返回。
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

    数学函数
    所有的数学函数在一个出错的情况下返回NULL。

    -
    单目减。改变参数的符号。
mysql> select - 2;

    注意,如果这个操作符与一个BIGINT使用,返回值是一个BIGINT!这意味着你应该避免在整数上使用-,那可能有值-2^63!
ABS(X)
返回X的绝对值。
mysql> select ABS(2);
        -> 2
mysql> select ABS(-32);
        -> 32

该功能可安全用于BIGINT值。

SIGN(X)
返回参数的符号,为-1、0或1,取决于X是否是负数、零或正数。
mysql> select SIGN(-32);
        -> -1
mysql> select SIGN(0);
        -> 0
mysql> select SIGN(234);
        -> 1
  
MOD(N,M)
 
%
模 (类似C中的%操作符)。返回N被M除的余数。
mysql> select MOD(234, 10);
        -> 4
mysql> select 253 % 7;
        -> 1
mysql> select MOD(29,9);
        -> 2

这个函数可安全用于BIGINT值。 
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)
返回参数X的四舍五入的一个整数。
mysql> select ROUND(-1.23);
        -> -1
mysql> select ROUND(-1.58);
        -> -2
mysql> select ROUND(1.58);
        -> 2
 
注意返回值被变换为一个BIGINT!

ROUND(X,D)
返回参数X的四舍五入的有D为小数的一个数字。如果D为0,结果将没有小数点或小数部分。
mysql> select ROUND(1.298, 1);
        -> 1.3
mysql> select ROUND(1.298, 0);
        -> 1

注意返回值被变换为一个BIGINT!

EXP(X)
返回值e(自然对数的底)的X次方。
mysql> select EXP(2);
        -> 7.389056
mysql> select EXP(-2);
        -> 0.135335
 
LOG(X)
返回X的自然对数。
mysql> select LOG(2);
        -> 0.693147
mysql> select LOG(-2);
        -> NULL

如果你想要一个数字X的任意底B的对数,使用公式LOG(X)/LOG(B)。

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)
返回值X的Y次幂。
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的值(圆周率)。
mysql> select PI();
        -> 3.141593

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不在-1到1的范围,返回NULL。
mysql> select ACOS(1);
        -> 0.000000
mysql> select ACOS(1.0001);
        -> NULL
mysql> select ACOS(0);
        -> 1.570796
 
ASIN(X)
返回X反正弦值,即其正弦值是X。L如果X不在-1到1的范围,返回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
ATAN2(X,Y)
返回2个变量X和Y的反正切。它类似于计算Y/X的反正切,除了两个参数的符号被用来决定结果的象限。
mysql> select ATAN(-2,2);
        -> -0.785398
mysql> select ATAN(PI(),0);
        -> 1.570796
COT(X)
返回X的余切。
mysql> select COT(12);
        -> -1.57267341
mysql> select COT(0);
        -> NULL

RAND()
 
RAND(N)
返回在范围0到1.0内的随机浮点值。如果一个整数参数N被指定,它被用作种子值。
mysql> select RAND();
        -> 0.5925
mysql> select RAND(20);
        -> 0.1811
mysql> select RAND(20);
        -> 0.1811
mysql> select RAND();
        -> 0.2079
mysql> select RAND();
        -> 0.7888

    你不能在一个ORDER BY子句用RAND()值使用列,因为ORDER BY将重复计算列多次。然而在MySQL3.23中,你可以做: SELECT * FROM table_name ORDER BY RAND(),这是有利于得到一个来自SELECT * FROM table1,table2 WHERE a=b AND c<d ORDER BY RAND() LIMIT 1000的集合的随机样本。注意在一个WHERE子句里的一个RAND()将在每次WHERE被执行时重新评估。

LEAST(X,Y,...)
    有2和2个以上的参数,返回最小(最小值)的参数。参数使用下列规则进行比较:
如果返回值被使用在一个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位小数。如果D为0,结果将没有小数点或小数部分。
mysql> select TRUNCATE(1.223,1);
        -> 1.2
mysql> select TRUNCATE(1.999,1);
        -> 1.9
mysql> select TRUNCATE(1.999,0);
        -> 1

0
相关文章