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

6.3.1.3 逻辑运算符

在 SQL 中,所有的逻辑运算符返回的值均为 TRUE、FALSE 或 NULL (未知)。在 MySQL 中,它们由 1 (TRUE)、0 (FALSE) 和 NULL 实现。这些大部分在不同的 SQL 数据库间是相同的,然而某些可能会以一个非零值返回 TRUE。

NOT
!
逻辑非。如果操作数为 0,返回 1;如果操作数为非零,返回 0;如果操作数为 NOT NULL,返回 NULL
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 一样被计算的。

AND
&&
逻辑与。如果所有的操作数都是非零或非 NULL 的,返回 1;如果有一个或多个操作数为 0 ,则返回 0,只要操作数中有 NULL 返回值就为 NULL
mysql> SELECT 1 && 1;
        -> 1
mysql> SELECT 1 && 0;
        -> 0
mysql> SELECT 1 && NULL;
        -> NULL
mysql> SELECT 0 && NULL;
        -> 0
mysql> SELECT NULL && 0;
        -> 0
请注意,在 MySQL 4.0.5 以前版本中,当遇到一个 NULL 时就停止计算,而不是继续进程检查可能存在的0。这就意味着,在这些版本中,SELECT (NULL AND 0) 返回 NULL,而不是 0。在 4.0.5 中,代码已被重新设计了,已便于在任何仍然使用优化情况下,返回值总是能如 ANSI 所规定的那样。
OR
||
逻辑或。如果任何一个操作数是非零的,返回值为 1,如果任一操作数为 NULL,返回值为 NULL,否则返回 0
mysql> SELECT 1 || 1;
        -> 1
mysql> SELECT 1 || 0;
        -> 1
mysql> SELECT 0 || 0;
        -> 0
mysql> SELECT 0 || NULL;
        -> NULL
mysql> SELECT 1 || NULL;
        -> 1
XOR
逻辑异或。如果任一操作数为 NULL,返回值为 NULL。对于非 NULL 的操作数,如果有奇数个非零的操作数,结果返回为 1,否则返回 0
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)XOR 在 MySQL 4.0.2 中被添加。

6.3.1.4 控制流函数

IFNULL(expr1,expr2)
如果 expr1 为非 NULL 的,IFNULL() 返回 expr1,否则返回 expr2IFNULL() 返回一个数字或字符串值,这取决于它被使用的语境:
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'
在 MySQL 4.0.6 和更新版本中,IFNULL(expr1,expr2) 的默认返回值以 STRINGREALINTEGER 顺序更加'general'了两个表达式。当你基于一个表达式创建一个表或在一个临时表中 MySQL 不得不存储一个从 IFNULL() 返回的值时,这个与较早 MySQL 版本的不同将更加值得注意。
CREATE TABLE foo SELECT IFNULL(1,"test") as test;
在 MySQL 4.0.6 中,列 'test' 的类型为 CHAR(4),然而在较早的版本中,你得到的却是 BIGINT

NULLIF(expr1,expr2)
如果 expr1 = expr2 为真,返回 NULL,否则返回 expr1。它等同于 CASE WHEN x = y THEN NULL ELSE x END
mysql> SELECT NULLIF(1,1);
        -> NULL
mysql> SELECT NULLIF(1,2);
        -> 1
注意,如果参数不相等,在 MySQL 中,expr1 被求值两次。

IF(expr1,expr2,expr3)
如果 expr1 为真(expr1 <> 0 以及 expr1 <> NULL),那么 IF() 返回 expr2,否则返回 expr3IF() 返回一个数字或字符串,这取决于它被使用的语境:
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'
如果 expr2expr3 明确地为 NULL,那么函数 IF() 的返回值类型为非 NULL 列的类型。(这在选择在 MySQL 4.0.3 中新加入)。 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) 的测试结果。这可能不是你所期望的。在第二种情况下,比较测试原浮点数是否为一个非零值。比较的结果被作为整数使用。 缺省的 IF() 返回值类型 (当结果存储在临时表中时,这是非常重要的) 在 MySQL 3.23 中按下列方式确定:
表达式 返回值
表达式(expr2)或表达式(expr3)返回值为字符串 字符串
表达式(expr2)或表达式(expr3)返回值为浮点型值 浮点型
表达式(expr2)或表达式(expr3)返回值为整型 整型
如果表达式(expr2)和表达式(expr3)均是字符串,同时两个字符串均是忽略字母大小写的,那么返回值也是忽略字母大小写的(从 MySQL 3.23.51 开始)。

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
第一个形式当 value=compare-value 时返回 result。第二个形式当第一个为真值的 condition 出现时,返回该条件的结果。如果没有匹配的结果值,那么ELSE后的结果将被返回。如果没有 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

