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; -> 1a 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)均是字符串,同时两个字符串均是忽略字母大小写的,那么返回值也是忽略字母大小写的(从 MySQL 3.23.51 开始)。表达式 返回值 表达式(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'; -> 0LIKE允许用在一个数字表达式上。(这是 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"; -> 0BINARY 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
