mysql用于SELECT和WHERE子句的函数的详细介绍
6.3 用于 SELECT
和 WHERE
子句的函数
一个 SQL 语句中的 select_expression
或 where_definition
可由任何使用了下面所描述函数的表达式组成。
包含 NULL
的表达式总是得出一个 NULL
值结果,除非表达式中的操作和函数在文档中有另外的说明。
注意:在一个函数名和跟随它的括号之间必须不存在空格。这有助于 MySQL 语法分析程序区分函数调用和对恰巧与函数同名表或列的引用。然而,参数左右两边的空格却是允许的。
你可以强制 MySQL 接受函数名后存在空格的形式,这需要通过以 --ansi
选项启动 mysqld
,或在 mysql_connect()
中使用 CLIENT_IGNORE_SPACE
,但是,在这种情况下,所有的函数名均将成为保留字。查看章节 1.8.2 以 ANSI 模式运行 MySQL.
为了简洁,从 mysql
程序输出的例子以缩写的形式显示。因此:
mysql> SELECT MOD(29,9); 1 rows in set (0.00 sec) +-----------+ | mod(29,9) | +-----------+ | 2 | +-----------+
将被显示为这样:
mysql> SELECT MOD(29,9); -> 2
6.3.1 无类型的特殊运算符和函数
6.3.1.1 圆括号
( ... )
括号,使用它来强制一个表达式的计算顺序。
mysql> SELECT 1+2*3; -> 7 mysql> SELECT (1+2)*3; -> 9
6.3.1.2 比较运算符
比较运算符的结果是 1
(TRUE)、0
(FALSE) 或 NULL
。这些函数可工作于数字和字符串上。根据需要,字符串将会自动地被转换到数字,以及数字被转换成字符串(比如在 Perl 中)。
MySQL 使用下列规则进行比较:
-
如果一个或两个参数是
NULL
,比较的结果是NULL
,除了<=>
运算符。 - 如果在一个比较操作中两个参数均是字符串,他们将作为字符串被比较。
- 如果两个参数均是整数,他们作为整数被比较。
- 十六进制值如果不与一个数字进行比较,那么它将当作一个二进制字符串。
-
如果参数之一是一个
TIMESTAMP
或DATETIME
列,而另一参数是一个常数,在比较执行之前,这个常数被转换为一个时间戳。这样做是为了对 ODBC 更友好。 - 在所有其它情况下,参数作为浮点(real)数字被比较。
缺省地,字符串使用当前字符集以忽略字母大小写的方式进行比较(缺省的字符集为 ISO-8859-1 Latin1,它对英语处理得很出色)。
下面的例子演示了对于比较操作字符串到数字的转换:
mysql> SELECT 1 > '6x'; -> 0 mysql> SELECT 7 > '6x'; -> 1 mysql> SELECT 0 > 'x6'; -> 0 mysql> SELECT 0 = 'x6'; -> 1
-
=
-
等于:
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
-
<>
-
!=
-
不等于:
mysql> SELECT '.01' <> '0.01'; -> 1 mysql> SELECT .01 <> '0.01'; -> 0 mysql> SELECT 'zapp' <> 'zappp'; -> 1
-
<=
-
小于或等于:
mysql> SELECT 0.1 <= 2; -> 1
-
<
-
小于:
mysql> SELECT 2 < 2; -> 0
-
>=
-
大于或等于:
mysql> SELECT 2 >= 2; -> 1
-
>
-
大于:
mysql> SELECT 2 > 2; -> 0
-
<=>
-
NULL 值安全等于:
mysql> SELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL; -> 1 1 0
-
IS NULL
-
IS NOT NULL
-
测试一个值是或不是
NULL
: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
为了能够与其它程序更好的工作,在使用IS NULL
是 MySQL 支持下列额外选择性:-
通过它,你可以找到最后插入的记录行:
SELECT * FROM tbl_name WHERE auto_col IS NULL
这个操作可以通过设置SQL_AUTO_IS_NULL=0
来禁止。查看章节 5.5.6SET
句法. -
对于
NOT NULL
的DATE
和DATETIME
列,可以通过使用下列语句找到特殊的值0000-00-00
:SELECT * FROM tbl_name WHERE date_column IS NULL
这需要通过某些 ODBC 应用程序才能工作(因为 ODBC 不支持一个0000-00-00
日期)
-
通过它,你可以找到最后插入的记录行:
-
expr BETWEEN min AND max
-
如果
expr
大于或等于min
,并且expr
小于或等于max
,BETWEEN
返回1
,否则返回0
。它等价于表达式(min <= expr AND expr <= max)
,只要所有的参数均是相同的类型。 否则类型会依照上面的规则发生转换,但是应用于所有三个参数。注意,在 MySQL 4.0.5 之前,参数被转换到expr
的类型。mysql> SELECT 1 BETWEEN 2 AND 3; -> 0 mysql> SELECT 'b' BETWEEN 'a' AND 'c'; -> 1 mysql> SELECT 2 BETWEEN 2 AND '3'; -> 1 mysql> SELECT 2 BETWEEN 2 AND 'x-3'; -> 0
-
expr NOT BETWEEN min AND max
-
等同于
NOT (expr BETWEEN min AND max)
。 -
expr IN (value,...)
-
如果
expr
是IN
列表中的作一值,它将返回1
,否则返回0
。如果所有的值均是常数,那么所有的值被依照expr
的类型进行计算和排序。然后以一个二进制搜索方式完成项目的搜索。这就意味着,如果IN
列表完全由常数组成,IN
将是非常快的。如果expr
是一个字母大小写敏感的字符串表达式,字符串比较将以大小写敏感方式执行:mysql> SELECT 2 IN (0,3,5,'wefwf'); -> 0 mysql> SELECT 'wefwf' IN (0,3,5,'wefwf'); -> 1
从 MySQL 4.1 开始(符合 SQL-99 标准),如果左手边的表达式是NULL
,或者在列表中没有发现相匹配的值并且列表中的一个表达式是NULL
,IN
均返回NULL
。 -
expr NOT IN (value,...)
-
等同于
NOT (expr IN (value,...))
。 -
ISNULL(expr)
-
如果
expr
是NULL
,ISNULL()
返回1
,否则返回0
:mysql> SELECT ISNULL(1+1); -> 0 mysql> SELECT ISNULL(1/0); -> 1
注意,对NULL
值使用=
进行比较总是为 false ! -
COALESCE(list)
-
返回列表中第一个非
NULL
的元素:mysql> SELECT COALESCE(NULL,1); -> 1 mysql> SELECT COALESCE(NULL,NULL,NULL); -> NULL
-
INTERVAL(N,N1,N2,N3,...)
-
Returns 如果
N
<N1
返回0
,如果N
<N2
返回1
,等等。所有的参数均被当作整数。为了函数能正确地工作,它要求N1
<N2
<N3
<...
<Nn
。这是因为它使用的是一个二进制的搜索(非常地快):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
如果以任何一个标准运算符(=
, <>
..., 但除了 LIKE
)对一个忽略大小写的字符串进行比较,尾部的空白空间(空格、TAB 和换行)均被忽略。
mysql> SELECT "a" ="A /n"; -> 1
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
,否则返回expr2
。IFNULL()
返回一个数字或字符串值,这取决于它被使用的语境: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)
的默认返回值以STRING
、REAL
或INTEGER
顺序更加'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
,否则返回expr3
。IF()
返回一个数字或字符串,这取决于它被使用的语境: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'
如果expr2
或expr3
明确地为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)返回值为整型 整型 -
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
返回值的类型 (INTEGER
、DOUBLE
或 STRING
) 与第一个返回值(第一个 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)
-
在不同的数字基数之间转换数字。将数字
N
从from_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
中第一次出现的位置。如果子串substr
在str
中不存在,返回值为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)
-
用字符串
padstr
对str
进行左边填补直至它的长度达到len
个字符长度,然后返回str
。如果str
的长度长于len'
,那么它将被截除到len
个字符。mysql> SELECT LPAD('hi',4,'??'); -> '??hi'
-
RPAD(str,len,padstr)
-
用字符串
padstr
对str
进行右边填补直至它的长度达到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)
-
从字符串
str
的pos
位置起返回len
个字符的子串。使用FROM
的变体形式是 ANSI SQL92 的句法:mysql> SELECT SUBSTRING('Quadratically',5,6); -> 'ratica'
这个函数是多字节安全的。 -
SUBSTRING(str,pos)
-
SUBSTRING(str FROM pos)
-
从字符串
str
的pos
位置起返回子串: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
前缀或后缀,然后将其返回。如果没有任何BOTH
、LEADING
或TRAILING
修饰符被给出,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
,返回一个空字符串。如果str
或count
是NULL
,返回值也为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
或大于参数的数量,返回NULL
。ELT()
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
没有发现,返回0
。FIELD()
是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
中,返回一个1
到N
的值。一个字符串列表是由通过字符 “,” 分隔的多个子串组成。如果第一个参数是一个常数字符串,并且第二个参数是一个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
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 SQLLIKE
的扩展。)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
,否则返回0
。RLIKE
是REGEXP
的同义词,它提供了与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
当决定一个字符的类型时,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
-
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
操作符将跟在它后面的字符串强制作为一个二进制字符串。这可以很容易地强制一个列的比较以字母大小写敏感方式进行,即使该列没有定义为BINARY
或BLOB
?mysql> SELECT "a" = "A"; -> 1 mysql> SELECT BINARY "a" = "A"; -> 0
BINARY string
是CAST(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 算术运算
本文地址:http://www.45fan.com/a/question/73117.html