返回值的类型 (INTEGERDOUBLESTRING) 与第一个返回值(第一个 THEN 后的表达式)的类型相同。

6.3.2 字符串函数

如果返回结果的长度超过服务器参数 max_allowed_packet 的大小,字符串值函数将返回 NULL。查看章节 5.5.2 调节服务器参数

对于操作字符串位置的函数,第一个位置被标记为 1。

ASCII(str)
返回字符串 str 最左边的那个字符的 ASCII 码值。如果 str 是一个空字符串,那么返回值为 0。如果 str 是一个 NULL,返回值也是 NULL
mysql> SELECT ASCII('2');
        -> 50
mysql> SELECT ASCII(2);
        -> 50
mysql> SELECT ASCII('dx');
        -> 100
也可参看 ORD() 函数。

ORD(str)
如果字符串 str 的最左边的字符是一个多字节的字符,根据多字节字符的成分字符的 ASCII 码值通过下面的公式计算返回那个的编码:((first byte ASCII code)*256+(second byte ASCII code))[*256+third byte ASCII code...]。如果最左边的字符不是一个多字节字符,返回值与 ASCII() 函数相同:
mysql> SELECT ORD('2');
        -> 50
CONV(N,from_base,to_base)
在不同的数字基数之间转换数字。将数字 Nfrom_base 转换到 to_base,并以字符串表示形式返回。如果任何一个参数为 NULL,那么返回值也为 NULL。参数 N 被解释为是一个整数,但是也可以被指定为一个整数或一个字符串。最小基为 2,最大基为 36。如果 to_base 是一个负值,N 将被看作为是一个有符号数字。否则,N 被视为是无符号的。CONV 以 64 位精度工作:
mysql> SELECT CONV("a",16,2);
        -> '1010'
mysql> SELECT CONV("6E",18,8);
        -> '172'
mysql> SELECT CONV(-17,10,-18);
        -> '-H'
mysql> SELECT CONV(10+"10"+'10'+0xa,10,10);
        -> '40'
BIN(N)
返回 N 的字符串表示的二进制值形式,在这里,N 长长的(BIGINT)数字。这个函数等价于 CONV(N,10,2)。如果 N 是一个 NULL,返回值也是 NULL
mysql> SELECT BIN(12);
        -> '1100'
OCT(N)
返回 N 的字符串表示的八进制值形式,在这里,N 是一个长长的数字。这个函数等价于 CONV(N,10,8)。如果 N 是一个 NULL,返回值也是 NULL
mysql> SELECT OCT(12);
        -> '14'
HEX(N_or_S)
如果 N_OR_S 是一个数字,返回 N 的字符串表示的十六进制值形式,这里 N 是一个长长的(BIGINT)数字。这个函数等价于 CONV(N,10,16)。 如果 N_OR_S 是一个字符串,N_OR_S 中的每个字符均被转换为 2 位十六进制数字,并以十六进制的字符串形式返回。这是 0xff 形式的字符串反转操作。
mysql> SELECT HEX(255);
        -> 'FF'
mysql> SELECT HEX("abc");
        -> 616263
mysql> SELECT 0x616263;
        -> "abc"
CHAR(N,...)
CHAR() 以整数类型解释参数,返回这个整数所代表的 ASCII 码值给出的字符组成的字符串。NULL 值将被忽略:
mysql> SELECT CHAR(77,121,83,81,'76');
        -> 'MySQL'
mysql> SELECT CHAR(77,77.3,'77.3');
        -> 'MMM'
CONCAT(str1,str2,...)
将参数连接成字符串返回。如果有任何一个参数为 NULL,返回值也为 NULL。可以有超过 2 个的参数。数字参数将被转换为相等价的字符串形式:
mysql> SELECT CONCAT('My', 'S', 'QL');
        -> 'MySQL'
mysql> SELECT CONCAT('My', NULL, 'QL');
        -> NULL
mysql> SELECT CONCAT(14.3);
        -> '14.3'
