3 用于 SELECT 和 WHERE 子句的函数
一个 SQL 语句中的 select_expression 或 where_definition 可由任何使用了下面所描述函数的表达式组成。
包含 NULL 的表达式总是得出一个 NULL 值结果,除非表达式中的操作和函数在文档中有另外的说明。
注意:在一个函数名和跟随它的括号之间必须不存在空格。这有助于 MySQL 语法分析程序区分函数调用和对恰巧与函数同名表或列的引用。然而,参数左右两边的空格却是允许的。
你可以强制 MySQL 接受函数名后存在空格的形式,这需要通过以 --ansi 选项启动 mySQLd,或在 mySQL_connect() 中使用 CLIENT_IGNORE_SPACE,但是,在这种情况下,所有的函数名均将成为保留字。.
为了简洁,从 mySQL 程序输出的例子以缩写的形式显示。因此:
mySQL> SELECT MOD(29,9); 1 rows in set (0.00 sec) +-----------+ | mod(29,9) | +-----------+ | 2 | +-----------+
将被显示为这样:
mySQL> SELECT MOD(29,9);
-> 2
3.1 无类型的特殊运算符和函数
3.1.1 圆括号
( ... )
括号,使用它来强制一个表达式的计算顺序。
mySQL> SELECT 1+2*3;
-> 7
mySQL> SELECT (1+2)*3;
-> 9
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 NULLIS 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来禁止。 - 对于
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
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 中被添加。
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)返回值为整型 整型 如果表达式(expr2)和表达式(expr3)均是字符串,同时两个字符串均是忽略字母大小写的,那么返回值也是忽略字母大小写的(从 MySQL 3.23.51 开始)。 CASE value WHEN [compare-value] THEN result [WHEN [compare-value] THEN result ...] [ELSE result] ENDCASE 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 后的表达式)的类型相同。
3.2 字符串函数
如果返回结果的长度超过服务器参数 max_allowed_packet 的大小,字符串值函数将返回 NULL。
对于操作字符串位置的函数,第一个位置被标记为 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
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 patexpr RLIKE pat- 依照模式
pat对字符串表达式expr执行一个模式比较。模式可以是一个扩展的正则表达式。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 patexpr 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 中被新加入。
3.2.2 字母大小写敏感性
BINARYBINARY操作符将跟在它后面的字符串强制作为一个二进制字符串。这可以很容易地强制一个列的比较以字母大小写敏感方式进行,即使该列没有定义为BINARY或BLOB?mySQL> SELECT \"a\" = \"A\"; -> 1 mySQL> SELECT BINARY \"a\" = \"A\"; -> 0BINARY string是CAST(string AS BINARY)的缩写。BINARY在 MySQL 3.23.0 中被加入。 注意,当将一个索引列强制为BINARY时,在某些语境中,MySQL 将不能有效地使用索引。
如果希望对一个 blob 进行忽略字母大小的比较时,你通常可以在比较前将它转换到大写:
SELECT 'A' LIKE UPPER(blob_col) FROM table_name;
我们计划不久推出在不同字符集间的转化,以使字符串比较有更好的伸缩性。
3.3 数字函数
3.3.1 算术运算
常用的算术操作符均是可用的。注意,如果两个参数均是整型,`-', `+' 和 `*' 以 BIGINT (64 位)精度运算并返回结果!如果一个参数是一个无符号的整数,另一个参数也是一个整数,结果也将是一个无符号整数。
+- 加法:
mySQL> SELECT 3+5; -> 8 -- 减法:
mySQL> SELECT 3-5; -> -2 *- 乘法:
mySQL> SELECT 3*5; -> 15 mySQL> SELECT 18014398509481984*18014398509481984.0; -> 324518553658426726783156020576250 mySQL> SELECT 18014398509481984*18014398509481984; -> 0最后一个表达式的结果是错误的,这是因为乘法结果超过了 64 位BIGINT计算范围。 /- 除法:
mySQL> SELECT 3/5; -> 0.60被 0 除将返回一个NULL结果:mySQL> SELECT 102/(1-1); -> NULL只有当在一个结果被转换到一个整数的语境中执行时,除法将会以BIGINT进行算术计算。
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)- 以
-1、0或1方式返回参数的符号,它取决于参数X是负数、0 或正数。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 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 -> 2DIV在 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); -> 1000000 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); -> 1000000 mySQL> SELECT LOG2(-100); -> NULLLOG2()通常可以用于计数出一个数字需要多少个比特位用于存储它。这个函数在 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)- 返回
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 值(圆周率)。缺少显示 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不在-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的值。如果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 ATAN(Y,X)ATAN2(Y,X)- 返回两个变量
X和Y的反正切。它类似于计算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)- 返回一个范围在
0到1.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.000000RADIANS(X)- 将参数
X从角度转换为弧度,然后返回:mySQL> SELECT RADIANS(90); -> 1.570796TRUNCATE(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 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 的形式被存储的。
3.4 日期和时间函数
对于每个类型的值范围以及日期和时间值有效指定格式,这里是一个使用日期函数的例子。下面的查询选择所有 date_col 值在最后 30 天内的记录。
mySQL> SELECT something FROM tbl_name WHERE TO_DAYS(NOW()) - TO_DAYS(date_col) <= 30;
DAYOFWEEK(date)- 返回
date的星期索引(1= Sunday,2= Monday, ...7= Saturday)。索引值符合 ODBC 的标准。mySQL> SELECT DAYOFWEEK('1998-02-03'); -> 3 WEEKDAY(date)- 返回
date的星期索引(0= Monday,1= Tuesday, ...6= Sunday):mySQL> SELECT WEEKDAY('1998-02-03 22:23:00'); -> 1 mySQL> SELECT WEEKDAY('1997-11-05'); -> 2 DAYOFMONTH(date)- 返回
date是一月中的第几天,范围为1到31:mySQL> SELECT DAYOFMONTH('1998-02-03'); -> 3 DAYOFYEAR(date)- 返回
date是一年中的第几天,范围为1到366:mySQL> SELECT DAYOFYEAR('1998-02-03'); -> 34 MONTH(date)- 返回
date中的月份,范围为1到12:mySQL> SELECT MONTH('1998-02-03'); -> 2 DAYNAME(date)- 返回
date的星期名:mySQL> SELECT DAYNAME(\"1998-02-05\"); -> 'Thursday' MONTHNAME(date)- 返回
date的月份名:mySQL> SELECT MONTHNAME(\"1998-02-05\"); -> 'February' QUARTER(date)- 返回
date在一年中的季度,范围为1到4:mySQL> SELECT QUARTER('98-04-01'); -> 2 WEEK(date)WEEK(date,first)- 对于星期日是一周中的第一天的场合,如果函数只有一个参数调用,返回
date为一年的第几周,返回值范围为0到53(是的,可能有第 53 周的开始)。两个参数形式的WEEK()允许你指定一周是否以星期日或星期一开始,以及返回值为0-53还是1-52。 这里的一个表显示第二个参数是如何工作的: 值含义0 一周以星期日开始,返回值范围为 0-53 1 一周以星期一开始,返回值范围为 0-53 2 一周以星期日开始,返回值范围为 1-53 3 一周以星期一开始,返回值范围为 1-53 (ISO 8601)mySQL> SELECT WEEK('1998-02-20'); -> 7 mySQL> SELECT WEEK('1998-02-20',0); -> 7 mySQL> SELECT WEEK('1998-02-20',1); -> 8 mySQL> SELECT WEEK('1998-12-31',1); -> 53注意,在版本 4.0 中,WEEK(#,0)被更改为匹配 USA 历法。 注意,如果一周是上一年的最后一周,当你没有使用 2 或 3 做为可选参数时,MySQL 将返回 0:mySQL> SELECT YEAR('2000-01-01'), WEEK('2000-01-01',0); -> 2000, 0 mySQL> SELECT WEEK('2000-01-01',2); -> 52你可能会争辩说,当给定的日期值实际上是 1999 年的第 52 周的一部分时,MySQL 对WEEK()函数应该返回52。我们决定返回 0 ,是因为我们希望该函数返回“在指定年份中是第几周”。当与其它的提取日期值中的月日值的函数结合使用时,这使得WEEK()函数的用法可靠。 如果你更希望能得到恰当的年-周值,那么你应该使用参数 2 或 3 做为可选参数,或者使用函数YEARWEEK():mySQL> SELECT YEARWEEK('2000-01-01'); -> 199952 mySQL> SELECT MID(YEARWEEK('2000-01-01'),5,2); -> 52 YEAR(date)- 返回
date的年份,范围为1000到9999:mySQL> SELECT YEAR('98-02-03'); -> 1998 YEARWEEK(date)YEARWEEK(date,first)- 返回一个日期值是的哪一年的哪一周。第二个参数的形式与作用完全与
WEEK()的第二个参数一致。注意,对于给定的日期参数是一年的第一周或最后一周的,返回的年份值可能与日期参数给出的年份不一致:mySQL> SELECT YEARWEEK('1987-01-01'); -> 198653注意,对于可选参数 0 或 1,周值的返回值不同于WEEK()函数所返回值(0),WEEK()根据给定的年语境返回周值。 HOUR(time)- 返回
time的小时值,范围为0到23:mySQL> SELECT HOUR('10:05:03'); -> 10 MINUTE(time)- 返回
time的分钟值,范围为0到59:mySQL> SELECT MINUTE('98-02-03 10:05:03'); -> 5 SECOND(time)- 返回
time的秒值,范围为0到59:mySQL> SELECT SECOND('10:05:03'); -> 3 PERIOD_ADD(P,N)- 增加
N个月到时期P(格式为YYMM或YYYYMM)中。以YYYYMM格式返回值。 注意,期间参数P不是 一个日期值:mySQL> SELECT PERIOD_ADD(9801,2); -> 199803 PERIOD_DIFF(P1,P2)- 返回时期
P1和P2之间的月数。P1和P2应该以YYMM或YYYYMM指定。 注意,时期参数P1和P2不是 日期值:mySQL> SELECT PERIOD_DIFF(9802,199703); -> 11 DATE_ADD(date,INTERVAL expr type)DATE_SUB(date,INTERVAL expr type)ADDDATE(date,INTERVAL expr type)SUBDATE(date,INTERVAL expr type)- 这些函数执行日期的算术运算。
ADDDATE()和SUBDATE()分别是DATE_ADD()和DATE_SUB()的同义词。 在 MySQL 3.23 中,如果表达式的右边是一个日期值或一个日期时间型字段,你可以使用+和-代替DATE_ADD()和DATE_SUB()(示例如下)。 参数date是一个DATETIME或DATE值,指定一个日期的开始。expr是一个表达式,指定从开始日期上增加还是减去间隔值。expr是一个字符串;它可以以一个 “-” 领头表示一个负的间隔值。type是一个关键词,它标志着表达式以何格式被解释。 下表显示type和expr参数是如何关联的:type值expr期望的格式SECONDSECONDSMINUTEMINUTESHOURHOURSDAYDAYSMONTHMONTHSYEARYEARSMINUTE_SECOND\"MINUTES:SECONDS\"HOUR_MINUTE\"HOURS:MINUTES\"DAY_HOUR\"DAYS HOURS\"YEAR_MONTH\"YEARS-MONTHS\"HOUR_SECOND\"HOURS:MINUTES:SECONDS\"DAY_MINUTE\"DAYS HOURS:MINUTES\"DAY_SECOND\"DAYS HOURS:MINUTES:SECONDS\"在expr的格式中,MySQL 允许任何字符作为定界符。表中所显示的是建议的定界字符。如果date参数是一个DATE值,并且计算的间隔仅仅有YEAR、MONTH和DAY部分(没有时间部分),那么返回值也是一个DATE值。否则返回值是一个DATETIME值:mySQL> SELECT \"1997-12-31 23:59:59\" + INTERVAL 1 SECOND; -> 1998-01-01 00:00:00 mySQL> SELECT INTERVAL 1 DAY + \"1997-12-31\"; -> 1998-01-01 mySQL> SELECT \"1998-01-01\" - INTERVAL 1 SECOND; -> 1997-12-31 23:59:59 mySQL> SELECT DATE_ADD(\"1997-12-31 23:59:59\", -> INTERVAL 1 SECOND); -> 1998-01-01 00:00:00 mySQL> SELECT DATE_ADD(\"1997-12-31 23:59:59\", -> INTERVAL 1 DAY); -> 1998-01-01 23:59:59 mySQL> SELECT DATE_ADD(\"1997-12-31 23:59:59\", -> INTERVAL \"1:1\" MINUTE_SECOND); -> 1998-01-01 00:01:00 mySQL> SELECT DATE_SUB(\"1998-01-01 00:00:00\", -> INTERVAL \"1 1:1:1\" DAY_SECOND); -> 1997-12-30 22:58:59 mySQL> SELECT DATE_ADD(\"1998-01-01 00:00:00\", -> INTERVAL \"-1 10\" DAY_HOUR); -> 1997-12-30 14:00:00 mySQL> SELECT DATE_SUB(\"1998-01-02\", INTERVAL 31 DAY); -> 1997-12-02如果你指定了一个太短的间隔值(没有包括type关键词所期望的所有间隔部分),MySQL 假设你遗漏了间隔值的最左边部分。例如,如果指定一个type为DAY_SECOND,那么expr值被期望包含天、小时、分钟和秒部分。如果你象\"1:10\"样指定一个值,MySQL 假设天和小时部分被遗漏了,指定的值代表分钟和秒。换句话说,\"1:10\" DAY_SECOND被解释为等价于\"1:10\" MINUTE_SECOND。这类似于 MySQL 解释TIME值为经过的时间而不是一天的时刻。 注意,如果依着包含一个时间部分的间隔增加或减少一个日期值,该日期值将被自动地转换到一个日期时间值:mySQL> SELECT DATE_ADD(\"1999-01-01\", INTERVAL 1 DAY); -> 1999-01-02 mySQL> SELECT DATE_ADD(\"1999-01-01\", INTERVAL 1 HOUR); -> 1999-01-01 01:00:00如果你使用了确定不正确的日期,返回结果将是NULL。如果你增加MONTH、YEAR_MONTH或YEAR,并且结果日期的天比新月份的最大天数还大,那么它将被调整到新月份的最大天数:mySQL> SELECT DATE_ADD('1998-01-30', INTERVAL 1 MONTH); -> 1998-02-28注意,上面的例子中,单词INTERVAL和关键词type是不区分字母大小写的。 EXTRACT(type FROM date)EXTRACT()函数使用与DATE_ADD()或DATE_SUB()一致的间隔类型,但是它用于指定从日期中提取的部分,而不是进行日期算术运算。mySQL> SELECT EXTRACT(YEAR FROM \"1999-07-02\"); -> 1999 mySQL> SELECT EXTRACT(YEAR_MONTH FROM \"1999-07-02 01:02:03\"); -> 199907 mySQL> SELECT EXTRACT(DAY_MINUTE FROM \"1999-07-02 01:02:03\"); -> 20102TO_DAYS(date)- 给出一个日期
date,返回一个天数(从 0 年开始的天数):mySQL> SELECT TO_DAYS(950501); -> 728779 mySQL> SELECT TO_DAYS('1997-10-07'); -> 729669TO_DAYS()无意于使用先于格里高里历法(即现行的阳历)(1582)出现的值,因为它不考虑当历法改变时所遗失的天数。 FROM_DAYS(N)- 给出一个天数
N,返回一个DATE值:mySQL> SELECT FROM_DAYS(729669); -> '1997-10-07'FROM_DAYS()无意于使用先于格里高里历法(1582)出现的值,因为它不考虑当历法改变时所遗失的天数。 DATE_FORMAT(date,format)- 依照
format字符串格式化date值。下面的修饰符可被用于format字符串中: 修饰符 含义%M月的名字 (January..December)%W星期的名字 (Sunday..Saturday)%D有英文后缀的某月的第几天 (0th,1st,2nd,3rd, etc.)%Y年份,数字的,4 位%y年份,数字的,2 位%X周值的年份,星期日是一个星期的第一天,数字的,4 位,与 '%V' 一同使用%x周值的年份,星期一是一个星期的第一天,数字的,4
本文地址:http://www.cg3000.com/html/cgTutorials/Website/SQL/20070705/MySQLyuyancankao_3___SELECTheWHEREzijudehanshu_14959.shtml


当前位置 :