您好,登錄后才能下訂單哦!
mysql中有哪些常用函數(shù),針對這個問題,這篇文章詳細介紹了相對應(yīng)的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
控制流函數(shù)
IFNULL(expr1,expr2)
如果expr1
不是NULL
,IFNULL()
返回expr1
,否則它返回expr2
。IFNULL()
返回一個數(shù)字或字符串值,取決于它被使用的上下文環(huán)境。
mysql> select IFNULL(1,0); -> 1 mysql> select IFNULL(0,10); -> 0 mysql> select IFNULL(1/0,10); -> 10 mysql> select IFNULL(1/0,'yes'); -> 'yes'
IF(expr1,expr2,expr3)
如果expr1
是TRUE(expr1<>0
且expr1<>NULL
),那么IF()
返回expr2
,否則它返回expr3
。IF()
返回一個數(shù)字或字符串值,取決于它被使用的上下文。
mysql> select IF(1>2,2,3); -> 3 mysql> select IF(1<2,'yes','no'); -> 'yes' mysql> select IF(strcmp('test','test1'),'yes','no'); -> 'no'
expr1
作為整數(shù)值被計算,它意味著如果你正在測試浮點或字符串值,你應(yīng)該使用一個比較操作來做。
mysql> select IF(0.1,1,0); -> 0 mysql> select IF(0.1<>0,1,0); -> 1
在上面的第一種情況中,IF(0.1)
返回0
,因為0.1
被變換到整數(shù)值, 導(dǎo)致測試IF(0)
。這可能不是你期望的。在第二種情況中,比較測試原來的浮點值看它是否是非零,比較的結(jié)果被用作一個整數(shù)。
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
第一個版本返回result
,其中value=compare-value
。第二個版本中如果第一個條件為真,返回result。如果沒有匹配的result值,那么結(jié)果在ELSE
后的result被返回。如果沒有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
數(shù)學(xué)函數(shù)
所有的數(shù)學(xué)函數(shù)在一個出錯的情況下返回NULL
。
-
單目減。改變參數(shù)的符號。
mysql> select - 2;
注意,如果這個操作符與一個BIGINT使用,返回值是一個BIGINT!這意味著你應(yīng)該避免在整數(shù)上使用-,那可能有值-2^63!
ABS(X)
返回X
的絕對值。
mysql> select ABS(2); -> 2 mysql> select ABS(-32); -> 32
該功能可安全用于BIGINT
值。
SIGN(X)
返回參數(shù)的符號,為-1
、0
或1
,取決于X
是否是負數(shù)、零或正數(shù)。
mysql> select SIGN(-32); -> -1 mysql> select SIGN(0); -> 0 mysql> select SIGN(234); -> 1
MOD(N,M)
%
模 (類似C中的%
操作符)。返回N
被M
除的余數(shù)。
mysql> select MOD(234, 10); -> 4 mysql> select 253 % 7; -> 1 mysql> select MOD(29,9); -> 2
這個函數(shù)可安全用于BIGINT值。
FLOOR(X)
返回不大于X
的最大整數(shù)值。
mysql> select FLOOR(1.23); -> 1 mysql> select FLOOR(-1.23); -> -2
注意返回值被變換為一個BIGINT!
CEILING(X)
返回不小于X
的最小整數(shù)值。
mysql> select CEILING(1.23); -> 2 mysql> select CEILING(-1.23); -> -1
注意返回值被變換為一個BIGINT
!
ROUND(X)
返回參數(shù)X
的四舍五入的一個整數(shù)。
mysql> select ROUND(-1.23); -> -1 mysql> select ROUND(-1.58); -> -2 mysql> select ROUND(1.58); -> 2
注意返回值被變換為一個BIGINT
!
ROUND(X,D)
返回參數(shù)X
的四舍五入的有D
為小數(shù)的一個數(shù)字。如果D
為0
,結(jié)果將沒有小數(shù)點或小數(shù)部分。
mysql> select ROUND(1.298, 1); -> 1.3 mysql> select ROUND(1.298, 0); -> 1
注意返回值被變換為一個BIGINT
!
EXP(X)
返回值e
(自然對數(shù)的底)的X
次方。
mysql> select EXP(2); -> 7.389056 mysql> select EXP(-2); -> 0.135335
LOG(X)
返回X
的自然對數(shù)。
mysql> select LOG(2); -> 0.693147 mysql> select LOG(-2); -> NULL
如果你想要一個數(shù)字X
的任意底B
的對數(shù),使用公式LOG(X)/LOG(B)
。
LOG10(X)
返回X
的以10為底的對數(shù)。
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)
返回非負數(shù)X
的平方根。
mysql> select SQRT(4); -> 2.000000 mysql> select SQRT(20); -> 4.472136
PI()
返回PI的值(圓周率)。
mysql> select PI(); -> 3.141593
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
。L
如果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
ATAN2(X,Y)
返回2個變量X
和Y
的反正切。它類似于計算Y/X
的反正切,除了兩個參數(shù)的符號被用來決定結(jié)果的象限。
mysql> select ATAN(-2,2); -> -0.785398 mysql> select ATAN(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èi)的隨機浮點值。如果一個整數(shù)參數(shù)N
被指定,它被用作種子值。
mysql> select RAND(); -> 0.5925 mysql> select RAND(20); -> 0.1811 mysql> select RAND(20); -> 0.1811 mysql> select RAND(); -> 0.2079 mysql> select RAND(); -> 0.7888
你不能在一個ORDER BY
子句用RAND()
值使用列,因為ORDER BY
將重復(fù)計算列多次。然而在MySQL3.23中,你可以做:SELECT * FROM table_name ORDER BY RAND()
,這是有利于得到一個來自SELECT * FROM table1,table2 WHERE a=b AND c<d ORDER BY RAND() LIMIT 1000
的集合的隨機樣本。注意在一個WHERE
子句里的一個RAND()
將在每次WHERE
被執(zhí)行時重新評估。
LEAST(X,Y,...)
有2和2個以上的參數(shù),返回最小(最小值)的參數(shù)。參數(shù)使用下列規(guī)則進行比較:
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
。
如果返回值被使用在一個INTEGER
上下文,或所有的參數(shù)都是整數(shù)值,他們作為整數(shù)比較。
如果返回值被使用在一個REAL
上下文,或所有的參數(shù)是實數(shù)值,他們作為實數(shù)比較。
如果任何參數(shù)是一個大小敏感的字符串,參數(shù)作為大小寫敏感的字符串被比較。
在其他的情況下,參數(shù)作為大小寫無關(guān)的字符串被比較。
GREATEST(X,Y,...)
返回最大(最大值)的參數(shù)。參數(shù)使用與LEAST
一樣的規(guī)則進行比較。
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)
返回參數(shù)X
,從弧度變換為角度。
mysql> select DEGREES(PI()); -> 180.000000
RADIANS(X)
返回參數(shù)X
,從角度變換為弧度。
mysql> select RADIANS(90); -> 1.570796
TRUNCATE(X,D)
返回數(shù)字X
,截斷為D
位小數(shù)。如果D
為0
,結(jié)果將沒有小數(shù)點或小數(shù)部分。
mysql> select TRUNCATE(1.223,1); -> 1.2 mysql> select TRUNCATE(1.999,1); -> 1.9 mysql> select TRUNCATE(1.999,0); -> 1
字符串函數(shù)
對于針對字符串位置的操作,第一個位置被標記為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()函數(shù)。
ORD(str)
如果字符串str最左面字符是一個多字節(jié)字符,通過以格式((first byte ASCII code)*256+(second byte ASCII code))[*256+third byte ASCII code...]
返回字符的ASCII代碼值來返回多字節(jié)字符代碼。如果最左面的字符不是一個多字節(jié)字符。返回與ASCII()
函數(shù)返回的相同值。
mysql> select ORD('2'); -> 50
CONV(N,from_base,to_base)
在不同的數(shù)字基之間變換數(shù)字。返回數(shù)字N
的字符串數(shù)字,從from_base
基變換為to_base
基,如果任何參數(shù)是NULL
,返回NULL
。參數(shù)N
解釋為一個整數(shù),但是可以指定為一個整數(shù)或一個字符串。最小基是2
且最大的基是36
。如果to_base
是一個負數(shù),N
被認為是一個有符號數(shù),否則,N
被當作無符號數(shù)。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
是一個長整數(shù)(BIGINT
)數(shù)字,這等價于CONV(N,10,2)
。如果N
是NULL
,返回NULL
。
mysql> select BIN(12); -> '1100'
OCT(N)
返回八進制值N
的一個字符串的表示,在此N
是一個長整型數(shù)字,這等價于CONV(N,10,8)
。如果N
是NULL,返回NULL
。
mysql> select OCT(12); -> '14'
HEX(N)
返回十六進制值N
一個字符串的表示,在此N
是一個長整型(BIGINT
)數(shù)字,這等價于CONV(N,10,16)
。如果N
是NULL
,返回NULL
。
mysql> select HEX(255); -> 'FF'
CHAR(N,...)
CHAR()
將參數(shù)解釋為整數(shù)并且返回由這些整數(shù)的ASCII代碼字符組成的一個字符串。NULL
值被跳過。
mysql> select CHAR(77,121,83,81,'76'); -> 'MySQL' mysql> select CHAR(77,77.3,'77.3'); -> 'MMM'
CONCAT(str1,str2,...)
返回來自于參數(shù)連結(jié)的字符串。如果任何參數(shù)是NULL
,返回NULL
。可以有超過2個的參數(shù)。一個數(shù)字參數(shù)被變換為等價的字符串形式。
mysql> select CONCAT('My', 'S', 'QL'); -> 'MySQL' mysql> select CONCAT('My', NULL, 'QL'); -> NULL mysql> select CONCAT(14.3); -> '14.3'
LENGTH(str)
OCTET_LENGTH(str)
CHAR_LENGTH(str)
CHARACTER_LENGTH(str)
返回字符串str
的長度。
mysql> select LENGTH('text'); -> 4 mysql> select OCTET_LENGTH('text'); -> 4
注意,對于多字節(jié)字符,其CHAR_LENGTH()僅計算一次。
LOCATE(substr,str)
POSITION(substr IN str)
返回子串substr
在字符串str
第一個出現(xiàn)的位置,如果substr
不是在str
里面,返回0
.
mysql> select LOCATE('bar', 'foobarbar'); -> 4 mysql> select LOCATE('xbar', 'foobar'); -> 0
該函數(shù)是多字節(jié)可靠的。
LOCATE(substr,str,pos)
返回子串substr
在字符串str
第一個出現(xiàn)的位置,從位置pos
開始。如果substr
不是在str
里面,返回0
。
mysql> select LOCATE('bar', 'foobarbar',5); -> 7
這函數(shù)是多字節(jié)可靠的。
INSTR(str,substr)
返回子串substr
在字符串str
中的第一個出現(xiàn)的位置。這與有2個參數(shù)形式的LOCATE()
相同,除了參數(shù)被顛倒。
mysql> select INSTR('foobarbar', 'bar'); -> 4 mysql> select INSTR('xbar', 'foobar'); -> 0
這函數(shù)是多字節(jié)可靠的。
LPAD(str,len,padstr)
返回字符串str
,左面用字符串padstr
填補直到str
是len
個字符長。
mysql> select LPAD('hi',4,'??'); -> '??hi'
RPAD(str,len,padstr)
返回字符串str
,右面用字符串padstr
填補直到str
是len
個字符長。
mysql> select RPAD('hi',5,'?'); -> 'hi???'
LEFT(str,len)
返回字符串str
的最左面len
個字符。
mysql> select LEFT('foobarbar', 5); -> 'fooba'
該函數(shù)是多字節(jié)可靠的。
RIGHT(str,len)
返回字符串str
的最右面len
個字符。
mysql> select RIGHT('foobarbar', 4); -> 'rbar'
該函數(shù)是多字節(jié)可靠的。
SUBSTRING(str,pos,len)
SUBSTRING(str FROM pos FOR len)
MID(str,pos,len)
從字符串str
返回一個len
個字符的子串,從位置pos
開始。使用FROM
的變種形式是ANSI SQL92語法。
mysql> select SUBSTRING('Quadratically',5,6); -> 'ratica'
該函數(shù)是多字節(jié)可靠的。
SUBSTRING(str,pos)
SUBSTRING(str FROM pos)
從字符串str
的起始位置pos
返回一個子串。
mysql> select SUBSTRING('Quadratically',5); -> 'ratically' mysql> select SUBSTRING('foobarbar' FROM 4); -> 'barbar'
該函數(shù)是多字節(jié)可靠的。
SUBSTRING_INDEX(str,delim,count)
返回從字符串str
的第count
個出現(xiàn)的
分隔符delim
之后的子串。如果count
是正數(shù),返回最后的分隔符到左邊(從左邊數(shù)) 的所有字符。如果count
是負數(shù),返回最后的分隔符到右邊的所有字符(從右邊數(shù))。
mysql> select SUBSTRING_INDEX('www.mysql.com', '.', 2); -> 'www.mysql' mysql> select SUBSTRING_INDEX('www.mysql.com', '.', -2); -> 'mysql.com'
該函數(shù)對多字節(jié)是可靠的。
LTRIM(str)
返回刪除了其前置空格字符的字符串str
。
mysql> select LTRIM(' barbar'); -> 'barbar'
RTRIM(str)
返回刪除了其拖后空格字符的字符串str
。
mysql> select RTRIM('barbar '); -> 'barbar'
該函數(shù)對多字節(jié)是可靠的。
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'
該函數(shù)對多字節(jié)是可靠的。
SOUNDEX(str)
返回str
的一個同音字符串。聽起來“大致相同”的2個字符串應(yīng)該有相同的同音字符串。一個“標準”的同音字符串長是4個字符,但是SOUNDEX()
函數(shù)返回一個任意長的字符串。你可以在結(jié)果上使用SUBSTRING()
得到一個“標準”的 同音串。所有非數(shù)字字母字符在給定的字符串中被忽略。所有在A-Z之外的字符國際字母被當作元音。
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
的所有出現(xiàn)由字符串to_str
代替。
mysql> select REPLACE('www.mysql.com', 'w', 'Ww'); -> 'WwWwWw.mysql.com'
該函數(shù)對多字節(jié)是可靠的。
REPEAT(str,count)
返回由重復(fù)count
Times次的字符串str
組成的一個字符串。如果count <= 0
,返回一個空字符串。如果str
或count
是NULL
,返回NULL
。
mysql> select REPEAT('MySQL', 3); -> 'MySQLMySQLMySQL'
REVERSE(str)
返回顛倒字符順序的字符串str
。
mysql> select REVERSE('abc'); -> 'cba'
該函數(shù)對多字節(jié)可靠的。
INSERT(str,pos,len,newstr)
返回字符串str
,在位置pos
起始的子串且len
個字符長得子串由字符串newstr
代替。
mysql> select INSERT('Quadratic', 3, 4, 'What'); -> 'QuWhattic'
該函數(shù)對多字節(jié)是可靠的。
ELT(N,str1,str2,str3,...)
如果N
= 1
,返回str1
,如果N
=
,返回
2str2
,等等。如果N
小于1
或大于參數(shù)個數(shù),返回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)
如果字符串str
在由N
子串組成的表strlist
之中,返回一個1
到N
的值。一個字符串表是被“,”分隔的子串組成的一個字符串。如果第一個參數(shù)是一個常數(shù)字符串并且第二個參數(shù)是一種類型為SET
的列,FIND_IN_SET()
函數(shù)被優(yōu)化而使用位運算!如果str
不是在strlist
里面或如果strlist
是空字符串,返回0
。如果任何一個參數(shù)是NULL
,返回NULL
。如果第一個參數(shù)包含一個“,”,該函數(shù)將工作不正常。
mysql> SELECT FIND_IN_SET('b','a,b,c,d'); -> 2
MAKE_SET(bits,str1,str2,...)
返回一個集合 (包含由“,”字符分隔的子串組成的一個字符串),由相應(yīng)的位在bits
集合中的的字符串組成。str1
對應(yīng)于位0,str2
對應(yīng)位1,等等。在str1
,str2
, ...
中的NULL
串不添加到結(jié)果中。
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”中設(shè)定每一位,你得到一個“on”字符串,并且對于每個復(fù)位(reset)的位,你得到一個“off”字符串。每個字符串用“separator”分隔(缺省“,”),并且只有“bits”的“number_of_bits” (缺省64)位被使用。
mysql> select EXPORT_SET(5,'Y','N',',',4) -> Y,N,Y,N
LCASE(str)
LOWER(str)
返回字符串str
,根據(jù)當前字符集映射(缺省是ISO-8859-1 Latin1)把所有的字符改變成小寫。該函數(shù)對多字節(jié)是可靠的。
mysql> select LCASE('QUADRATICALLY'); -> 'quadratically'
UCASE(str)
UPPER(str)
返回字符串str
,根據(jù)當前字符集映射(缺省是ISO-8859-1 Latin1)把所有的字符改變成大寫。該函數(shù)對多字節(jié)是可靠的。
mysql> select UCASE('Hej'); -> 'HEJ'
該函數(shù)對多字節(jié)是可靠的。
LOAD_FILE(file_name)
讀入文件并且作為一個字符串返回文件內(nèi)容。文件必須在服務(wù)器上,你必須指定到文件的完整路徑名,而且你必須有file權(quán)限。文件必須所有內(nèi)容都是可讀的并且小于max_allowed_packet
。如果文件不存在或由于上面原因之一不能被讀出,函數(shù)返回NULL
。
mysql> UPDATE table_name SET blob_column=LOAD_FILE("/tmp/picture") WHERE id=1;
MySQL必要時自動變換數(shù)字為字符串,并且反過來也如此:
mysql> SELECT 1+"1"; -> 2 mysql> SELECT CONCAT(2,' test'); -> '2 test'
如果你想要明確地變換一個數(shù)字到一個字符串,把它作為參數(shù)傳遞到CONCAT()。
如果字符串函數(shù)提供一個二進制字符串作為參數(shù),結(jié)果字符串也是一個二進制字符串。被變換到一個字符串的數(shù)字被當作是一個二進制字符串。這僅影響比較。
日期和時間函數(shù)
對于每個類型擁有的值范圍以及并且指定日期何時間值的有效格式的描述見7.3.6 日期和時間類型。
這里是一個使用日期函數(shù)的例子。下面的查詢選擇了所有記錄,其date_col的值是在最后30天以內(nèi):
mysql> SELECT something FROM table WHERE TO_DAYS(NOW()) - TO_DAYS(date_col) <= 30;
DAYOFWEEK(date)
返回日期date
的星期索引(1
=星期天,2
=星期一, ……7
=星期六)。這些索引值對應(yīng)于ODBC標準。
mysql> select DAYOFWEEK('1998-02-03'); -> 3
WEEKDAY(date)
返回date
的星期索引(0
=星期一,1
=星期二, ……6
= 星期天)。
mysql> select WEEKDAY('1997-10-04 22:23:00'); -> 5 mysql> select WEEKDAY('1997-11-05'); -> 2
DAYOFMONTH(date)
返回date
的月份中日期,在1
到31
范圍內(nèi)。
mysql> select DAYOFMONTH('1998-02-03'); -> 3
DAYOFYEAR(date)
返回date
在一年中的日數(shù), 在1
到366
范圍內(nèi)。
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)
對于星期天是一周的第一天的地方,有一個單個參數(shù),返回date
的周數(shù),范圍在0
到52
。2個參數(shù)形式WEEK()
允許你指定星期是否開始于星期天或星期一。如果第二個參數(shù)是0
,星期從星期天開始,如果第二個參數(shù)是1
,從星期一開始。
mysql> select WEEK('1998-02-20'); -> 7 mysql> select WEEK('1998-02-20',0); -> 7 mysql> select WEEK('1998-02-20',1); -> 8
YEAR(date)
返回date
的年份,范圍在1000
到9999
。
mysql> select YEAR('98-02-03'); -> 1998
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
的秒數(shù),范圍是0
到59
。
mysql> select SECOND('10:05:03'); -> 3
PERIOD_ADD(P,N)
增加N
個月到階段P
(以格式YYMM
或YYYYMM
)。以格式YYYYMM
返回值。注意階段參數(shù)P
不是日期值。
mysql> select PERIOD_ADD(9801,2); -> 199803
PERIOD_DIFF(P1,P2)
返回在時期P1
和P2
之間月數(shù),P1
和P2
應(yīng)該以格式YYMM
或YYYYMM
。注意,時期參數(shù)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)
這些功能執(zhí)行日期運算。對于MySQL 3.22,他們是新的。ADDDATE()
和SUBDATE()
是DATE_ADD()
和DATE_SUB()
的同義詞。在MySQL 3.23中,你可以使用+
和-
而不是DATE_ADD()
和DATE_SUB()
。(見例子)date
是一個指定開始日期的DATETIME
或DATE
值,expr
是指定加到開始日期或從開始日期減去的間隔值一個表達式,expr
是一個字符串;它可以以一個“-”開始表示負間隔。type
是一個關(guān)鍵詞,指明表達式應(yīng)該如何被解釋。EXTRACT(type
函數(shù)從日期中返回“type”間隔。下表顯示了
FROM date)type
和expr
參數(shù)怎樣被關(guān)聯(lián):
type 值 | 含義 | 期望的expr 格式 |
SECOND | 秒 | SECONDS |
MINUTE | 分鐘 | MINUTES |
HOUR | 時間 | HOURS |
DAY | 天 | DAYS |
MONTH | 月 | MONTHS |
YEAR | 年 | YEARS |
MINUTE_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" |
MySQL在expr
格式中允許任何標點分隔符。表示顯示的是建議的分隔符。如果date
參數(shù)是一個DATE
值并且你的計算僅僅包含YEAR
、MONTH
和DAY
部分(即,沒有時間部分),結(jié)果是一個DATE
值。否則結(jié)果是一個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 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"); -> 20102
如果你指定太短的間隔值(不包括type
關(guān)鍵詞期望的間隔部分),MySQL假設(shè)你省掉了間隔值的最左面部分。例如,如果你指定一個type
是DAY_SECOND
,值expr
被希望有天、小時、分鐘和秒部分。如果你象"1:10"
這樣指定值,MySQL假設(shè)日子和小時部分是丟失的并且值代表分鐘和秒。換句話說,"1:10"
以它等價于
DAY_SECOND"1:10" MINUTE_SECOND
的方式解釋,這對那MySQL解釋TIME
值表示經(jīng)過的時間而非作為一天的時間的方式有二義性。如果你使用確實不正確的日期,結(jié)果是NULL
。如果你增加MONTH
、YEAR_MONTH
或YEAR
并且結(jié)果日期大于新月份的最大值天數(shù),日子在新月用最大的天調(diào)整。
mysql> select DATE_ADD('1998-01-30', Interval 1 month); -> 1998-02-28
注意,從前面的例子中詞INTERVAL和type關(guān)鍵詞不是區(qū)分大小寫的。
TO_DAYS(date)
給出一個日期date
,返回一個天數(shù)(從0年的天數(shù))。
mysql> select TO_DAYS(950501); -> 728779 mysql> select TO_DAYS('1997-10-07'); -> 729669
TO_DAYS()
不打算用于使用格列高里歷(1582)出現(xiàn)前的值。
FROM_DAYS(N)
給出一個天數(shù)N
,返回一個DATE
值。
mysql> select FROM_DAYS(729669); -> '1997-10-07'
TO_DAYS()
不打算用于使用格列高里歷(1582)出現(xiàn)前的值。
DATE_FORMAT(date,format)
根據(jù)format
字符串格式化date
值。下列修飾符可以被用在format
字符串中:
%M | 月名字(January ……December ) |
%W | 星期名字(Sunday ……Saturday ) |
%D | 有英語前綴的月份的日期(1st , 2nd , 3rd , 等等。) |
%Y | 年, 數(shù)字, 4 位 |
%y | 年, 數(shù)字, 2 位 |
%a | 縮寫的星期名字(Sun ……Sat ) |
%d | 月份中的天數(shù), 數(shù)字(00 ……31 ) |
%e | 月份中的天數(shù), 數(shù)字(0 ……31 ) |
%m | 月, 數(shù)字(01 ……12 ) |
%c | 月, 數(shù)字(1 ……12 ) |
%b | 縮寫的月份名字(Jan ……Dec ) |
%j | 一年中的天數(shù)(001 ……366 ) |
%H | 小時(00 ……23 ) |
%k | 小時(0 ……23 ) |
%h | 小時(01 ……12 ) |
%I | 小時(01 ……12 ) |
%l | 小時(1 ……12 ) |
%i | 分鐘, 數(shù)字(00 ……59 ) |
%r | 時間,12 小時(hh:mm:ss [AP]M ) |
%T | 時間,24 小時(hh:mm:ss ) |
%S | 秒(00 ……59 ) |
%s | 秒(00 ……59 ) |
%p | AM 或PM |
%w | 一個星期中的天數(shù)(0 =Sunday ……6 =Saturday ) |
%U | 星期(0 ……52 ), 這里星期天是星期的第一天 |
%u | 星期(0 ……52 ), 這里星期一是星期的第一天 |
%% | 一個文字“%”。 |
所有的其他字符不做解釋被復(fù)制到結(jié)果中。
mysql> select DATE_FORMAT('1997-10-04 22:23:00', '%W %M %Y'); -> 'Saturday October 1997' mysql> select DATE_FORMAT('1997-10-04 22:23:00', '%H:%i:%s'); -> '22:23:00' mysql> select DATE_FORMAT('1997-10-04 22:23:00', '%D %y %a %d %m %b %j'); -> '4th 97 Sat 04 10 Oct 277' mysql> select DATE_FORMAT('1997-10-04 22:23:00', '%H %k %I %r %T %S %w'); -> '22 22 10 10:23:00 PM 22:23:00 00 6'
MySQL3.23中,在格式修飾符字符前需要%
。在MySQL更早的版本中,%
是可選的。
TIME_FORMAT(time,format)
這象上面的DATE_FORMAT()
函數(shù)一樣使用,但是format
字符串只能包含處理小時、分鐘和秒的那些格式修飾符。其他修飾符產(chǎn)生一個NULL
值或0
。
CURDATE()
CURRENT_DATE
以'YYYY-MM-DD'
或YYYYMMDD
格式返回今天日期值,取決于函數(shù)是在一個字符串還是數(shù)字上下文被使用。
mysql> select CURDATE(); -> '1997-12-15' mysql> select CURDATE() + 0; -> 19971215
CURTIME()
CURRENT_TIME
以'HH:MM:SS'
或HHMMSS
格式返回當前時間值,取決于函數(shù)是在一個字符串還是在數(shù)字的上下文被使用。
mysql> select CURTIME(); -> '23:50:26' mysql> select CURTIME() + 0; -> 235026
NOW()
SYSDATE()
CURRENT_TIMESTAMP
以'YYYY-MM-DD HH:MM:SS'
或YYYYMMDDHHMMSS
格式返回當前的日期和時間,取決于函數(shù)是在一個字符串還是在數(shù)字的上下文被使用。
mysql> select NOW(); -> '1997-12-15 23:50:26' mysql> select NOW() + 0; -> 19971215235026
UNIX_TIMESTAMP()
UNIX_TIMESTAMP(date)
如果沒有參數(shù)調(diào)用,返回一個Unix時間戳記(從'1970-01-01 00:00:00'
GMT開始的秒數(shù))。如果UNIX_TIMESTAMP()
用一個date
參數(shù)被調(diào)用,它返回從'1970-01-01 00:00:00'
GMT開始的秒數(shù)值。date
可以是一個DATE
字符串、一個DATETIME
字符串、一個TIMESTAMP
或以YYMMDD
或YYYYMMDD
格式的本地時間的一個數(shù)字。
mysql> select UNIX_TIMESTAMP(); -> 882226357 mysql> select UNIX_TIMESTAMP('1997-10-04 22:23:00'); -> 875996580
當UNIX_TIMESTAMP
被用于一個TIMESTAMP
列,函數(shù)將直接接受值,沒有隱含的“string-to-unix-timestamp”變換。
FROM_UNIXTIME(unix_timestamp)
以'YYYY-MM-DD HH:MM:SS'
或YYYYMMDDHHMMSS
格式返回unix_timestamp
參數(shù)所表示的值,取決于函數(shù)是在一個字符串還是或數(shù)字上下文中被使用。
mysql> select FROM_UNIXTIME(875996580); -> '1997-10-04 22:23:00' mysql> select FROM_UNIXTIME(875996580) + 0; -> 19971004222300
FROM_UNIXTIME(unix_timestamp,format)
返回表示 Unix 時間標記的一個字符串,根據(jù)format
字符串格式化。format
可以包含與DATE_FORMAT()
函數(shù)列出的條目同樣的修飾符。
mysql> select FROM_UNIXTIME(UNIX_TIMESTAMP(), '%Y %D %M %h:%i:%s %x'); -> '1997 23rd December 03:43:30 x'
SEC_TO_TIME(seconds)
返回seconds
參數(shù),變換成小時、分鐘和秒,值以'HH:MM:SS'
或HHMMSS
格式化,取決于函數(shù)是在一個字符串還是在數(shù)字上下文中被使用。
mysql> select SEC_TO_TIME(2378); -> '00:39:38' mysql> select SEC_TO_TIME(2378) + 0; -> 3938
TIME_TO_SEC(time)
返回time
參數(shù),轉(zhuǎn)換成秒。
mysql> select TIME_TO_SEC('22:23:00'); -> 80580 mysql> select TIME_TO_SEC('00:39:38'); -> 2378
其他函數(shù)
DATABASE()
返回當前的數(shù)據(jù)庫名字。
mysql> select DATABASE(); -> 'test'
如果沒有當前的數(shù)據(jù)庫,DATABASE()
返回空字符串。
USER()
SYSTEM_USER()
SESSION_USER()
返回當前MySQL用戶名。
mysql> select USER(); -> 'davida@localhost'
在MySQL 3.22.11或以后版本中,這包括用戶名和客戶主機名。你可以象這樣只提取用戶名部分(值是否包括主機名部分均可工作):
mysql> select substring_index(USER(),"@",1); -> 'davida'
PASSWORD(str)
從純文本口令str
計算一個口令字符串。該函數(shù)被用于為了在user
授權(quán)表的Password
列中存儲口令而加密MySQL口令。
mysql> select PASSWORD('badpwd'); -> '7f84554057dd964b'
PASSWORD()
加密是非可逆的。PASSWORD()
不以與Unix口令加密的相同的方法執(zhí)行口令加密。你不應(yīng)該假定如果你的Unix 口令和你的MySQL口令是一樣的,PASSWORD()
將導(dǎo)致與在Unix口令文件存儲的相同的加密值。見ENCRYPT()
。
ENCRYPT(str[,salt])
使用Unix crypt()
系統(tǒng)調(diào)用加密str
。salt
參數(shù)應(yīng)該是一個有2個字符的字符串。(MySQL 3.22.16中,salt
可以長于2個字符。)
mysql> select ENCRYPT("hello"); -> 'VxuFAJXVARROc'
如果crypt()
在你的系統(tǒng)上不可用,ENCRYPT()
總是返回NULL
。ENCRYPT()
只保留str
起始8個字符而忽略所有其他,至少在某些系統(tǒng)上是這樣。這將由底層的crypt()
系統(tǒng)調(diào)用的行為決定。
ENCODE(str,pass_str)
使用pass_str
作為口令加密str
。為了解密結(jié)果,使用DECODE()
。結(jié)果是一個二進制字符串,如果你想要在列中保存它,使用一個BLOB
列類型。
DECODE(crypt_str,pass_str)
使用pass_str
作為口令解密加密的字符串crypt_str
。crypt_str
應(yīng)該是一個由ENCODE()
返回的字符串。
MD5(string)
對字符串計算MD5校驗和。值作為一個32長的十六進制數(shù)字被返回可以,例如用作哈希(hash)鍵。
mysql> select MD5("testing") -> 'ae2b1fca515949e5d54fb22b8ed95575'
這是一個“RSA數(shù)據(jù)安全公司的MD5消息摘要算法”。
LAST_INSERT_ID([expr])
返回被插入一個AUTO_INCREMENT
列的最后一個自動產(chǎn)生的值。見20.4.29 mysql_insert_id()
。
mysql> select LAST_INSERT_ID(); -> 195
產(chǎn)生的最后ID以每個連接為基礎(chǔ)在服務(wù)器被維護,它不會被其他客戶改變。如果你更新另外一個有非魔術(shù)值(即,不是NULL
和不是0
的一個值)的AUTO_INCREMENT
列,它甚至不會被改變。如果expr
作為一個參數(shù)在一個UPDATE
子句的LAST_INSERT_ID()
里面給出,那么參數(shù)值作為一個LAST_INSERT_ID()
值被返回。這可以用來模仿順序:首先創(chuàng)建表:
mysql> create table sequence (id int not null); mysql> insert into sequence values (0);
然后表能被用來產(chǎn)生順序號,象這樣:
mysql> update sequence set id=LAST_INSERT_ID(id+1);
你可以不調(diào)用LAST_INSERT_ID()
而產(chǎn)生順序,但是這樣使用函數(shù)的實用程序在服務(wù)器上自動維護ID值作為最后自動產(chǎn)生的值。你可以檢索新的ID值,就像你能讀入正常MySQL中的任何正常的AUTO_INCREMENT
值一樣。例如,LAST_INSERT_ID()
(沒有一個參數(shù) )將返回新ID。C API函數(shù)mysql_insert_id()
也可被用來得到值。
FORMAT(X,D)
格式化數(shù)字X
為類似于格式'#,###,###.##'
,四舍五入到D
為小數(shù)。如果D
為0
,結(jié)果將沒有小數(shù)點和小數(shù)部分。
mysql> select FORMAT(12332.123456, 4); -> '12,332.1235' mysql> select FORMAT(12332.1,4); -> '12,332.1000' mysql> select FORMAT(12332.2,0); -> '12,332'
VERSION()
返回表明MySQL服務(wù)器版本的一個字符串。
mysql> select VERSION(); -> '3.22.19b-log'
GET_LOCK(str,timeout)
試圖獲得由字符串str
給定的一個名字的鎖定,第二個timeout
為超時。如果鎖定成功獲得,返回1
,如果嘗試超時了,返回0
,或如果發(fā)生一個錯誤,返回NULL
(例如從存儲器溢出或線程用mysqladmin kill
被殺死)。當你執(zhí)行RELEASE_LOCK()
時、執(zhí)行一個新的GET_LOCK()
或線程終止時,一個鎖定被釋放。該函數(shù)可以用來實現(xiàn)應(yīng)用鎖或模擬記錄鎖,它阻止其他客戶用同樣名字的鎖定請求;贊成一個給定的鎖定字符串名字的客戶可以使用字符串執(zhí)行子協(xié)作建議的鎖定。
mysql> select GET_LOCK("lock1",10); -> 1 mysql> select GET_LOCK("lock2",10); -> 1 mysql> select RELEASE_LOCK("lock2"); -> 1 mysql> select RELEASE_LOCK("lock1"); -> NULL
注意,第二個RELEASE_LOCK()
調(diào)用返回NULL
,因為鎖"lock1"
自動地被第二個GET_LOCK()
調(diào)用釋放。
RELEASE_LOCK(str)
釋放字符串str
命名的通過GET_LOCK()
獲得的鎖。如果鎖被釋放,返回1
,如果鎖沒被這個線程鎖定(在此情況下鎖沒被釋放)返回0
,并且如果命名的鎖不存在,返回NULL
。如果鎖從來沒有通過調(diào)用GET_LOCK()
獲得或如果它已經(jīng)被釋放了,鎖將不存在。
BENCHMARK(count,expr)
BENCHMARK()
函數(shù)重復(fù)count
Times次執(zhí)行表達式expr
,它可以用于計時MySQL處理表達式有多快。結(jié)果值總是0
。意欲用于mysql
客戶,它報告查詢的執(zhí)行時間。
mysql> select BENCHMARK(1000000,encode("hello","goodbye")); +----------------------------------------------+ | BENCHMARK(1000000,encode("hello","goodbye")) | +----------------------------------------------+ | 0 | +----------------------------------------------+ 1 row in set (4.74 sec)
報告的時間是客戶端的經(jīng)過時間,不是在服務(wù)器端的CPU時間。執(zhí)行BENCHMARK()
若干次可能是明智的,并且注意服務(wù)器機器的負載有多重來解釋結(jié)果。
GROUP BY
子句一起使用的函數(shù)如果你在不包含GROUP BY
子句的一個語句中使用聚合函數(shù),它等價于聚合所有行。
COUNT(expr)
返回由一個SELECT
語句檢索出來的行的非NULL
值的數(shù)目。
mysql> select student.student_name,COUNT(*) from student,course where student.student_id=course.student_id GROUP BY student_name;
COUNT(*)
在它返回的檢索出來的行數(shù)目上有些不同,不管他們是否包含NULL
值。如果SELECT
從一個表檢索,或沒有檢索出其他列并且沒有WHERE
子句,COUNT(*)
被優(yōu)化以便快速地返回。例如:
mysql> select COUNT(*) from student;
COUNT(DISTINCT expr,[expr...])
返回一個不同值的數(shù)目。
mysql> select COUNT(DISTINCT results) from student;
在MySQL中,你可以通過給出一個表達式列表以得到不同的表達式組合的數(shù)目。在 ANSI SQL中,你可能必須在CODE(DISTINCT ..)
內(nèi)進行所有表達式的連接。
AVG(expr)
返回expr
的平均值。
mysql> select student_name, AVG(test_score) from student GROUP BY student_name;
MIN(expr)
MAX(expr)
返回expr
的最小或最大值。MIN()
和MAX()
可以有一個字符串參數(shù);在這種的情況下,他們返回最小或最大的字符串值。
mysql> select student_name, MIN(test_score), MAX(test_score) from student GROUP BY student_name;
SUM(expr)
返回expr
的和。注意,如果返回的集合沒有行,它返回NULL!
STD(expr)
STDDEV(expr)
返回expr
標準差(deviation)。這是對 ANSI SQL 的擴展。該函數(shù)的形式STDDEV()
是提供與Oracle的兼容性。
BIT_OR(expr)
返回expr
里所有位的位或。計算用 64 位(BIGINT
)精度進行。
BIT_AND(expr)
返回expr
里所有位的位與。計算用 64 位(BIGINT
)精度進行。
MySQL擴展了GROUP BY
的用法。你可以不出現(xiàn)在的GROUP BY
部分的SELECT
表達式中使用列或計算,這表示這個組的任何可能值。你可以使用它是性能更好,避免在不必要的項目上排序和分組。例如,你在下列查詢中不需要在customer.name
上聚合:
mysql> select order.custid,customer.name,max(payments) from order,customer where order.custid = customer.custid GROUP BY order.custid;
在 ANSI SQL中,你將必須將customer.name
加到GROUP BY
子句。在MySQL中,名字是冗余的。
如果你從GROUP BY
部分省略的列在組中不是唯一的,不要使用這個功能。
在某些情況下,你可以使用MIN()
和MAX()
獲得一個特定的列值,即使它不是唯一的。下例給出從包含sort
列中最小值的行的column
值:
substr(MIN(concat(sort,space(6-length(sort)),column),7,length(column)))
注意,如果你正在使用MySQL 3.22(或更早)或如果你正在試圖遵從ANSI SQL,你不能在GROUP BY
或ORDER BY
子句中使用表達式。你可以通過使用表達式的一個別名解決此限制:
mysql> SELECT id,FLOOR(value/100) AS val FROM tbl_name GROUP BY id,val ORDER BY val;
在MySQL
3.23中,你可以這樣做:
mysql> SELECT id,FLOOR(value/100) FROM tbl_name ORDER BY RAND();
關(guān)于mysql中有哪些常用函數(shù)問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。