CONCAT_WS(separator, str1, str2,...)
CONCAT_WS() 支持 CONCAT 加上一个分隔符,它是一个特殊形式的 CONCAT()。第一个参数剩余参数间的分隔符。分隔符可以是与剩余参数一样的字符串。如果分隔符是 NULL,返回值也将为 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'
LENGTH(str)
OCTET_LENGTH(str)
CHAR_LENGTH(str)
CHARACTER_LENGTH(str)
返回字符串 str 的长度:
mysql> SELECT LENGTH('text');
        -> 4
mysql> SELECT OCTET_LENGTH('text');
        -> 4
注意,CHAR_LENGTH()CHARACTER_LENGTH() 对于多字节字符只计数一次。

BIT_LENGTH(str)
返回字符串 str 的比特长度:
mysql> SELECT BIT_LENGTH('text');
        -> 32
LOCATE(substr,str)
POSITION(substr IN str)
返回子串 substr 在字符串 str 中第一次出现的位置。如果子串 substrstr 中不存在,返回值为 0
mysql> SELECT LOCATE('bar', 'foobarbar');
        -> 4
mysql> SELECT LOCATE('xbar', 'foobar');
        -> 0
这个函数是多字节安全的。在 MySQL 3.23 中,这个函数是字母大小写敏感的,当在 MySQL 4.0 中时,如有任一参数是一个二进制字符串,它才是字母大小写敏感的。

LOCATE(substr,str,pos)
返回子串 substr 在字符串 str 中的第 pos 位置后第一次出现的位置。如果 substr 不在 str 中返回 0
mysql> SELECT LOCATE('bar', 'foobarbar',5);
        -> 7
这个函数是多字节安全的。在 MySQL 3.23 中,这个函数是字母大小写敏感的,当在 MySQL 4.0 中时,如有任一参数是一个二进制字符串,它才是字母大小写敏感的。

INSTR(str,substr)
返回子串 substr 在字符串 str 中第一次出现的位置。这与有两个参数形式的 LOCATE() 相似,只是参数的位置被颠倒了:
mysql> SELECT INSTR('foobarbar', 'bar');
        -> 4
mysql> SELECT INSTR('xbar', 'foobar');
        -> 0
这个函数是多字节安全的。在 MySQL 3.23 中,这个函数是字母大小写敏感的,当在 MySQL 4.0 中时,如有任一参数是一个二进制字符串,它才是字母大小写敏感的。

LPAD(str,len,padstr)
用字符串 padstrstr 进行左边填补直至它的长度达到 len 个字符长度,然后返回 str。如果 str 的长度长于 len',那么它将被截除到 len 个字符。
mysql> SELECT LPAD('hi',4,'??');
        -> '??hi'
RPAD(str,len,padstr)
用字符串 padstrstr 进行右边填补直至它的长度达到 len 个字符长度,然后返回 str。如果 str 的长度长于 len',那么它将被截除到 len 个字符。
mysql> SELECT RPAD('hi',5,'?');
        -> 'hi???'
LEFT(str,len)
返回字符串 str 中最左边的 len 个字符:
mysql> SELECT LEFT('foobarbar', 5);
        -> 'fooba'
这个函数是多字节安全的。

RIGHT(str,len)
返回字符串 str 中最右边的 len 个字符:
mysql> SELECT RIGHT('foobarbar', 4);
        -> 'rbar'
这个函数是多字节安全的。

SUBSTRING(str,pos,len)
SUBSTRING(str FROM pos FOR len)
MID(str,pos,len)
从字符串 strpos 位置起返回 len 个字符的子串。使用 FROM 的变体形式是 ANSI SQL92 的句法:
mysql> SELECT SUBSTRING('Quadratically',5,6);
        -> 'ratica'
这个函数是多字节安全的。

SUBSTRING(str,pos)
SUBSTRING(str FROM pos)
从字符串 strpos 位置起返回子串:
mysql> SELECT SUBSTRING('Quadratically',5);
        -> 'ratically'
mysql> SELECT SUBSTRING('foobarbar' FROM 4);
        -> 'barbar'
这个函数是多字节安全的。

SUBSTRING_INDEX(str,delim,count)
返回字符串 str 中在第 count 个出现的分隔符 delim 之前的子串。如果 count 是一个正数,返回从最后的(从左边开始计数)分隔符到左边所有字符。如果 count 是负数,返回从最后的(从右边开始计数)分隔符到右边所有字符:
mysql> SELECT SUBSTRING_INDEX('www.mysql.com', '.', 2);
        -> 'www.mysql'
