mysql常用函数
2011-12-07 14:41
447 查看
控制流函数
IFNULL(expr1,expr2)如果
expr1不是
NULL,
IFNULL()返回
expr1,否则它返回
expr2。
IFNULL()返回一个数字或字符串值,取决于它被使用的上下文环境。
mysql>selectIFNULL(1,0); ->1 mysql>selectIFNULL(0,10); ->0 mysql>selectIFNULL(1/0,10); ->10 mysql>selectIFNULL(1/0,'yes'); ->'yes'
IF(expr1,expr2,expr3)如果
expr1是TRUE(
expr1<>0且
expr1<>NULL),那么
IF()返回
expr2,否则它返回
expr3。
IF()返回一个数字或字符串值,取决于它被使用的上下文。
mysql>selectIF(1>2,2,3); ->3 mysql>selectIF(1<2,'yes','no'); ->'yes' mysql>selectIF(strcmp('test','test1'),'yes','no'); ->'no'
expr1作为整数值被计算,它意味着如果你正在测试浮点或字符串值,你应该使用一个比较操作来做。
mysql>selectIF(0.1,1,0); ->0 mysql>selectIF(0.1<>0,1,0); ->1
在上面的第一种情况中,
IF(0.1)返回
0,因为
0.1被变换到整数值,导致测试
IF(0)。这可能不是你期望的。在第二种情况中,比较测试原来的浮点值看它是否是非零,比较的结果被用作一个整数。
CASEvalueWHEN[compare-value]THENresult[WHEN[compare-value]THENresult...][ELSEresult]END
CASEWHEN[condition]THENresult[WHEN[condition]THENresult...][ELSEresult]END
第一个版本返回
result,其中
value=compare-value。第二个版本中如果第一个条件为真,返回result。如果没有匹配的result值,那么结果在
ELSE后的result被返回。如果没有
ELSE部分,那么
NULL被返回。
mysql>SELECTCASE1WHEN1THEN"one"WHEN2THEN"two"ELSE"more"END; ->"one" mysql>SELECTCASEWHEN1>0THEN"true"ELSE"false"END; ->"true" mysql>SELECTCASEBINARY"B"when"a"then1when"b"then2END; ->NULL
数学函数
所有的数学函数在一个出错的情况下返回
NULL。
-单目减。改变参数的符号。
mysql>select-2;
注意,如果这个操作符与一个[code]BIGINT使用,返回值是一个
BIGINT!这意味着你应该避免在整数上使用
-,那可能有值
-2^63![/code]
ABS(X)返回
X的绝对值。
mysql>selectABS(2); ->2 mysql>selectABS(-32); ->32
该功能可安全用于
BIGINT值。
SIGN(X)返回参数的符号,为
-1、
0或
1,取决于
X是否是负数、零或正数。
mysql>selectSIGN(-32); ->-1 mysql>selectSIGN(0); ->0 mysql>selectSIGN(234); ->1
MOD(N,M)
%模(类似C中的
%操作符)。返回
N被
M除的余数。
mysql>selectMOD(234,10); ->4 mysql>select253%7; ->1 mysql>selectMOD(29,9); ->2
这个函数可安全用于[code]BIGINT值。[/code]
FLOOR(X)返回不大于
X的最大整数值。
mysql>selectFLOOR(1.23);
->1
mysql>selectFLOOR(-1.23);
->-2
注意返回值被变换为一个[code]BIGINT![/code]
CEILING(X)返回不小于
X的最小整数值。
mysql>selectCEILING(1.23);
->2
mysql>selectCEILING(-1.23);
->-1
注意返回值被变换为一个
BIGINT!
ROUND(X)返回参数
X的四舍五入的一个整数。
mysql>selectROUND(-1.23);
->-1
mysql>selectROUND(-1.58);
->-2
mysql>selectROUND(1.58);
->2
注意返回值被变换为一个
BIGINT!
ROUND(X,D)返回参数
X的四舍五入的有
D为小数的一个数字。如果
D为
0,结果将没有小数点或小数部分。
mysql>selectROUND(1.298,1);
->1.3
mysql>selectROUND(1.298,0);
->1
注意返回值被变换为一个
BIGINT!
EXP(X)返回值
e(自然对数的底)的
X次方。
mysql>selectEXP(2);
->7.389056
mysql>selectEXP(-2);
->0.135335
LOG(X)返回
X的自然对数。
mysql>selectLOG(2);
->0.693147
mysql>selectLOG(-2);
->NULL
如果你想要一个数字
X的任意底
B的对数,使用公式
LOG(X)/LOG(B)。
LOG10(X)返回
X的以10为底的对数。
mysql>selectLOG10(2);
->0.301030
mysql>selectLOG10(100);
->2.000000
mysql>selectLOG10(-100);
->NULL
POW(X,Y)
POWER(X,Y)返回值
X的
Y次幂。
mysql>selectPOW(2,2);
->4.000000
mysql>selectPOW(2,-2);
->0.250000
SQRT(X)返回非负数
X的平方根。
mysql>selectSQRT(4);
->2.000000
mysql>selectSQRT(20);
->4.472136
PI()返回PI的值(圆周率)。
mysql>selectPI();
->3.141593
COS(X)返回
X的余弦,在这里
X以弧度给出。
mysql>selectCOS(PI());
->-1.000000
SIN(X)返回
X的正弦值,在此
X以弧度给出。
mysql>selectSIN(PI());
->0.000000
TAN(X)返回
X的正切值,在此
X以弧度给出。
mysql>selectTAN(PI()+1);
->1.557408
ACOS(X)返回
X反余弦,即其余弦值是
X。如果
X不在
-1到
1的范围,返回
NULL。
mysql>selectACOS(1);
->0.000000
mysql>selectACOS(1.0001);
->NULL
mysql>selectACOS(0);
->1.570796
ASIN(X)返回
X反正弦值,即其正弦值是
X。
L如果
X不在
-1到
1的范围,返回
NULL。
mysql>selectASIN(0.2);
->0.201358
mysql>selectASIN('foo');
->0.000000
ATAN(X)返回
X的反正切值,即其正切值是
X。
mysql>selectATAN(2);
->1.107149
mysql>selectATAN(-2);
->-1.107149
ATAN2(X,Y)返回2个变量
X和
Y的反正切。它类似于计算
Y/X的反正切,除了两个参数的符号被用来决定结果的象限。
mysql>selectATAN(-2,2);
->-0.785398
mysql>selectATAN(PI(),0);
->1.570796
COT(X)返回
X的余切。
mysql>selectCOT(12);
->-1.57267341
mysql>selectCOT(0);
->NULL
RAND()
RAND(N)返回在范围
0到
1.0内的随机浮点值。如果一个整数参数
N被指定,它被用作种子值。
mysql>selectRAND();
->0.5925
mysql>selectRAND(20);
->0.1811
mysql>selectRAND(20);
->0.1811
mysql>selectRAND();
->0.2079
mysql>selectRAND();
->0.7888
你不能在一个
ORDERBY子句用
RAND()值使用列,因为
ORDERBY将重复计算列多次。然而在MySQL3.23中,你可以做:
SELECT*FROMtable_nameORDERBYRAND(),这是有利于得到一个来自
SELECT*FROMtable1,table2WHEREa=bANDc<dORDERBYRAND()LIMIT1000的集合的随机样本。注意在一个
WHERE子句里的一个
RAND()将在每次
WHERE被执行时重新评估。
LEAST(X,Y,...)有2和2个以上的参数,返回最小(最小值)的参数。参数使用下列规则进行比较:
如果返回值被使用在一个
INTEGER上下文,或所有的参数都是整数值,他们作为整数比较。
如果返回值被使用在一个
REAL上下文,或所有的参数是实数值,他们作为实数比较。
如果任何参数是一个大小敏感的字符串,参数作为大小写敏感的字符串被比较。
在其他的情况下,参数作为大小写无关的字符串被比较。
mysql>selectLEAST(2,0);
->0
mysql>selectLEAST(34.0,3.0,5.0,767.0);
->3.0
mysql>selectLEAST("B","A","C");
->"A"
在MySQL3.22.5以前的版本,你可以使用
MIN()而不是
LEAST。
GREATEST(X,Y,...)返回最大(最大值)的参数。参数使用与
LEAST一样的规则进行比较。
mysql>selectGREATEST(2,0);
->2
mysql>selectGREATEST(34.0,3.0,5.0,767.0);
->767.0
mysql>selectGREATEST("B","A","C");
->"C"
在MySQL在3.22.5以前的版本,你能使用[code]MAX()而不是
GREATEST.[/code]
DEGREES(X)返回参数
X,从弧度变换为角度。
mysql>selectDEGREES(PI());
->180.000000
RADIANS(X)返回参数
X,从角度变换为弧度。
mysql>selectRADIANS(90);
->1.570796
TRUNCATE(X,D)返回数字
X,截断为
D位小数。如果
D为
0,结果将没有小数点或小数部分。
mysql>selectTRUNCATE(1.223,1);
->1.2
mysql>selectTRUNCATE(1.999,1);
->1.9
mysql>selectTRUNCATE(1.999,0);
->1
字符串函数
对于针对字符串位置的操作,第一个位置被标记为1。
ASCII(str)返回字符串
str的最左面字符的ASCII代码值。如果
str是空字符串,返回
0。如果
str是
NULL,返回
NULL。
mysql>selectASCII('2');
->50
mysql>selectASCII(2);
->50
mysql>selectASCII('dx');
->100
也可参见ORD()函数。
ORD(str)如果字符串str最左面字符是一个多字节字符,通过以格式
((firstbyteASCIIcode)*256+(secondbyteASCIIcode))[*256+thirdbyteASCIIcode...]返回字符的ASCII代码值来返回多字节字符代码。如果最左面的字符不是一个多字节字符。返回与
ASCII()函数返回的相同值。
mysql>selectORD('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>selectCONV("a",16,2);
->'1010'
mysql>selectCONV("6E",18,8);
->'172'
mysql>selectCONV(-17,10,-18);
->'-H'
mysql>selectCONV(10+"10"+'10'+0xa,10,10);
->'40'
BIN(N)返回二进制值
N的一个字符串表示,在此
N是一个长整数(
BIGINT)数字,这等价于
CONV(N,10,2)。如果
N是
NULL,返回
NULL。
mysql>selectBIN(12);
->'1100'
OCT(N)返回八进制值
N的一个字符串的表示,在此
N是一个长整型数字,这等价于
CONV(N,10,8)。如果
N是NULL,返回
NULL。
mysql>selectOCT(12);
->'14'
HEX(N)返回十六进制值
N一个字符串的表示,在此
N是一个长整型(
BIGINT)数字,这等价于
CONV(N,10,16)。如果
N是
NULL,返回
NULL。
mysql>selectHEX(255);
->'FF'
CHAR(N,...)
CHAR()将参数解释为整数并且返回由这些整数的ASCII代码字符组成的一个字符串。
NULL值被跳过。
mysql>selectCHAR(77,121,83,81,'76');
->'MySQL'
mysql>selectCHAR(77,77.3,'77.3');
->'MMM'
CONCAT(str1,str2,...)返回来自于参数连结的字符串。如果任何参数是
NULL,返回
NULL。可以有超过2个的参数。一个数字参数被变换为等价的字符串形式。
mysql>selectCONCAT('My','S','QL');
->'MySQL'
mysql>selectCONCAT('My',NULL,'QL');
->NULL
mysql>selectCONCAT(14.3);
->'14.3'
LENGTH(str)
OCTET_LENGTH(str)
CHAR_LENGTH(str)
CHARACTER_LENGTH(str)返回字符串
str的长度。
mysql>selectLENGTH('text');
->4
mysql>selectOCTET_LENGTH('text');
->4
注意,对于多字节字符,其CHAR_LENGTH()仅计算一次。
LOCATE(substr,str)
POSITION(substrINstr)返回子串
substr在字符串
str第一个出现的位置,如果
substr不是在
str里面,返回
0.
mysql>selectLOCATE('bar','foobarbar');
->4
mysql>selectLOCATE('xbar','foobar');
->0
该函数是多字节可靠的。
LOCATE(substr,str,pos)返回子串
substr在字符串
str第一个出现的位置,从位置
pos开始。如果
substr不是在
str里面,返回
0。
mysql>selectLOCATE('bar','foobarbar',5);
->7
这函数是多字节可靠的。
INSTR(str,substr)返回子串
substr在字符串
str中的第一个出现的位置。这与有2个参数形式的
LOCATE()相同,除了参数被颠倒。
mysql>selectINSTR('foobarbar','bar');
->4
mysql>selectINSTR('xbar','foobar');
->0
这函数是多字节可靠的。
LPAD(str,len,padstr)返回字符串
str,左面用字符串
padstr填补直到
str是
len个字符长。
mysql>selectLPAD('hi',4,'??');
->'??hi'
RPAD(str,len,padstr)返回字符串
str,右面用字符串
padstr填补直到
str是
len个字符长。
mysql>selectRPAD('hi',5,'?');
->'hi???'
LEFT(str,len)返回字符串
str的最左面
len个字符。
mysql>selectLEFT('foobarbar',5);
->'fooba'
该函数是多字节可靠的。
RIGHT(str,len)返回字符串
str的最右面
len个字符
。
mysql>selectRIGHT('foobarbar',4);
->'rbar'
该函数是多字节可靠的。
SUBSTRING(str,pos,len)
SUBSTRING(strFROMposFORlen)
MID(str,pos,len)从字符串
str返回一个
len个字符的子串,从位置
pos开始。使用
FROM的变种形式是ANSISQL92语法。
mysql>selectSUBSTRING('Quadratically',5,6);
->'ratica'
该函数是多字节可靠的。
SUBSTRING(str,pos)
SUBSTRING(strFROMpos)从字符串
str的起始位置
pos返回一个子串。
mysql>selectSUBSTRING('Quadratically',5);
->'ratically'
mysql>selectSUBSTRING('foobarbar'FROM4);
->'barbar'
该函数是多字节可靠的。
SUBSTRING_INDEX(str,delim,count)返回从字符串
str的第
count个出现
的分隔符
delim之后的子串。如果
count是正数,返回最后的分隔符到左边(从左边数)的所有字符。如果
count是负数,返回最后的分隔符到右边的所有字符(从右边数)。
mysql>selectSUBSTRING_INDEX('www.mysql.com','.',2);
->'www.mysql'
mysql>selectSUBSTRING_INDEX('www.mysql.com','.',-2);
->'mysql.com'
该函数对多字节是可靠的。
LTRIM(str)返回删除了其前置空格字符的字符串
str。
mysql>selectLTRIM('barbar');
->'barbar'
RTRIM(str)返回删除了其拖后空格字符的字符串
str。
mysql>selectRTRIM('barbar');
->'barbar'
该函数对多字节是可靠的。
TRIM([[BOTH|LEADING|TRAILING][remstr]FROM]str)返回字符串
str,其所有
remstr前缀或后缀被删除了。如果没有修饰符
BOTH、
LEADING或
TRAILING给出,
BOTH被假定。如果
remstr没被指定,空格被删除。
mysql>selectTRIM('bar');
->'bar'
mysql>selectTRIM(LEADING'x'FROM'xxxbarxxx');
->'barxxx'
mysql>selectTRIM(BOTH'x'FROM'xxxbarxxx');
->'bar'
mysql>selectTRIM(TRAILING'xyz'FROM'barxxyz');
->'barx'
该函数对多字节是可靠的。
SOUNDEX(str)返回
str的一个同音字符串。听起来“大致相同”的2个字符串应该有相同的同音字符串。一个“标准”的同音字符串长是4个字符,但是
SOUNDEX()函数返回一个任意长的字符串。你可以在结果上使用
SUBSTRING()得到一个“标准”的同音串。所有非数字字母字符在给定的字符串中被忽略。所有在A-Z之外的字符国际字母被当作元音。
mysql>selectSOUNDEX('Hello');
->'H400'
mysql>selectSOUNDEX('Quadratically');
->'Q36324'
SPACE(N)返回由
N个空格字符组成的一个字符串。
mysql>selectSPACE(6);
->''
REPLACE(str,from_str,to_str)返回字符串
str,其字符串
from_str的所有出现由字符串
to_str代替。
mysql>selectREPLACE('www.mysql.com','w','Ww');
->'WwWwWw.mysql.com'
该函数对多字节是可靠的。
REPEAT(str,count)返回由重复
countTimes次的字符串
str组成的一个字符串。如果
count<=0,返回一个空字符串。如果
str或
count是
NULL,返回
NULL。
mysql>selectREPEAT('MySQL',3);
->'MySQLMySQLMySQL'
REVERSE(str)返回颠倒字符顺序的字符串
str。
mysql>selectREVERSE('abc');
->'cba'
该函数对多字节可靠的。
INSERT(str,pos,len,newstr)返回字符串
str,在位置
pos起始的子串且
len个字符长得子串由字符串
newstr代替。
mysql>selectINSERT('Quadratic',3,4,'What');
->'QuWhattic'
该函数对多字节是可靠的。
ELT(N,str1,str2,str3,...)如果
N=
1,返回
str1,如果
N=
2,返回
str2,等等。如果
N小于
1或大于参数个数,返回
NULL。
ELT()是
FIELD()反运算。
mysql>selectELT(1,'ej','Heja','hej','foo');
->'ej'
mysql>selectELT(4,'ej','Heja','hej','foo');
->'foo'
FIELD(str,str1,str2,str3,...)返回
str在
str1,
str2,
str3,
...清单的索引。如果
str没找到,返回
0。
FIELD()是
ELT()反运算。
mysql>selectFIELD('ej','Hej','ej','Heja','hej','foo');
->2
mysql>selectFIELD('fo','Hej','ej','Heja','hej','foo');
->0
FIND_IN_SET(str,strlist)如果字符串
str在由
N子串组成的表
strlist之中,返回一个
1到
N的值。一个字符串表是被“,”分隔的子串组成的一个字符串。如果第一个参数是一个常数字符串并且第二个参数是一种类型为
SET的列,
FIND_IN_SET()函数被优化而使用位运算!如果
str不是在
strlist里面或如果
strlist是空字符串,返回
0。如果任何一个参数是
NULL,返回
NULL。如果第一个参数包含一个“,”,该函数将工作不正常。
mysql>SELECTFIND_IN_SET('b','a,b,c,d');
->2
MAKE_SET(bits,str1,str2,...)返回一个集合(包含由“,”字符分隔的子串组成的一个字符串),由相应的位在
bits集合中的的字符串组成。
str1对应于位0,
str2对应位1,等等。在
str1,
str2,
...中的
NULL串不添加到结果中。
mysql>SELECTMAKE_SET(1,'a','b','c');
->'a'
mysql>SELECTMAKE_SET(1|4,'hello','nice','world');
->'hello,world'
mysql>SELECTMAKE_SET(0,'a','b','c');
->''
EXPORT_SET(bits,on,off,[separator,[number_of_bits]])返回一个字符串,在这里对于在“bits”中设定每一位,你得到一个“on”字符串,并且对于每个复位(reset)的位,你得到一个“off”字符串。每个字符串用“separator”分隔(缺省“,”),并且只有“bits”的“number_of_bits”(缺省64)位被使用。
mysql>selectEXPORT_SET(5,'Y','N',',',4)
->Y,N,Y,N
LCASE(str)
LOWER(str)返回字符串
str,根据当前字符集映射(缺省是ISO-8859-1Latin1)把所有的字符改变成小写。该函数对多字节是可靠的。
mysql>selectLCASE('QUADRATICALLY');
->'quadratically'
UCASE(str)
UPPER(str)返回字符串
str,根据当前字符集映射(缺省是ISO-8859-1Latin1)把所有的字符改变成大写。该函数对多字节是可靠的。
mysql>selectUCASE('Hej');
->'HEJ'
该函数对多字节是可靠的。
LOAD_FILE(file_name)读入文件并且作为一个字符串返回文件内容。文件必须在服务器上,你必须指定到文件的完整路径名,而且你必须有file权限。文件必须所有内容都是可读的并且小于
max_allowed_packet。如果文件不存在或由于上面原因之一不能被读出,函数返回
NULL。
mysql>UPDATEtable_name
SETblob_column=LOAD_FILE("/tmp/picture")
WHEREid=1;
MySQL必要时自动变换数字为字符串,并且反过来也如此:
mysql>SELECT1+"1";
->2
mysql>SELECTCONCAT(2,'test');
->'2test'
如果你想要明确地变换一个数字到一个字符串,把它作为参数传递到[code]CONCAT()。[/code]
如果字符串函数提供一个二进制字符串作为参数,结果字符串也是一个二进制字符串。被变换到一个字符串的数字被当作是一个二进制字符串。这仅影响比较。
日期和时间函数
对于每个类型拥有的值范围以及并且指定日期何时间值的有效格式的描述见7.3.6日期和时间类型。
这里是一个使用日期函数的例子。下面的查询选择了所有记录,其[code]date_col的值是在最后30天以内:[/code]
mysql>SELECTsomethingFROMtable
WHERETO_DAYS(NOW())-TO_DAYS(date_col)<=30;
DAYOFWEEK(date)返回日期
date的星期索引(
1=星期天,
2=星期一,……
7=星期六)。这些索引值对应于ODBC标准。
mysql>selectDAYOFWEEK('1998-02-03');
->3
WEEKDAY(date)返回
date的星期索引(
0=星期一,
1=星期二,……
6=星期天)。
mysql>selectWEEKDAY('1997-10-0422:23:00');
->5
mysql>selectWEEKDAY('1997-11-05');
->2
DAYOFMONTH(date)返回
date的月份中日期,在
1到
31范围内。
mysql>selectDAYOFMONTH('1998-02-03');
->3
DAYOFYEAR(date)返回
date在一年中的日数,在
1到
366范围内。
mysql>selectDAYOFYEAR('1998-02-03');
->34
MONTH(date)返回
date的月份,范围
1到
12。
mysql>selectMONTH('1998-02-03');
->2
DAYNAME(date)返回
date的星期名字。
mysql>selectDAYNAME("1998-02-05");
->'Thursday'
MONTHNAME(date)返回
date的月份名字。
mysql>selectMONTHNAME("1998-02-05");
->'February'
QUARTER(date)返回
date一年中的季度,范围
1到
4。
mysql>selectQUARTER('98-04-01');
->2
WEEK(date)
WEEK(date,first)对于星期天是一周的第一天的地方,有一个单个参数,返回
date的周数,范围在
0到
52。2个参数形式
WEEK()允许你指定星期是否开始于星期天或星期一。如果第二个参数是
0,星期从星期天开始,如果第二个参数是
1,从星期一开始。
mysql>selectWEEK('1998-02-20');
->7
mysql>selectWEEK('1998-02-20',0);
->7
mysql>selectWEEK('1998-02-20',1);
->8
YEAR(date)返回
date的年份,范围在
1000到
9999。
mysql>selectYEAR('98-02-03');
->1998
HOUR(time)返回
time的小时,范围是
0到
23。
mysql>selectHOUR('10:05:03');
->10
MINUTE(time)返回
time的分钟,范围是
0到
59。
mysql>selectMINUTE('98-02-0310:05:03');
->5
SECOND(time)回来
time的秒数,范围是
0到
59。
mysql>selectSECOND('10:05:03');
->3
PERIOD_ADD(P,N)增加
N个月到阶段
P(以格式
YYMM或
YYYYMM)。以格式
YYYYMM返回值。注意阶段参数
P不是日期值。
mysql>selectPERIOD_ADD(9801,2);
->199803
PERIOD_DIFF(P1,P2)返回在时期
P1和
P2之间月数,
P1和
P2应该以格式
YYMM或
YYYYMM。注意,时期参数
P1和
P2不是日期值。
mysql>selectPERIOD_DIFF(9802,199703);
->11
DATE_ADD(date,INTERVALexprtype)
DATE_SUB(date,INTERVALexprtype)
ADDDATE(date,INTERVALexprtype)
SUBDATE(date,INTERVALexprtype)这些功能执行日期运算。对于MySQL3.22,他们是新的。
ADDDATE()和
SUBDATE()是
DATE_ADD()和
DATE_SUB()的同义词。在MySQL3.23中,你可以使用
+和
-而不是
DATE_ADD()和
DATE_SUB()。(见例子)
date是一个指定开始日期的
DATETIME或
DATE值,
expr是指定加到开始日期或从开始日期减去的间隔值一个表达式,
expr是一个字符串;它可以以一个“-”开始表示负间隔。
type是一个关键词,指明表达式应该如何被解释。
EXTRACT(type函数从日期中返回“type”间隔。下表显示了
FROMdate)
type和
expr参数怎样被关联:
type值 | 含义 | 期望的expr格式 |
SECOND | 秒 | SECONDS |
MINUTE | 分钟 | MINUTES |
HOUR | 时间 | HOURS |
DAY | 天 | DAYS |
MONTH | 月 | MONTHS |
YEAR | 年 | YEARS |
MINUTE_SECOND | 分钟和秒 | "MINUTES:SECONDS" |
HOUR_MINUTE | 小时和分钟 | "HOURS:MINUTES" |
DAY_HOUR | 天和小时 | "DAYSHOURS" |
YEAR_MONTH | 年和月 | "YEARS-MONTHS" |
HOUR_SECOND | 小时,分钟, | "HOURS:MINUTES:SECONDS" |
DAY_MINUTE | 天,小时,分钟 | "DAYSHOURS:MINUTES" |
DAY_SECOND | 天,小时,分钟,秒 | "DAYSHOURS:MINUTES:SECONDS" |
expr格式中允许任何标点分隔符。表示显示的是建议的分隔符。如果
date参数是一个
DATE值并且你的计算仅仅包含
YEAR、
MONTH和
DAY部分(即,没有时间部分),结果是一个
DATE值。否则结果是一个
DATETIME值。
mysql>SELECT"1997-12-3123:59:59"+INTERVAL1SECOND;
->1998-01-0100:00:00
mysql>SELECTINTERVAL1DAY+"1997-12-31";
->1998-01-01
mysql>SELECT"1998-01-01"-INTERVAL1SECOND;
->1997-12-3123:59:59
mysql>SELECTDATE_ADD("1997-12-3123:59:59",
INTERVAL1SECOND);
->1998-01-0100:00:00
mysql>SELECTDATE_ADD("1997-12-3123:59:59",
INTERVAL1DAY);
->1998-01-0123:59:59
mysql>SELECTDATE_ADD("1997-12-3123:59:59",
INTERVAL"1:1"MINUTE_SECOND);
->1998-01-0100:01:00
mysql>SELECTDATE_SUB("1998-01-0100:00:00",
INTERVAL"11:1:1"DAY_SECOND);
->1997-12-3022:58:59
mysql>SELECTDATE_ADD("1998-01-0100:00:00",
INTERVAL"-110"DAY_HOUR);
->1997-12-3014:00:00
mysql>SELECTDATE_SUB("1998-01-02",INTERVAL31DAY);
->1997-12-02
mysql>SELECTEXTRACT(YEARFROM"1999-07-02");
->1999
mysql>SELECTEXTRACT(YEAR_MONTHFROM"1999-07-0201:02:03");
->199907
mysql>SELECTEXTRACT(DAY_MINUTEFROM"1999-07-0201:02:03");
->20102
如果你指定太短的间隔值(不包括
type关键词期望的间隔部分),MySQL假设你省掉了间隔值的最左面部分。例如,如果你指定一个
type是
DAY_SECOND,值
expr被希望有天、小时、分钟和秒部分。如果你象
"1:10"这样指定值,MySQL假设日子和小时部分是丢失的并且值代表分钟和秒。换句话说,
"1:10" DAY_SECOND以它等价于
"1:10"MINUTE_SECOND的方式解释,这对那MySQL解释
TIME值表示经过的时间而非作为一天的时间的方式有二义性。如果你使用确实不正确的日期,结果是
NULL。如果你增加
MONTH、
YEAR_MONTH或
YEAR并且结果日期大于新月份的最大值天数,日子在新月用最大的天调整。
mysql>selectDATE_ADD('1998-01-30',Interval1month);
->1998-02-28
注意,从前面的例子中词[code]INTERVAL和
type关键词不是区分大小写的。[/code]
TO_DAYS(date)给出一个日期
date,返回一个天数(从0年的天数)。
mysql>selectTO_DAYS(950501);
->728779
mysql>selectTO_DAYS('1997-10-07');
->729669
TO_DAYS()不打算用于使用格列高里历(1582)出现前的值。
FROM_DAYS(N)给出一个天数
N,返回一个
DATE值。
mysql>selectFROM_DAYS(729669);
->'1997-10-07'
TO_DAYS()不打算用于使用格列高里历(1582)出现前的值。
DATE_FORMAT(date,format)根据
format字符串格式化
date值。下列修饰符可以被用在
format字符串中:
%M | 月名字(January…… December) |
%W | 星期名字(Sunday…… Saturday) |
%D | 有英语前缀的月份的日期(1st, 2nd, 3rd,等等。) |
%Y | 年,数字,4位 |
%y | 年,数字,2位 |
%a | 缩写的星期名字(Sun…… Sat) |
%d | 月份中的天数,数字(00…… 31) |
%e | 月份中的天数,数字(0…… 31) |
%m | 月,数字(01…… 12) |
%c | 月,数字(1…… 12) |
%b | 缩写的月份名字(Jan…… Dec) |
%j | 一年中的天数(001…… 366) |
%H | 小时(00…… 23) |
%k | 小时(0…… 23) |
%h | 小时(01…… 12) |
%I | 小时(01…… 12) |
%l | 小时(1…… 12) |
%i | 分钟,数字(00…… 59) |
%r | 时间,12小时(hh:mm:ss[AP]M) |
%T | 时间,24小时(hh:mm:ss) |
%S | 秒(00…… 59) |
%s | 秒(00…… 59) |
%p | AM或 PM |
%w | 一个星期中的天数(0=Sunday…… 6=Saturday) |
%U | 星期(0…… 52),这里星期天是星期的第一天 |
%u | 星期(0…… 52),这里星期一是星期的第一天 |
%% | 一个文字“%”。 |
mysql>selectDATE_FORMAT('1997-10-0422:23:00','%W%M%Y');
->'SaturdayOctober1997'
mysql>selectDATE_FORMAT('1997-10-0422:23:00','%H:%i:%s');
->'22:23:00'
mysql>selectDATE_FORMAT('1997-10-0422:23:00',
'%D%y%a%d%m%b%j');
->'4th97Sat0410Oct277'
mysql>selectDATE_FORMAT('1997-10-0422:23:00',
'%H%k%I%r%T%S%w');
->'22221010:23:00PM22:23:00006'
MySQL3.23中,在格式修饰符字符前需要
%。在MySQL更早的版本中,
%是可选的。
TIME_FORMAT(time,format)这象上面的
DATE_FORMAT()函数一样使用,但是
format字符串只能包含处理小时、分钟和秒的那些格式修饰符。其他修饰符产生一个
NULL值或
0。
CURDATE()
CURRENT_DATE以
'YYYY-MM-DD'或
YYYYMMDD格式返回今天日期值,取决于函数是在一个字符串还是数字上下文被使用。
mysql>selectCURDATE();
->'1997-12-15'
mysql>selectCURDATE()+0;
->19971215
CURTIME()
CURRENT_TIME以
'HH:MM:SS'或
HHMMSS格式返回当前时间值,取决于函数是在一个字符串还是在数字的上下文被使用。
mysql>selectCURTIME();
->'23:50:26'
mysql>selectCURTIME()+0;
->235026
NOW()
SYSDATE()
CURRENT_TIMESTAMP以
'YYYY-MM-DDHH:MM:SS'或
YYYYMMDDHHMMSS格式返回当前的日期和时间,取决于函数是在一个字符串还是在数字的上下文被使用。
mysql>selectNOW();
->'1997-12-1523:50:26'
mysql>selectNOW()+0;
->19971215235026
UNIX_TIMESTAMP()
UNIX_TIMESTAMP(date)如果没有参数调用,返回一个Unix时间戳记(从
'1970-01-0100:00:00'GMT开始的秒数)。如果
UNIX_TIMESTAMP()用一个
date参数被调用,它返回从
'1970-01-0100:00:00'GMT开始的秒数值。
date可以是一个
DATE字符串、一个
DATETIME字符串、一个
TIMESTAMP或以
YYMMDD或
YYYYMMDD格式的本地时间的一个数字。
mysql>selectUNIX_TIMESTAMP();
->882226357
mysql>selectUNIX_TIMESTAMP('1997-10-0422:23:00');
->875996580
当
UNIX_TIMESTAMP被用于一个
TIMESTAMP列,函数将直接接受值,没有隐含的“string-to-unix-timestamp”变换。
FROM_UNIXTIME(unix_timestamp)以
'YYYY-MM-DDHH:MM:SS'或
YYYYMMDDHHMMSS格式返回
unix_timestamp参数所表示的值,取决于函数是在一个字符串还是或数字上下文中被使用。
mysql>selectFROM_UNIXTIME(875996580);
->'1997-10-0422:23:00'
mysql>selectFROM_UNIXTIME(875996580)+0;
->19971004222300
FROM_UNIXTIME(unix_timestamp,format)返回表示Unix时间标记的一个字符串,根据
format字符串格式化。
format可以包含与
DATE_FORMAT()函数列出的条目同样的修饰符。
mysql>selectFROM_UNIXTIME(UNIX_TIMESTAMP(),
'%Y%D%M%h:%i:%s%x');
->'199723rdDecember03:43:30x'
SEC_TO_TIME(seconds)返回
seconds参数,变换成小时、分钟和秒,值以
'HH:MM:SS'或
HHMMSS格式化,取决于函数是在一个字符串还是在数字上下文中被使用。
mysql>selectSEC_TO_TIME(2378);
->'00:39:38'
mysql>selectSEC_TO_TIME(2378)+0;
->3938
TIME_TO_SEC(time)返回
time参数,转换成秒。
mysql>selectTIME_TO_SEC('22:23:00');
->80580
mysql>selectTIME_TO_SEC('00:39:38');
->2378
其他函数
DATABASE()返回当前的数据库名字。
->'test'
如果没有当前的数据库,
DATABASE()返回空字符串。
USER()
SYSTEM_USER()
SESSION_USER()返回当前MySQL用户名。
mysql>selectUSER();在MySQL3.22.11或以后版本中,这包括用户名和客户主机名。你可以象这样只提取用户名部分(值是否包括主机名部分均可工作):
->'davida@localhost'
mysql>selectsubstring_index(USER(),"@",1);
->'davida'
PASSWORD(str)从纯文本口令
str计算一个口令字符串。该函数被用于为了在
user授权表的
Password列中存储口令而加密MySQL口令。
mysql>selectPASSWORD('badpwd');
->'7f84554057dd964b'
PASSWORD()加密是非可逆的。
PASSWORD()不以与Unix口令加密的相同的方法执行口令加密。你不应该假定如果你的Unix口令和你的MySQL口令是一样的,
PASSWORD()将导致与在Unix口令文件存储的相同的加密值。见
ENCRYPT()。
ENCRYPT(str[,salt])使用Unix
crypt()系统调用加密
str。
salt参数应该是一个有2个字符的字符串。(MySQL3.22.16中,
salt可以长于2个字符。)
mysql>selectENCRYPT("hello");如果
->'VxuFAJXVARROc'
crypt()在你的系统上不可用,
ENCRYPT()总是返回
NULL。
ENCRYPT()只保留
str起始8个字符而忽略所有其他,至少在某些系统上是这样。这将由底层的
crypt()系统调用的行为决定。
ENCODE(str,pass_str)使用
pass_str作为口令加密
str。为了解密结果,使用
DECODE()。结果是一个二进制字符串,如果你想要在列中保存它,使用一个
BLOB列类型。
DECODE(crypt_str,pass_str)使用
pass_str作为口令解密加密的字符串
crypt_str。
crypt_str应该是一个由
ENCODE()返回的字符串。
MD5(string)对字符串计算MD5校验和。值作为一个32长的十六进制数字被返回可以,例如用作哈希(hash)键。
mysql>selectMD5("testing")这是一个“RSA数据安全公司的MD5消息摘要算法”。
->'ae2b1fca515949e5d54fb22b8ed95575'
LAST_INSERT_ID([expr])返回被插入一个
AUTO_INCREMENT列的最后一个自动产生的值。见20.4.29
mysql_insert_id()。
mysql>selectLAST_INSERT_ID();产生的最后ID以每个连接为基础在服务器被维护,它不会被其他客户改变。如果你更新另外一个有非魔术值(即,不是
->195
NULL和不是
0的一个值)的
AUTO_INCREMENT列,它甚至不会被改变。如果
expr作为一个参数在一个
UPDATE子句的
LAST_INSERT_ID()里面给出,那么参数值作为一个
LAST_INSERT_ID()值被返回。这可以用来模仿顺序:首先创建表:
mysql>createtablesequence(idintnotnull);然后表能被用来产生顺序号,象这样:
mysql>insertintosequencevalues(0);
mysql>updatesequencesetid=LAST_INSERT_ID(id+1);你可以不调用
LAST_INSERT_ID()而产生顺序,但是这样使用函数的实用程序在服务器上自动维护ID值作为最后自动产生的值。你可以检索新的ID值,就像你能读入正常MySQL中的任何正常的
AUTO_INCREMENT值一样。例如,
LAST_INSERT_ID()(没有一个参数)将返回新ID。CAPI函数
mysql_insert_id()也可被用来得到值。
FORMAT(X,D)格式化数字
X为类似于格式
'#,###,###.##',四舍五入到
D为小数。如果
D为
0,结果将没有小数点和小数部分。
mysql>selectFORMAT(12332.123456,4);
->'12,332.1235'
mysql>selectFORMAT(12332.1,4);
->'12,332.1000'
mysql>selectFORMAT(12332.2,0);
->'12,332'
VERSION()返回表明MySQL服务器版本的一个字符串。
mysql>selectVERSION();
->'3.22.19b-log'
GET_LOCK(str,timeout)试图获得由字符串
str给定的一个名字的锁定,第二个
timeout为超时。如果锁定成功获得,返回
1,如果尝试超时了,返回
0,或如果发生一个错误,返回
NULL(例如从存储器溢出或线程用
mysqladminkill被杀死)。当你执行
RELEASE_LOCK()时、执行一个新的
GET_LOCK()或线程终止时,一个锁定被释放。该函数可以用来实现应用锁或模拟记录锁,它阻止其他客户用同样名字的锁定请求;赞成一个给定的锁定字符串名字的客户可以使用字符串执行子协作建议的锁定。
mysql>selectGET_LOCK("lock1",10);注意,第二个
->1
mysql>selectGET_LOCK("lock2",10);
->1
mysql>selectRELEASE_LOCK("lock2");
->1
mysql>selectRELEASE_LOCK("lock1");
->NULL
RELEASE_LOCK()调用返回
NULL,因为锁
"lock1"自动地被第二个
GET_LOCK()调用释放。
RELEASE_LOCK(str)释放字符串
str命名的通过
GET_LOCK()获得的锁。如果锁被释放,返回
1,如果锁没被这个线程锁定(在此情况下锁没被释放)返回
0,并且如果命名的锁不存在,返回
NULL。如果锁从来没有通过调用
GET_LOCK()获得或如果它已经被释放了,锁将不存在。
BENCHMARK(count,expr)
BENCHMARK()函数重复
countTimes次执行表达式
expr,它可以用于计时MySQL处理表达式有多快。结果值总是
0。意欲用于
mysql客户,它报告查询的执行时间。
mysql>selectBENCHMARK(1000000,encode("hello","goodbye"));报告的时间是客户端的经过时间,不是在服务器端的CPU时间。执行
+----------------------------------------------+
|BENCHMARK(1000000,encode("hello","goodbye"))|
+----------------------------------------------+
|0|
+----------------------------------------------+
1rowinset(4.74sec)
BENCHMARK()若干次可能是明智的,并且注意服务器机器的负载有多重来解释结果。
与GROUPBY
子句一起使用的函数
如果你在不包含GROUPBY子句的一个语句中使用聚合函数,它等价于聚合所有行。
COUNT(expr)返回由一个
SELECT语句检索出来的行的非
NULL值的数目。
mysql>selectstudent.student_name,COUNT(*)
fromstudent,course
wherestudent.student_id=course.student_id
GROUPBYstudent_name;
COUNT(*)在它返回的检索出来的行数目上有些不同,不管他们是否包含
NULL值。如果
SELECT从一个表检索,或没有检索出其他列并且没有
WHERE子句,
COUNT(*)被优化以便快速地返回。例如:
mysql>selectCOUNT(*)fromstudent;
COUNT(DISTINCTexpr,[expr...])返回一个不同值的数目。
mysql>selectCOUNT(DISTINCTresults)fromstudent;在MySQL中,你可以通过给出一个表达式列表以得到不同的表达式组合的数目。在ANSISQL中,你可能必须在
CODE(DISTINCT..)内进行所有表达式的连接。
AVG(expr)返回
expr的平均值。
mysql>selectstudent_name,AVG(test_score)
fromstudent
GROUPBYstudent_name;
MIN(expr)
MAX(expr)返回
expr的最小或最大值。
MIN()和
MAX()可以有一个字符串参数;在这种的情况下,他们返回最小或最大的字符串值。
mysql>selectstudent_name,MIN(test_score),MAX(test_score)
fromstudent
GROUPBYstudent_name;
SUM(expr)返回
expr的和。注意,如果返回的集合没有行,它返回NULL!
STD(expr)
STDDEV(expr)返回
expr标准差(deviation)。这是对ANSISQL的扩展。该函数的形式
STDDEV()是提供与Oracle的兼容性。
BIT_OR(expr)返回
expr里所有位的位或。计算用64位(
BIGINT)精度进行。
BIT_AND(expr)返回
expr里所有位的位与。计算用64位(
BIGINT)精度进行。MySQL扩展了
GROUPBY的用法。你可以不出现在的
GROUPBY部分的
SELECT表达式中使用列或计算,这表示这个组的任何可能值。你可以使用它是性能更好,避免在不必要的项目上排序和分组。例如,你在下列查询中不需要在
customer.name上聚合:
mysql>selectorder.custid,customer.name,max(payments)在ANSISQL中,你将必须将
fromorder,customer
whereorder.custid=customer.custid
GROUPBYorder.custid;
customer.name加到
GROUPBY子句。在MySQL中,名字是冗余的。
如果你从
GROUPBY部分省略的列在组中不是唯一的,不要使用这个功能。
在某些情况下,你可以使用
MIN()和
MAX()获得一个特定的列值,即使它不是唯一的。下例给出从包含
sort列中最小值的行的
column值:
substr(MIN(concat(sort,space(6-length(sort)),column),7,length(column)))注意,如果你正在使用MySQL3.22(或更早)或如果你正在试图遵从ANSISQL,你不能在
GROUPBY或
ORDERBY子句中使用表达式。你可以通过使用表达式的一个别名解决此限制:
mysql>SELECTid,FLOOR(value/100)ASvalFROMtbl_name在
GROUPBYid,valORDERBYval;
MySQL3.23中,你可以这样做:
mysql>SELECTid,FLOOR(value/100)FROMtbl_nameORDERBYRAND();[/code]