mysql> SELECT SUBSTRING_INDEX('www.mysql.com', '.', -2);
        -> 'mysql.com'
这个函数是多字节安全的。

LTRIM(str)
返回移除了领头的空格字符后的 str
mysql> SELECT LTRIM('  barbar');
        -> 'barbar'

RTRIM(str)
返回移除了尾部的空格字符后的 str
mysql> SELECT RTRIM('barbar   ');
        -> 'barbar'
这个函数是多字节安全的。

TRIM([[BOTH | LEADING | TRAILING] [remstr] FROM] str)
移除字符串 str 中所有的 remstr 前缀或后缀,然后将其返回。如果没有任何 BOTHLEADINGTRAILING 修饰符被给出,BOTH 被假定。如果 remstr 没有被指定,空格将被移除:
mysql> SELECT TRIM('  bar   ');
        -> 'bar'
mysql> SELECT TRIM(LEADING 'x' FROM 'xxxbarxxx');
        -> 'barxxx'
mysql> SELECT TRIM(BOTH 'x' FROM 'xxxbarxxx');
        -> 'bar'
mysql> SELECT TRIM(TRAILING 'xyz' FROM 'barxxyz');
        -> 'barx'
这个函数是多字节安全的。

SOUNDEX(str)
返回 str 的近音字。两个发音差不多的字符串应该有同样的近音字。一个标准的近音字为 4 个字符长,但是函数 SOUNDEX() 却返回一个任意长的字符串。你可以在结果上使用 SUBSTRING() 标准的近音字。提供的字符中所有的非数字字母的字符均被忽略。所有在 A-Z 范围之外的国际 alpha 字符被视为元音:
mysql> SELECT SOUNDEX('Hello');
        -> 'H400'
mysql> SELECT SOUNDEX('Quadratically');
        -> 'Q36324'

SPACE(N)
返回有 N 空格字符组成的字符串:
mysql> SELECT SPACE(6);
        -> '      '

REPLACE(str,from_str,to_str)
在字符串 str 中所有出现的字符串 from_str 均被 to_str替换,然后返回这个字符串:
mysql> SELECT REPLACE('www.mysql.com', 'w', 'Ww');
        -> 'WwWwWw.mysql.com'
这个函数是多字节安全的。

REPEAT(str,count)
返回一个由重复了 count 次的字符串 str 组成的字符串。如果 count <= 0,返回一个空字符串。如果 strcountNULL,返回值也为 NULL
mysql> SELECT REPEAT('MySQL', 3);
        -> 'MySQLMySQLMySQL'

REVERSE(str)
以颠倒的字符顺序返回字符串 str
mysql> SELECT REVERSE('abc');
        -> 'cba'
这个函数是多字节安全的。

INSERT(str,pos,len,newstr)
在字符串 str 中,将从 pos 位置开始,len 个字符长的子串替换为字符串 newstr ,然后将结果返回:
mysql> SELECT INSERT('Quadratic', 3, 4, 'What');
        -> 'QuWhattic'
这个函数是多字节安全的。

ELT(N,str1,str2,str3,...)
如果 N = 1,返回 str1,如果N = 2,返回 str2,等等。如果 N 小于 1 或大于参数的数量,返回 NULLELT() FIELD() 反运算:
mysql> SELECT ELT(1, 'ej', 'Heja', 'hej', 'foo');
        -> 'ej'
mysql> SELECT ELT(4, 'ej', 'Heja', 'hej', 'foo');
        -> 'foo'

FIELD(str,str1,str2,str3,...)
返回 str 在列表 str1, str2, str3, ... 中的索引。如果 str 没有发现,返回 0FIELD()ELT() 的反运算:
mysql> SELECT FIELD('ej', 'Hej', 'ej', 'Heja', 'hej', 'foo');
        -> 2
mysql> SELECT FIELD('fo', 'Hej', 'ej', 'Heja', 'hej', 'foo');
        -> 0

FIND_IN_SET(str,strlist)
Returns a value 如果字符串 str 在由 N 个子串组成的列表 strlist 中,返回一个 1N 的值。一个字符串列表是由通过字符 “,” 分隔的多个子串组成。如果第一个参数是一个常数字符串,并且第二个参数是一个 SET 列类型,FIND_IN_SET() 函数将被优化为使用位运算!如果 str 在不 strlist 中或者如果 strlist 是一个空串,返回值为 0。如果任何一个参数为 NULL,返回值也是 NULL。如果第一个参数包含一个 “,”,这个函数将完全不能工作:
mysql> SELECT FIND_IN_SET('b','a,b,c,d');
        -> 2

MAKE_SET(bits,str1,str2,...)
返回一个集合 (包含由字符 “,” 分隔的多个子串组成的一个字符串),它由在 bits 集合中有相应的比特位的字符串组成。str1 对应于比特位 0,str2 对应比特位 1,等等。在 str1, str2, ... 中的 NULL 串不允许被添加到结果中:
mysql> SELECT MAKE_SET(1,'a','b','c');
        -> 'a'
mysql> SELECT MAKE_SET(1 | 4,'hello','nice','world');
        -> 'hello,world'
mysql> SELECT MAKE_SET(0,'a','b','c');
        -> ''

EXPORT_SET(bits,on,off,[separator,[number_of_bits]])
返回一个字符串,对于在 'bits' 中的每个比特字位,你将得到一个 'on' 字符,而如果比特字位是一个清零比特位(reset bit)你将得到一个 'off' 字符串。每个字符串均被“分隔符”(缺省为“,”)分隔,并且只有 'number_of_bits'(缺省为 64) 个 'bits' 被使用:
mysql> SELECT EXPORT_SET(5,'Y','N',',',4)
        -> Y,N,Y,N
示例(译者注):
mysql> select EXPORT_SET(1,'1','0','',5);
        -> 10000 
# 最左边第一位为 2 的 0 次幂

mysql> select EXPORT_SET(2,'1','0','',5);
        -> 01000
# 最左边第一位为 2 的 0 次幂,第二位为 2 的 1 次幂        

mysql> select EXPORT_SET(4,'1','0','',5);
        -> 00100
# 最左边第一位为 2 的 0 次幂,第二位为 2 的 1 次幂,第三位为2的2次幂  

mysql> select EXPORT_SET(15,'1','0','',5);
        -> 11110
# 最左边第一位为 2 的 1 次幂,第四位为 2 的 3 次幂  

mysql> select EXPORT_SET(16,'1','0','',5);
        -> 00001
# 最左边第一位为 2 的 1 次幂,第五位为 2 的 4 次幂 


# 以上结果在 MySQL 4.0.12 中测试通过
示例结束(译者注)

LCASE(str)
LOWER(str)
依照当前字符集设置映射(缺省为 ISO-8859-1 Latin1),将字符串 str 中的所有字符改变为小写,然后返回该值:
mysql> SELECT LCASE('QUADRATICALLY');
        -> 'quadratically'
这个函数是多字节安全的。

UCASE(str)
UPPER(str)
依照当前字符集设置映射(缺省为 ISO-8859-1 Latin1),将字符串 str 中的所有字符改变为大写,然后返回该值:
mysql> SELECT UCASE('Hej');
        -> 'HEJ'
这个函数是多字节安全的。

LOAD_FILE(file_name)
读入文件,并将文件内容作为一个字符串返回。这个文件必须在服务器上,必须指定文件完整的路径名,并且你必须有 FILE 权限。文件必须完全可读,并且小于 max_allowed_packet。 如果该文件不存在,或因为上面的任一原因而不能被读出,函数返回 NULL
mysql> UPDATE tbl_name
           SET blob_column=LOAD_FILE("/tmp/picture")
           WHERE id=1;
如果你没有使用 MySQL 3.23,你不得不在你的应用程序中读取文件,以文件的信息创建一个 INSERT 语句,来更新数据库。如果你使用 MySQL++ 库,下面有一个示例,详细请查看 http://www.mysql.com/documentation/mysql++/mysql++-examples.html

QUOTE(str)
引用一个字符串,并返回一个结果,该结果可作为一个适当转义过的数据值在一个 SQL 语句中使用。字符串被单引号包围着返回,并且在该字符串中每个单引号(“'”)、反斜线符号(“\”)、ASCII NUL 和 Control-Z 出现的地方,在该字符之前均被加上了一个反斜线。如果参数是 NULL,那么结果值是一个没有单引号包围的单词 “NULL”。 QUOTE 函数在 MySQL 4.0.3 中被加入。
mysql> SELECT QUOTE("Don't");
        -> 'Don\'t!'
mysql> SELECT QUOTE(NULL);
        -> NULL

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

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