(大数据工程师学习路径)第五步 MySQL参考手册中文版----MySQL函数和操作符
一、操作符
1.1 操作符優(yōu)先級
以下列表顯示了操作符優(yōu)先級的由低到高的順序。排列在同一行的操作符具有相同的優(yōu)先級。
| := | 1 |
| ||, OR, XOR | 2 |
| &&, AND | 3 |
| NOT | 4 |
| BETWEEN, CASE, WHEN, THEN, ELSE | 5 |
| =, <=>, >=, >, <=, <, <>, !=, IS, LIKE, REGEXP, IN | 6 |
| | | 7 |
| & | 8 |
| <<, >> | 9 |
| -, + | 10 |
| *, /, DIV, %, MOD | 11 |
| ^ | 12 |
| - (一元減號), ~ (一元比特反轉(zhuǎn)) | 12 |
| ! | 13 |
| BINARY, COLLATE | 14 |
注釋:假如 HIGH_NOT_PRECEDENCE SQL 模式被激活,則 NOT 的優(yōu)先級同 the ! 操作符相同。
1.2 圓括號
( ... )
使用括弧來規(guī)定表達(dá)式的運算順序,例如:
mysql> SELECT 1+2*3;-> 7 mysql> SELECT (1+2)*3;-> 91.3 比較函數(shù)和操作符
比較運算產(chǎn)生的結(jié)果為1(TRUE)、0 (FALSE)或 NULL。這些運算可用于數(shù)字和字符串。根據(jù)需要,字符串可自動轉(zhuǎn)換為數(shù)字,而數(shù)字也可自動轉(zhuǎn)換為字符串。
本節(jié)中的一些函數(shù) (如LEAST()和GREATEST()) 的所得值不包括 1 (TRUE)、 0 (FALSE)和 NULL。然而,其所得值乃是基于按照下述規(guī)則運行的比較運算:
MySQL按照以下規(guī)則進(jìn)行數(shù)值比較:
- 若有一個或兩個參數(shù)為 NULL,除非NULL-safe <=> 等算符,則比較運算的結(jié)果為NULL。
- 若同一個比較運算中的兩個參數(shù)都是字符串,則按照字符串進(jìn)行比較。
- 若兩個參數(shù)均為整數(shù),則按照整數(shù)進(jìn)行比較。
- 十六進(jìn)制值在不需要作為數(shù)字進(jìn)行比較時,則按照二進(jìn)制字符串進(jìn)行處理。
- 假如參數(shù)中的一個為 TIMESTAMP 或 DATETIME 列,而其它參數(shù)均為常數(shù), 則在進(jìn)行比較前將常數(shù)轉(zhuǎn)為 timestamp。這樣做的目的是為了使ODBC的進(jìn)行更加順利。 注意,這不適合IN()中的參數(shù)!為了更加可靠,在進(jìn)行對比時通常使用完整的 datetime/date/time字符串。
- 在其它情況下,參數(shù)作為浮點數(shù)進(jìn)行比較。
在默認(rèn)狀態(tài)下,字符串比較不區(qū)分大小寫,并使用現(xiàn)有字符集(默認(rèn)為cp1252 Latin1,同時對英語也適合)。
為了進(jìn)行比較,可使用CAST()函數(shù)將某個值轉(zhuǎn)為另外一種類型。 使用CONVERT()將字符串值轉(zhuǎn)為不同的字符集。
以下例子說明了比較運算中將字符串轉(zhuǎn)為數(shù)字的過程:
mysql> SELECT 1 > '6x';-> 0 mysql> SELECT 7 > '6x'; -> 1 mysql> SELECT 0 > 'x6'; -> 0 mysql> SELECT 0 = 'x6'; -> 1注意,在將一個字符串列同一個數(shù)字進(jìn)行比較時, MySQL 不能使用列中的索引進(jìn)行快速查找。假如str_col 是一個編入索引的字符串列,則在以下語句中,索引不能執(zhí)行查找功能:
SELECT * FROM tbl_name WHERE str_col=1;其原因是許多不同的字符串都可被轉(zhuǎn)換為數(shù)值 1: '1'、'1a'、 ……
-
=?等于:
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 -
<=>?NULL-safe equal.這個操作符和=操作符執(zhí)行相同的比較操作,不過在兩個操作碼均為NULL時,其所得值為1而不為NULL,而當(dāng)一個操作碼為NULL時,其所得值為0而不為NULL。
-
<>?或?!=?不等于:
mysql> SELECT '.01' <> '0.01';-> 1 mysql> SELECT .01 <> '0.01'; -> 0 mysql> SELECT 'zapp' <> 'zappp'; -> 1 -
<=?小于等于:
-
<?小于:
mysql> SELECT 2 < 2;-> 0 -
>=?大于等于:
mysql> SELECT 2 >= 2;-> 1 -
>?大于:
mysql> SELECT 2 > 2;-> 0 -
IS boolean_value?和?IS NOT boolean_value?根據(jù)一個布爾值來檢驗一個值,在這里,布爾值可以是TRUE、FALSE或UNKNOWN。
mysql> SELECT 1 IS TRUE, 0 IS FALSE, NULL IS UNKNOWN; -> 1, 1, 1 mysql> SELECT 1 IS NOT UNKNOWN, 0 IS NOT UNKNOWN, NULL IS NOT UNKNOWN; -> 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 -
expr BETWEEN min AND max?假如expr大于或等于 min 且expr 小于或等于max, 則BETWEEN 的返回值為1,或是0。若所有參數(shù)都是同一類型,則上述關(guān)系相當(dāng)于表達(dá)式 (min <= expr AND expr <= max)。其它類型的轉(zhuǎn)換根據(jù)本章開篇所述規(guī)律進(jìn)行,且適用于3種參數(shù)中任意一種。
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?這相當(dāng)于NOT(expr BETWEEN min AND max)。
-
COALESCE(value,...) 返回值為列表當(dāng)中的第一個非 NULL值,在沒有非NULL 值得情況下返回值為 NULL 。
mysql> SELECT COALESCE(NULL,1);-> 1 mysql> SELECT COALESCE(NULL,NULL,NULL); -> NULL -
GREATEST(value1,value2,...)?當(dāng)有2或多個參數(shù)時,返回值為最大(最大值的)參數(shù)。比較參數(shù)所依據(jù)的規(guī)律同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'
在沒有自變量為NULL的情況下,GREATEST()的返回值為NULL。
- expr IN (value,...)?若expr 為IN列表中的任意一個值,則其返回值為 1 , 否則返回值為0。假如所有的值都是常數(shù),則其計算和分類根據(jù) expr 的類型進(jìn)行。這時,使用二分搜索來搜索信息。如IN值列表全部由常數(shù)組成,則意味著IN 的速度非常之快。如expr 是一個區(qū)分大小寫的字符串表達(dá)式,則字符串比較也按照區(qū)分大小寫的方式進(jìn)行。 mysql> SELECT 2 IN (0,3,5,'wefwf'); -> 0 mysql> SELECT 'wefwf' IN (0,3,5,'wefwf'); -> 1
IN 列表中所列值的個數(shù)僅受限于 max_allowed_packet 值。
為了同SQL 標(biāo)準(zhǔn)相一致,在左側(cè)表達(dá)式為NULL的情況下,或是表中找不到匹配項或是表中一個表達(dá)式為NULL 的情況下,IN的返回值均為NULL。
IN() 語構(gòu)也可用書寫某些類型的子查詢。
-
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 值對比通常是錯誤的。
-
INTERVAL(N,N1,N2,N3,...)?假如N < N1,則返回值為0;假如N < N2 等等,則返回值為1;假如N 為NULL,則返回值為 -1 。所有的參數(shù)均按照整數(shù)處理。為了這個函數(shù)的正確運行,必須滿足 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 -
LEAST(value1,value2,...)?在有兩個或多個參數(shù)的情況下, 返回值為最小 (最小值) 參數(shù)。用一下規(guī)則將自變量進(jìn)行對比: 假如返回值被用在一個 INTEGER 語境中,或是所有參數(shù)均為整數(shù)值,則將其作為整數(shù)值進(jìn)行比較。 假如返回值被用在一個 REAL語境中,或所有參數(shù)均為實值,則 將其作為實值進(jìn)行比較。 假如任意一個參數(shù)是一個區(qū)分大小寫的字符串,則將參數(shù)按照區(qū)分大小寫的字符串進(jìn)行比較。 在其它情況下,將參數(shù)作為區(qū)分大小寫的字符串進(jìn)行比較。 假如任意一個自變量為NULL,則 LEAST()的返回值為NULL 。
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'
注意,上面的轉(zhuǎn)換規(guī)則在一些邊界情形中會產(chǎn)生一些奇特的結(jié)果:
mysql> SELECT CAST(LEAST(3600, 9223372036854775808.0) as SIGNED); -> -9223372036854775808發(fā)生這種情況的原因是MySQL在整數(shù)語境中讀取9223372036854775808.0。整數(shù)表示法不利于保存數(shù)值,因此它包括一個帶符號整數(shù)。
1.4 邏輯操作符
在SQL中,所有邏輯 操作符的求值所得結(jié)果均為 TRUE、FALSE或 NULL (UNKNOWN)。在 MySQL中,它們體現(xiàn)為 1 (TRUE)、 0 (FALSE)和 NULL。其大多數(shù)都與不同的數(shù)據(jù)庫SQL通用,然而一些服務(wù)器對TRUE的返回值可能是任意一個非零值。
- NOT !?邏輯 NOT。當(dāng)操作數(shù)為0 時,所得值為 1 ;當(dāng)操作數(shù)為非零值時,所得值為 0 ,而當(dāng)操作數(shù)為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
最后一個例子產(chǎn)生的結(jié)果為 1,原因是表達(dá)式的計算方式和(!1)+1相同。
-
AND &&?邏輯AND。當(dāng)所有操作數(shù)均為非零值、并且不為NULL時,計算所得結(jié)果為 1 ,當(dāng)一個或多個操作數(shù)為0 時,所得結(jié)果為 0 ,其余情況返回值為 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 -
OR或者||?邏輯 OR。當(dāng)兩個操作數(shù)均為非 NULL值時,如有任意一個操作數(shù)為非零值,則結(jié)果為1,否則結(jié)果為0。當(dāng)有一個操作數(shù)為NULL時,如另一個操作數(shù)為非零值,則結(jié)果為1,否則結(jié)果為 NULL 。假如兩個操作數(shù)均為 NULL,則所得結(jié)果為 NULL。
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?邏輯XOR。當(dāng)任意一個操作數(shù)為 NULL時,返回值為NULL。對于非 NULL 的操作數(shù),假如一個奇數(shù)操作數(shù)為非零值,則計算所得結(jié)果為 1 ,否則為 0 。
mysql> SELECT 1 XOR 1;-> 0 mysql> SELECT 1 XOR 0; -> 1 mysql> SELECT 1 XOR NULL; -> NULL mysql> SELECT 1 XOR 1 XOR 1; -> 1
a XOR b 的計算等同于 (a AND (NOT b)) OR ((NOT a)和 b)。
二、控制流程函數(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在第一個方案的返回結(jié)果中, value=compare-value。而第二個方案的返回結(jié)果是第一種情況的真實結(jié)果。如果沒有匹配的結(jié)果值,則返回結(jié)果為ELSE后的結(jié)果,如果沒有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一個CASE表達(dá)式的默認(rèn)返回值類型是任何返回值的相容集合類型,但具體情況視其所在語境而定。如果用在字符串語境中,則返回結(jié)果味字符串。如果用在數(shù)字語境中,則返回結(jié)果為十進(jìn)制值、實值或整數(shù)值。
- IF(expr1,expr2,expr3) 如果 expr1 是TRUE (expr1 <> 0 and 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'),'no','yes'); -> 'no'
如果expr2 或expr3中只有一個明確是 NULL,則IF() 函數(shù)的結(jié)果類型 為非NULL表達(dá)式的結(jié)果類型。
expr1 作為一個整數(shù)值進(jìn)行計算,就是說,假如你正在驗證浮點值或字符串值, 那么應(yīng)該使用比較運算進(jìn)行檢驗。
mysql> SELECT IF(0.1,1,0);-> 0 mysql> SELECT IF(0.1<>0,1,0); -> 1在所示的第一個例子中,IF(0.1)的返回值為0,原因是 0.1 被轉(zhuǎn)化為整數(shù)值,從而引起一個對 IF(0)的檢驗。這或許不是你想要的情況。在第二個例子中,比較檢驗了原始浮點值,目的是為了了解是否其為非零值。比較結(jié)果使用整數(shù)。
IF() (這一點在其被儲存到臨時表時很重要 ) 的默認(rèn)返回值類型按照以下方式計算:
假如expr2 和expr3 都是字符串,且其中任何一個字符串區(qū)分大小寫,則返回結(jié)果是區(qū)分大小寫。
- IFNULL(expr1,expr2) 假如expr1 不為 NULL,則 IFNULL() 的返回值為 expr1; 否則其返回值為 expr2。IFNULL()的返回值是數(shù)字或是字符串,具體情況取決于其所使用的語境。 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'
IFNULL(expr1,expr2)的默認(rèn)結(jié)果值為兩個表達(dá)式中更加“通用”的一個,順序為STRING、 REAL或 INTEGER。假設(shè)一個基于表達(dá)式的表的情況, 或MySQL必須在內(nèi)存儲器中儲存一個臨時表中IFNULL()的返回值:
CREATE TABLE tmp SELECT IFNULL(1,'test') AS test;在這個例子中,測試列的類型為 CHAR(4)。
- NULLIF(expr1,expr2) 如果expr1 = expr2 成立,那么返回值為NULL,否則返回值為 expr1。這和CASE WHEN expr1 = expr2 THEN NULL ELSE expr1 END相同。 mysql> SELECT NULLIF(1,1);-> NULL mysql> SELECT NULLIF(1,2); -> 1
注意,如果參數(shù)不相等,則 MySQL 兩次求得的值為 expr1 。
三、字符串函數(shù)
假如結(jié)果的長度大于 max_allowed_packet 系統(tǒng)變量的最大值時,字符串值函數(shù)的返回值為NULL。
對于在字符串位置操作的函數(shù),第一個位置的編號為 1。
- ASCII(str) 返回值為字符串str 的最左字符的數(shù)值。假如str為空字符串,則返回值為 0 。假如str 為NULL,則返回值為 NULL。 ASCII()用于帶有從 0到255的數(shù)值的字符。 mysql> SELECT ASCII('2');-> 50 mysql> SELECT ASCII(2); -> 50 mysql> SELECT ASCII('dx'); -> 100
見 ORD()函數(shù)。
-
BIN(N) 返回值為N的二進(jìn)制值的字符串表示,其中 N 為一個longlong (BIGINT) 數(shù)字。這等同于 CONV(N,10,2)。假如N 為NULL,則返回值為 NULL。
mysql> SELECT BIN(12);-> '1100' -
BIT_LENGTH(str) 返回值為二進(jìn)制的字符串str 長度。
mysql> SELECT BIT_LENGTH('text');-> 32 -
CHAR(N,... [USING charset]) CHAR()將每個參數(shù)N理解為一個整數(shù),其返回值為一個包含這些整數(shù)的代碼值所給出的字符的字符串。NULL值被省略。
mysql> SELECT CHAR(77,121,83,81,'76'); -> 'MySQL' mysql> SELECT CHAR(77,77.3,'77.3'); -> 'MMM'
大于 255的CHAR()參數(shù)被轉(zhuǎn)換為多結(jié)果字符。 例如,CHAR(256) 相當(dāng)于 CHAR(1,0), 而CHAR(256*256) 則相當(dāng)于 CHAR(1,0,0):
mysql> SELECT HEX(CHAR(1,0)), HEX(CHAR(256)); mysql> SELECT HEX(CHAR(1,0,0)), HEX(CHAR(256*256));CHAR()的返回值為一個二進(jìn)制字符串。可選擇使用USING語句產(chǎn)生一個給出的字符集中的字符串:
mysql> SELECT CHARSET(CHAR(0x65)), CHARSET(CHAR(0x65 USING utf8)); mysql> SELECT CHARSET(CHAR(0x65)), CHARSET(CHAR(0x65 USING utf8));如果 USING已經(jīng)產(chǎn)生,而結(jié)果字符串不符合給出的字符集,則會發(fā)出警告。 同樣,如果嚴(yán)格的SQL模式被激活,則CHAR()的結(jié)果會成為 NULL。
-
CHAR_LENGTH(str) 返回值為字符串str 的長度,長度的單位為字符。一個多字節(jié)字符算作一個單字符。對于一個包含五個二字節(jié)字符集, LENGTH()返回值為 10, 而CHAR_LENGTH()的返回值為5。
-
CHARACTER_LENGTH(str) CHARACTER_LENGTH()是CHAR_LENGTH()的同義詞。
-
COMPRESS(string_to_compress) 壓縮一個字符串。這個函數(shù)要求 MySQL已經(jīng)用一個諸如zlib的壓縮庫壓縮過。 否則,返回值始終是NULL。UNCOMPRESS() 可將壓縮過的字符串進(jìn)行解壓縮。
mysql> SELECT LENGTH(COMPRESS(REPEAT('a',1000))); -> 21 mysql> SELECT LENGTH(COMPRESS('')); -> 0 mysql> SELECT LENGTH(COMPRESS('a')); -> 13 mysql> SELECT LENGTH(COMPRESS(REPEAT('a',16))); -> 15
壓縮后的字符串的內(nèi)容按照以下方式存儲: 空字符串按照空字符串存儲。 非空字符串未壓縮字符串的四字節(jié)長度進(jìn)行存儲(首先為低字節(jié)),后面是壓縮字符串。如果字符串以空格結(jié)尾,就會在后加一個"."號,以防止當(dāng)結(jié)果值是存儲在CHAR或VARCHAR類型的字段列時,出現(xiàn)自動把結(jié)尾空格去掉的現(xiàn)象。(不推薦使用 CHAR 或VARCHAR 來存儲壓縮字符串。最好使用一個 BLOB 列代替)。
-
CONCAT(str1,str2,...) 返回結(jié)果為連接參數(shù)產(chǎn)生的字符串。如有任何一個參數(shù)為NULL ,則返回值為 NULL。或許有一個或多個參數(shù)。 如果所有參數(shù)均為非二進(jìn)制字符串,則結(jié)果為非二進(jìn)制字符串。 如果自變量中含有任一二進(jìn)制字符串,則結(jié)果為一個二進(jìn)制字符串。一個數(shù)字參數(shù)被轉(zhuǎn)化為與之相等的二進(jìn)制字符串格式;若要避免這種情況,可使用顯式類型 cast, 例如: SELECT CONCAT(CAST(int_col AS CHAR), char_col)
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 With Separator ,是CONCAT()的特殊形式。 第一個參數(shù)是其它參數(shù)的分隔符。分隔符的位置放在要連接的兩個字符串之間。分隔符可以是一個字符串,也可以是其它參數(shù)。如果分隔符為 NULL,則結(jié)果為 NULL。函數(shù)會忽略任何分隔符參數(shù)后的 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'
CONCAT_WS()不會忽略任何空字符串。 (然而會忽略所有的 NULL)。
-
CONV(N,from_base,to_base) 不同數(shù)基間轉(zhuǎn)換數(shù)字。返回值為數(shù)字的N字符串表示,由from_base基轉(zhuǎn)化為 to_base 基。如有任意一個參數(shù)為NULL,則返回值為 NULL。自變量 N 被理解為一個整數(shù),但是可以被指定為一個整數(shù)或字符串。最小基數(shù)為 2 ,而最大基數(shù)則為 36。 If to_base 是一個負(fù)數(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' -
ELT(N,str1,str2,str3,...) 若N = 1,則返回值為 str1 ,若N = 2,則返回值為 str2 ,以此類推。 若N 小于1或大于參數(shù)的數(shù)目,則返回值為 NULL 。 ELT() 是 FIELD()的補(bǔ)數(shù)。
mysql> SELECT ELT(1, 'ej', 'Heja', 'hej', 'foo'); -> 'ej' mysql> SELECT ELT(4, 'ej', 'Heja', 'hej', 'foo'); -> 'foo' -
EXPORT_SET(bits,on,off[,separator[,number_of_bits]]) 返回值為一個字符串,其中對于bits值中的每個位組,可以得到一個 on 字符串,而對于每個清零比特位,可以得到一個off 字符串。bits 中的比特值按照從右到左的順序接受檢驗 (由低位比特到高位比特)。字符串被分隔字符串分開(默認(rèn)為逗號‘,’),按照從左到右的順序被添加到結(jié)果中。number_of_bits 會給出被檢驗的二進(jìn)制位數(shù) (默認(rèn)為 64)。
mysql> SELECT EXPORT_SET(5,'Y','N',',',4); -> 'Y,N,Y,N' mysql> SELECT EXPORT_SET(6,'1','0',',',10); -> '0,1,1,0,0,0,0,0,0,0' -
FIELD(str,str1,str2,str3,...) 返回值為str1, str2, str3,……列表中的str 指數(shù)。在找不到str 的情況下,返回值為 0 。 如果所有對于FIELD() 的參數(shù)均為字符串,則所有參數(shù)均按照字符串進(jìn)行比較。如果所有的參數(shù)均為數(shù)字,則按照數(shù)字進(jìn)行比較。否則,參數(shù)按照雙倍進(jìn)行比較。 如果str 為NULL,則返回值為0 ,原因是NULL不能同任何值進(jìn)行同等比較。FIELD() 是ELT()的補(bǔ)數(shù)。
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ù)字符串,而第二個是type 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 -
FORMAT(X,D) 將number X設(shè)置為格式 '#,###,###.##', 以四舍五入的方式保留到小數(shù)點后D位, 而返回結(jié)果為一個字符串。
-
HEX(N_or_S) 如果N_OR_S 是一個數(shù)字,則返回一個 十六進(jìn)制值 N 的字符串表示,在這里, N 是一個longlong (BIGINT)數(shù)。這相當(dāng)于 CONV(N,10,16)。 如果N_OR_S 是一個字符串,則返回值為一個N_OR_S的十六進(jìn)制字符串表示, 其中每個N_OR_S 里的每個字符被轉(zhuǎn)化為兩個十六進(jìn)制數(shù)字。
mysql> SELECT HEX(255);-> 'FF' mysql> SELECT 0x616263; -> 'abc' mysql> SELECT HEX('abc'); -> 616263 -
INSERT(str,pos,len,newstr) 返回字符串 str, 其子字符串起始于 pos 位置和長期被字符串 newstr取代的len 字符。 如果pos 超過字符串長度,則返回值為原始字符串。 假如len的長度大于其它字符串的長度,則從位置pos開始替換。若任何一個參數(shù)為null,則返回值為NULL。
mysql> SELECT INSERT('Quadratic', 3, 4, 'What'); -> 'QuWhattic' mysql> SELECT INSERT('Quadratic', -1, 4, 'What'); -> 'Quadratic' mysql> SELECT INSERT('Quadratic', 3, 100, 'What'); -> 'QuWhat'
這個函數(shù)支持多字節(jié)字元。
-
INSTR(str,substr) 返回字符串 str 中子字符串的第一個出現(xiàn)位置。這和LOCATE()的雙參數(shù)形式相同,除非參數(shù)的順序被顛倒。
mysql> SELECT INSTR('foobarbar', 'bar'); -> 4 mysql> SELECT INSTR('xbar', 'foobar'); -> 0這個函數(shù)支持多字節(jié)字元,并且只有當(dāng)至少有一個參數(shù)是二進(jìn)制字符串時區(qū)分大小寫。
-
LCASE(str) LCASE() 是 LOWER()的同義詞。
-
LEFT(str,len) 返回從字符串str 開始的len 最左字符。
mysql> SELECT LEFT('foobarbar', 5); -> 'fooba' -
LENGTH(str) 返回值為字符串str 的長度,單位為字節(jié)。一個多字節(jié)字符算作多字節(jié)。這意味著 對于一個包含5個2字節(jié)字符的字符串, LENGTH() 的返回值為 10, 而 CHAR_LENGTH()的返回值則為5。
mysql> SELECT LENGTH('text');-> 4 -
LOAD_FILE(file_name) 讀取文件并將這一文件按照字符串的格式返回。 文件的位置必須在服務(wù)器上,你必須為文件制定路徑全名,而且你還必須擁有FILE 特許權(quán)。文件必須可讀取,文件容量必須小于 max_allowed_packet字節(jié)。 若文件不存在,或因不滿足上述條件而不能被讀取, 則函數(shù)返回值為 NULL。
mysql> UPDATE tbl_nameSET blob_column=LOAD_FILE('/tmp/picture')WHERE id=1; -
LOCATE(substr,str) , LOCATE(substr,str,pos) 第一個語法返回字符串 str中子字符串substr的第一個出現(xiàn)位置。第二個語法返回字符串 str中子字符串substr的第一個出現(xiàn)位置, 起始位置在pos。如若substr 不在str中,則返回值為0。
mysql> SELECT LOCATE('bar', 'foobarbar'); -> 4 mysql> SELECT LOCATE('xbar', 'foobar'); -> 0 mysql> SELECT LOCATE('bar', 'foobarbar',5); -> 7
這個函數(shù)支持多字節(jié)字元,并且只有當(dāng)至少有一個參數(shù)是二進(jìn)制字符串時區(qū)分大小寫。
- LOWER(str) 返回字符串 str 以及所有根據(jù)最新的字符集映射表變?yōu)樾懽帜傅淖址?(默認(rèn)為 cp1252 Latin1)。 mysql> SELECT LOWER('QUADRATICALLY');-> 'quadratically'
這個函數(shù)支持多字節(jié)字元。
-
LPAD(str,len,padstr) 返回字符串 str, 其左邊由字符串padstr 填補(bǔ)到len 字符長度。假如str 的長度大于len, 則返回值被縮短至 len 字符。
mysql> SELECT LPAD('hi',4,'??'); -> '??hi' mysql> SELECT LPAD('hi',1,'??'); -> 'h' -
LTRIM(str) 返回字符串 str ,其引導(dǎo)空格字符被刪除。
mysql> SELECT LTRIM(' barbar');-> 'barbar'
這個函數(shù)支持多字節(jié)字元。
-
MAKE_SET(bits,str1,str2,...) 返回一個設(shè)定值 (一個包含被‘,’號分開的字字符串的字符串) ,由在bits 組中具有相應(yīng)的比特的字符串組成。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(1 | 4,'hello','nice',NULL,'world'); -> 'hello' mysql> SELECT MAKE_SET(0,'a','b','c'); -> '' -
MID(str,pos,len) MID(str,pos,len) 是 SUBSTRING(str,pos,len)的同義詞。
-
OCT(N) 返回一個 N的八進(jìn)制值的字符串表示,其中 N 是一個longlong (BIGINT)數(shù)。這等同于CONV(N,10,8)。若N 為 NULL ,則返回值為NULL。
mysql> SELECT OCT(12);-> '14' -
OCTET_LENGTH(str) OCTET_LENGTH() 是 LENGTH()的同義詞。
-
ORD(str) 若字符串str 的最左字符是一個多字節(jié)字符,則返回該字符的代碼, 代碼的計算通過使用以下公式計算其組成字節(jié)的數(shù)值而得出: (1st byte code) (2nd byte code × 256) (3rd byte code × 2562) ... 假如最左字符不是一個多字節(jié)字符,那么 ORD()和函數(shù)ASCII()返回相同的值。
mysql> SELECT ORD('2');-> 50 -
POSITION(substr IN str) POSITION(substr IN str)是 LOCATE(substr,str)同義詞。
-
QUOTE(str) 引證一個字符串,由此產(chǎn)生一個在SQL語句中可用作完全轉(zhuǎn)義數(shù)據(jù)值的結(jié)果。 返回的字符串由單引號標(biāo)注,每例都帶有單引號 (‘'’)、 反斜線符號 (‘\’)、 ASCII NUL以及前面有反斜線符號的Control-Z 。如果自變量的值為NULL, 則返回不帶單引號的單詞 “NULL”。
mysql> SELECT QUOTE('Don\'t!');-> 'Don\'t!' mysql> SELECT QUOTE(NULL); -> NULL -
REPEAT(str,count) 返回一個由重復(fù)的字符串str 組成的字符串,字符串str的數(shù)目等于count 。 若 count <= 0,則返回一個空字符串。若str 或 count 為 NULL,則返回 NULL 。
mysql> SELECT REPEAT('MySQL', 3); -> 'MySQLMySQLMySQL' -
REPLACE(str,from_str,to_str) 返回字符串str 以及所有被字符串to_str替代的字符串from_str 。
mysql> SELECT REPLACE('www.shiyanlou.com', 'w', 'Ww'); -> 'WwWwWw.shiyanlou.com'
這個函數(shù)支持多字節(jié)字元。
-
REVERSE(str) 返回字符串 str ,順序和字符順序相反。
mysql> SELECT REVERSE('abc');-> 'cba'這個函數(shù)支持多字節(jié)字元。
-
RIGHT(str,len) 從字符串str 開始,返回最右len 字符。
mysql> SELECT RIGHT('foobarbar', 4); -> 'rbar'
這個函數(shù)支持多字節(jié)字元。
- RPAD(str,len,padstr) 返回字符串str, 其右邊被字符串 padstr填補(bǔ)至len 字符長度。假如字符串str 的長度大于 len,則返回值被縮短到與 len 字符相同長度。 mysql> SELECT RPAD('hi',5,'?'); -> 'hi???' mysql> SELECT RPAD('hi',1,'?'); -> 'h'
這個函數(shù)支持多字節(jié)字元。
- RTRIM(str) 返回字符串 str ,結(jié)尾空格字符被刪去。 mysql> SELECT RTRIM('barbar ');-> 'barbar'
這個函數(shù)支持多字節(jié)字元。
- SOUNDEX(str) 從str返回一個soundex字符串。 兩個具有幾乎同樣探測的字符串應(yīng)該具有同樣的 soundex 字符串。一個標(biāo)準(zhǔn)的soundex 字符串的長度為4個字符,然而SOUNDEX() 函數(shù)會返回一個人以長度的字符串。 可使用結(jié)果中的SUBSTRING() 來得到一個標(biāo)準(zhǔn) soundex 字符串。在str中,會忽略所有未按照字母順序排列的字符。 所有不在A-Z范圍之內(nèi)的國際字母符號被視為元音字母。 mysql> SELECT SOUNDEX('Hello');-> 'H400' mysql> SELECT SOUNDEX('Quadratically'); -> 'Q36324'
注意:這個函數(shù)執(zhí)行原始的Soundex算法,而非更加流行的加強(qiáng)版本(如D. Knuth所述)。其區(qū)別在于原始版本首先會刪去元音,其次是重復(fù),而加強(qiáng)版則首先刪去重復(fù),而后刪去元音。
-
expr1 SOUNDS LIKE expr2 這相當(dāng)于SOUNDEX(expr1) = SOUNDEX(expr2)。
-
SPACE(N) 返回一個由N 間隔符號組成的字符串。
mysql> SELECT SPACE(6);-> ' ' -
SUBSTRING(str,pos) , SUBSTRING(str FROM pos) SUBSTRING(str,pos,len) , SUBSTRING(str FROM pos FOR len) 不帶有l(wèi)en 參數(shù)的格式從字符串str返回一個子字符串,起始于位置 pos。帶有l(wèi)en參數(shù)的格式從字符串str返回一個長度同len字符相同的子字符串,起始于位置 pos。 使用 FROM的格式為標(biāo)準(zhǔn) SQL 語法。也可能對pos使用一個負(fù)值。假若這樣,則子字符串的位置起始于字符串結(jié)尾的pos 字符,而不是字符串的開頭位置。在以下格式的函數(shù)中可以對pos 使用一個負(fù)值。
mysql> SELECT SUBSTRING('Quadratically',5); -> 'ratically' mysql> SELECT SUBSTRING('foobarbar' FROM 4); -> 'barbar' mysql> SELECT SUBSTRING('Quadratically',5,6); -> 'ratica' mysql> SELECT SUBSTRING('Sakila', -3); -> 'ila' mysql> SELECT SUBSTRING('Sakila', -5, 3); -> 'aki' mysql> SELECT SUBSTRING('Sakila' FROM -4 FOR 2); -> 'ki'
這個函數(shù)支持多字節(jié)字元。
注意,如果對len使用的是一個小于1的值,則結(jié)果始終為空字符串。
SUBSTR()是 SUBSTRING()的同義詞。
- SUBSTRING_INDEX(str,delim,count) 在定界符 delim 以及count 出現(xiàn)前,從字符串str返回自字符串。若count為正值,則返回最終定界符(從左邊開始)左邊的一切內(nèi)容。若count為負(fù)值,則返回定界符(從右邊開始)右邊的一切內(nèi)容。 mysql> SELECT SUBSTRING_INDEX('www.shiyanlou.com', '.', 2); -> 'www.shiyanlou' mysql> SELECT SUBSTRING_INDEX('www.shiyanlou.com', '.', -2); -> 'shiyanlou.com'
這個函數(shù)支持多字節(jié)字元。
-
TRIM([{BOTH | LEADING | TRAILING} [remstr] FROM] str) TRIM(remstr FROM] str) 返回字符串 str , 其中所有remstr 前綴和/或后綴都已被刪除。若分類符BOTH、LEADIN或TRAILING中沒有一個是給定的,則假設(shè)為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é)字元。
-
UCASE(str) UCASE()是UPPER()的同義詞。
-
UNCOMPRESS(string_to_uncompress) 對經(jīng)COMPRESS()函數(shù)壓縮后的字符串進(jìn)行解壓縮。若參數(shù)為壓縮值,則結(jié)果為 NULL。這個函數(shù)要求 MySQL 已被諸如zlib 之類的壓縮庫編譯過。否則, 返回值將始終是 NULL。
mysql> SELECT UNCOMPRESS(COMPRESS('any string'));-> 'any string' mysql> SELECT UNCOMPRESS('any string'); -> NULL -
UNCOMPRESSED_LENGTH(compressed_string) 返回壓縮字符串壓縮前的長度。
mysql> SELECT UNCOMPRESSED_LENGTH(COMPRESS(REPEAT('a',30))); -> 30 -
UNHEX(str) 執(zhí)行從HEX(str)的反向操作。就是說,它將參數(shù)中的每一對十六進(jìn)制數(shù)字理解為一個數(shù)字,并將其轉(zhuǎn)化為該數(shù)字代表的字符。結(jié)果字符以二進(jìn)制字符串的形式返回。
mysql> SELECT UNHEX('4D7953514C');-> 'MySQL' mysql> SELECT 0x4D7953514C; -> 'MySQL' mysql> SELECT UNHEX(HEX('string')); -> 'string' mysql> SELECT HEX(UNHEX('1267')); -> '1267' -
UPPER(str) 返回字符串str, 以及根據(jù)最新字符集映射轉(zhuǎn)化為大寫字母的字符 (默認(rèn)為cp1252 Latin1).
mysql> SELECT UPPER('Hej');-> 'HEJ'
該函數(shù)支持多字節(jié)字元
- STRCMP(expr1,expr2) 若所有的字符串均相同,則返回STRCMP(),若根據(jù)當(dāng)前分類次序,第一個參數(shù)小于第二個,則返回 -1,其它情況返回 1 。 mysql> SELECT STRCMP('text', 'text2'); -> -1 mysql> SELECT STRCMP('text2', 'text'); -> 1 mysql> SELECT STRCMP('text', 'text'); -> 0
在執(zhí)行比較時,STRCMP() 使用當(dāng)前字符集。這使得默認(rèn)的比較區(qū)分大小寫,當(dāng)操作數(shù)中的一個或兩個都是二進(jìn)制字符串時除外。
四、數(shù)值函數(shù)
4.1 算數(shù)操作符
-
+?加號:
mysql> SELECT 3+5;-> 8 -
-?減號:
mysql> SELECT 3-5;-> -2 -
-?一元減號。更換參數(shù)符號。
mysql> SELECT - 2;-> -2
注意:若該 操作符同一個BIGINT同時使用,則返回值也是一個BIGINT。這意味著你應(yīng)當(dāng)盡量避免對可能產(chǎn)生–263的整數(shù)使用 –。
- *?乘號: mysql> SELECT 3*5;-> 15 mysql> SELECT 18014398509481984*18014398509481984.0;-> 324518553658426726783156020576256.0 mysql> SELECT 18014398509481984*18014398509481984;-> 0
最后一個表達(dá)式的結(jié)果是不正確的。原因是整數(shù)相乘的結(jié)果超過了BIGINT 計算的 64比特范圍。
- /?除號: mysql> SELECT 3/5;-> 0.60
被零除的結(jié)果為 NULL:
mysql> SELECT 102/(1-1);-> NULL只有當(dāng)執(zhí)行的語境中,其結(jié)果要被轉(zhuǎn)化為一個整數(shù)時 ,除法才會和 BIGINT 算法一起使用。
- DIV?整數(shù)除法。 類似于 FLOOR(),然而使用BIGINT 算法也是可靠的。 mysql> SELECT 5 DIV 2;-> 2
4.2 數(shù)學(xué)函數(shù)
若發(fā)生錯誤,所有數(shù)學(xué)函數(shù)會返回 NULL 。
- ABS(X) 返回X 的絕對值。 mysql> SELECT ABS(2);-> 2 mysql> SELECT ABS(-32); -> 32
該函數(shù)支持使用BIGINT值。
-
ACOS(X) 返回X 反余弦, 即, 余弦是X的值。若X 不在-1到 1的范圍之內(nèi),則返回 NULL 。
mysql> SELECT ACOS(1);-> 0 mysql> SELECT ACOS(1.0001); -> NULL mysql> SELECT ACOS(0); -> 1.5707963267949 -
ASIN(X) 返回X 的反正弦,即,正弦為X 的值。若X 若X 不在-1到 1的范圍之內(nèi),則返回 NULL 。
mysql> SELECT ASIN(0.2);-> 0.20135792079033 mysql> SELECT ASIN('foo'); -
ATAN(X) 返回X 的反正切,即,正切為X 的值。
mysql> SELECT ATAN(2);-> 1.1071487177941 mysql> SELECT ATAN(-2); -> -1.1071487177941 -
ATAN(Y,X) , ATAN2(Y,X) 返回兩個變量X 及Y的反正切。 它類似于 Y 或 X的反正切計算, 除非兩個參數(shù)的符號均用于確定結(jié)果所在象限。
mysql> SELECT ATAN(-2,2);-> -0.78539816339745 mysql> SELECT ATAN2(PI(),0); -> 1.5707963267949 -
CEILING(X) CEIL(X) 返回不小于X 的最小整數(shù)值。
mysql> SELECT CEILING(1.23);-> 2 mysql> SELECT CEIL(-1.23); -> -1
這兩個函數(shù)的意義相同。注意返回值會被轉(zhuǎn)化為一個BIGINT。
-
COS(X) 返回X 的余弦,其中X在弧度上已知。
mysql> SELECT COS(PI());-> -1 -
COT(X) 返回X 的余切。
mysql> SELECT COT(12);-> -1.5726734063977 mysql> SELECT COT(0); -> NULL -
CRC32(expr) 計算循環(huán)冗余碼校驗值并返回一個 32比特?zé)o符號值。若參數(shù)為NULL ,則結(jié)果為 NULL。該參數(shù)應(yīng)為一個字符串,而且在不是字符串的情況下會被作為字符串處理(若有可能)。
mysql> SELECT CRC32('MySQL');-> 3259397556 mysql> SELECT CRC32('mysql'); -> 2501908538 -
DEGREES(X) 返回參數(shù) X, 該參數(shù)由弧度被轉(zhuǎn)化為度。
mysql> SELECT DEGREES(PI());-> 180 mysql> SELECT DEGREES(PI() / 2); -> 90 -
EXP(X) 返回e的X乘方后的值(自然對數(shù)的底)。
mysql> SELECT EXP(2);-> 7.3890560989307 mysql> SELECT EXP(-2); -> 0.13533528323661 mysql> SELECT EXP(0); -> 1 -
FLOOR(X) 返回不大于X的最大整數(shù)值 。
mysql> SELECT FLOOR(1.23);-> 1 mysql> SELECT FLOOR(-1.23); -> -2
注意,返回值會被轉(zhuǎn)化為一個 BIGINT。
-
FORMAT(X,D) 將數(shù)字X 的格式寫成'#,###,###.##'格式, 即保留小數(shù)點后 D位,而第D位的保留方式為四舍五入,然后將結(jié)果以字符串的形式返回。
-
LN(X) 返回X 的自然對數(shù),即, X 相對于基數(shù)e 的對數(shù)。
mysql> SELECT LN(2);-> 0.69314718055995 mysql> SELECT LN(-2); -> NULL
這個函數(shù)同LOG(X)具有相同意義。
- LOG(X) LOG(B,X) 若用一個參數(shù)調(diào)用,這個函數(shù)就會返回X 的自然對數(shù)。 mysql> SELECT LOG(2);-> 0.69314718055995 mysql> SELECT LOG(-2); -> NULL
若用兩個參數(shù)進(jìn)行調(diào)用,這個函數(shù)會返回X 對于任意基數(shù)B 的對數(shù)。
mysql> SELECT LOG(2,65536);-> 16 mysql> SELECT LOG(10,100); -> 2LOG(B,X) 就相當(dāng)于 LOG(X) / LOG(B)。
- LOG2(X) 返回X 的基數(shù)為2的對數(shù)。 mysql> SELECT LOG2(65536);-> 16 mysql> SELECT LOG2(-100); -> NULL
對于查出存儲一個數(shù)字需要多少個比特,LOG2()非常有效。這個函數(shù)相當(dāng)于表達(dá)式 LOG(X) / LOG(2)。
- LOG10(X) 返回X的基數(shù)為10的對數(shù)。 mysql> SELECT LOG10(2);-> 0.30102999566398 mysql> SELECT LOG10(100); -> 2 mysql> SELECT LOG10(-100); -> NULL
LOG10(X)相當(dāng)于LOG(10,X)。
- MOD(N,M) , N % M N MOD M 模操作。返回N 被 M除后的余數(shù)。 mysql> SELECT MOD(234, 10);-> 4 mysql> SELECT 253 % 7; -> 1 mysql> SELECT MOD(29,9); -> 2 mysql> SELECT 29 MOD 9; -> 2
這個函數(shù)支持使用BIGINT 值。
MOD() 對于帶有小數(shù)部分的數(shù)值也起作用, 它返回除法運算后的精確余數(shù):
mysql> SELECT MOD(34.5,3);-> 1.5-
PI() 返回 ? (pi)的值。默認(rèn)的顯示小數(shù)位數(shù)是7位,然而 MySQL內(nèi)部會使用完全雙精度值。
mysql> SELECT PI();-> 3.141593 mysql> SELECT PI()+0.000000000000000000; -> 3.141592653589793116 -
POW(X,Y) , POWER(X,Y) 返回X 的Y乘方的結(jié)果值。
mysql> SELECT POW(2,2);-> 4 mysql> SELECT POW(2,-2); -> 0.25 -
RADIANS(X) 返回由度轉(zhuǎn)化為弧度的參數(shù) X, (注意 ? 弧度等于180度)。
mysql> SELECT RADIANS(90);-> 1.5707963267949 -
RAND() RAND(N) 返回一個隨機(jī)浮點值 v ,范圍在 0 到1 之間 (即, 其范圍為 0 ≤ v ≤ 1.0)。若已指定一個整數(shù)參數(shù) N ,則它被用作種子值,用來產(chǎn)生重復(fù)序列。
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 mysql> SELECT RAND(20); -> 0.15888261251047
若要在i ≤ R ≤ j 這個范圍得到一個隨機(jī)整數(shù)R ,需要用到表達(dá)式 FLOOR(i + RAND() * (j – i + 1))。例如, 若要在7 到 12 的范圍(包括7和12)內(nèi)得到一個隨機(jī)整數(shù), 可使用以下語句:
SELECT FLOOR(7 + (RAND() * 6));在ORDER BY語句中,不能使用一個帶有RAND()值的列,原因是 ORDER BY 會計算列的多重時間。然而,可按照如下的隨機(jī)順序檢索數(shù)據(jù)行:
mysql> SELECT * FROM tbl_name ORDER BY RAND();ORDER BY RAND()同 LIMIT 的結(jié)合從一組列中選擇隨機(jī)樣本很有用:
mysql> SELECT * FROM table1, table2 WHERE a=b AND c<d-> ORDER BY RAND() LIMIT 1000;注意,在WHERE語句中,WHERE每執(zhí)行一次, RAND()就會被再計算一次。
RAND()的作用不是作為一個精確的隨機(jī)發(fā)生器,而是一種用來發(fā)生在同樣的 MySQL版本的平臺之間的可移動ad hoc隨機(jī)數(shù)的快速方式。
- ROUND(X) ROUND(X,D) 返回參數(shù)X, 其值接近于最近似的整數(shù)。在有兩個參數(shù)的情況下,返回 X ,其值保留到小數(shù)點后D位,而第D位的保留方式為四舍五入。若要接保留X值小數(shù)點左邊的D 位,可將 D 設(shè)為負(fù)值。 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 mysql> SELECT ROUND(23.298, -1); -> 20
返回值的類型同 第一個自變量相同(假設(shè)它是一個整數(shù)、雙精度數(shù)或小數(shù))。這意味著對于一個整數(shù)參數(shù),結(jié)果也是一個整數(shù)(無小數(shù)部分)。
當(dāng)?shù)谝粋€參數(shù)是十進(jìn)制常數(shù)時,對于準(zhǔn)確值參數(shù),ROUND() 使用精密數(shù)學(xué)題庫:
對于準(zhǔn)確值數(shù)字, ROUND() 使用“四舍五入” 或“舍入成最接近的數(shù)” 的規(guī)則:對于一個分?jǐn)?shù)部分為 .5或大于 .5的值,正數(shù)則上舍入到鄰近的整數(shù)值, 負(fù)數(shù)則下舍入臨近的整數(shù)值。(換言之, 其舍入的方向是數(shù)軸上遠(yuǎn)離零的方向)。對于一個分?jǐn)?shù)部分小于.5 的值,正數(shù)則下舍入下一個整數(shù)值,負(fù)數(shù)則下舍入鄰近的整數(shù)值,而正數(shù)則上舍入鄰近的整數(shù)值。 對于近似值數(shù)字,其結(jié)果根據(jù)C 庫而定。在很多系統(tǒng)中,這意味著 ROUND()的使用遵循“舍入成最接近的偶數(shù)”的規(guī)則: 一個帶有任何小數(shù)部分的值會被舍入成最接近的偶數(shù)整數(shù)。 以下舉例說明舍入法對于精確值和近似值的不同之處:
mysql> SELECT ROUND(2.5), ROUND(25E-1);SIGN(X) 返回參數(shù)作為-1、 0或1的符號,該符號取決于X 的值為負(fù)、零或正。
mysql> SELECT SIGN(-32);-> -1 mysql> SELECT SIGN(0); -> 0 mysql> SELECT SIGN(234); -> 1SIN(X) 返回X 正弦,其中 X 在弧度中被給定。
mysql> SELECT SIN(PI());-> 1.2246063538224e-16 mysql> SELECT ROUND(SIN(PI())); -> 0-
SQRT(X) 返回非負(fù)數(shù)X 的二次方根。
mysql> SELECT SQRT(4);-> 2 mysql> SELECT SQRT(20); -> 4.4721359549996 mysql> SELECT SQRT(-16); -> NULL -
TAN(X) 返回X 的正切,其中X 在弧度中被給定。
mysql> SELECT TAN(PI());-> -1.2246063538224e-16 mysql> SELECT TAN(PI()+1); -> 1.5574077246549 -
TRUNCATE(X,D) 返回被舍去至小數(shù)點后D位的數(shù)字X。若D 的值為 0, 則結(jié)果不帶有小數(shù)點或不帶有小數(shù)部分。可以將D設(shè)為負(fù)數(shù),若要截去(歸零) X小數(shù)點左起第D位開始后面所有低位的值.
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> SELECT TRUNCATE(122,-2); -> 100 mysql> SELECT TRUNCATE(10.28*100,0); -> 1028
所有數(shù)字的舍入方向都接近于零。
五、日期和時間函數(shù)
- ADDDATE(date,INTERVAL expr type) ADDDATE(expr,days) 當(dāng)被第二個參數(shù)的INTERVAL格式激活后, ADDDATE()就是DATE_ADD()的同義詞。相關(guān)函數(shù)SUBDATE() 則是DATE_SUB()的同義詞。 mysql> SELECT DATE_ADD('1998-01-02', INTERVAL 31 DAY); -> '1998-02-02' mysql> SELECT ADDDATE('1998-01-02', INTERVAL 31 DAY); -> '1998-02-02'
若 days 參數(shù)只是整數(shù)值,則 MySQL 5.1將其作為天數(shù)值添加至 expr。
mysql> SELECT ADDDATE('1998-01-02', 31); -> '1998-02-02'-
ADDTIME(expr,expr2) ADDTIME()將 expr2添加至expr 然后返回結(jié)果。 expr 是一個時間或時間日期表達(dá)式,而expr2 是一個時間表達(dá)式。
mysql> SELECT ADDTIME('1997-12-31 23:59:59.999999',-> '1 1:1:1.000002'); -> '1998-01-02 01:01:01.000001' mysql> SELECT ADDTIME('01:00:00.999999', '02:00:00.999998'); -> '03:00:01.999997' -
CONVERT_TZ(dt,from_tz,to_tz) CONVERT_TZ() 將時間日期值dt 從from_tz 給出的時區(qū)轉(zhuǎn)到to_tz給出的時區(qū),然后返回結(jié)果值。 在從若from_tz 到UTC的轉(zhuǎn)化過程中,該值超出 TIMESTAMP 類型的被支持范圍,那么轉(zhuǎn)化不會發(fā)生。
mysql> SELECT CONVERT_TZ('2004-01-01 12:00:00','GMT','MET'); -> '2004-01-01 13:00:00' mysql> SELECT CONVERT_TZ('2004-01-01 12:00:00','+00:00','+10:00'); -> '2004-01-01 22:00:00'
注釋:若要使用諸如 'MET'或 'Europe/Moscow'之類的指定時間區(qū),首先要設(shè)置正確的時區(qū)表。
-
CURDATE() 將當(dāng)前日期按照'YYYY-MM-DD' 或YYYYMMDD 格式的值返回,具體格式根據(jù)函數(shù)用在字符串或是數(shù)字語境中而定。
mysql> SELECT CURDATE();-> '1997-12-15' mysql> SELECT CURDATE() + 0; -> 19971215 -
CURRENT_DATE CURRENT_DATE() CURRENT_DATE和CURRENT_DATE()是的同義詞.
-
CURTIME() 將當(dāng)前時間以'HH:MM:SS'或 HHMMSS 的格式返回, 具體格式根據(jù)函數(shù)用在字符串或是數(shù)字語境中而定。
mysql> SELECT CURTIME();-> '23:50:26' mysql> SELECT CURTIME() + 0; -> 235026 -
CURRENT_TIME, CURRENT_TIME() CURRENT_TIME 和CURRENT_TIME() 是CURTIME()的同義詞。
-
CURRENT_TIMESTAMP, CURRENT_TIMESTAMP() CURRENT_TIMESTAMP和 CURRENT_TIMESTAMP()是NOW()的同義詞。
-
DATE(expr) 提取日期或時間日期表達(dá)式expr中的日期部分。
mysql> SELECT DATE('2014-10-29 01:02:03');-> '2014-10-29' -
DATEDIFF(expr,expr2) DATEDIFF() 返回起始時間 expr和結(jié)束時間expr2之間的天數(shù)。Expr和expr2 為日期或 date-and-time 表達(dá)式。計算中只用到這些值的日期部分。
mysql> SELECT DATEDIFF('1997-12-31 23:59:59','1997-12-30'); -> 1 mysql> SELECT DATEDIFF('1997-11-30 23:59:59','1997-12-31'); -> -31 -
DATE_ADD(date,INTERVAL expr type) DATE_SUB(date,INTERVAL expr type) 這些函數(shù)執(zhí)行日期運算。 date 是一個 DATETIME 或DATE值,用來指定起始時間。 expr 是一個表達(dá)式,用來指定從起始日期添加或減去的時間間隔值。 Expr是一個字符串;對于負(fù)值的時間間隔,它可以以一個 ‘-’開頭。 type 為關(guān)鍵詞,它指示了表達(dá)式被解釋的方式。
關(guān)鍵詞INTERVA及 type 分類符均不區(qū)分大小寫。
以下表顯示了type 和expr 參數(shù)的關(guān)系:
MySQL 允許任何expr 格式中的標(biāo)點分隔符。表中所顯示的是建議的 分隔符。若 date 參數(shù)是一個 DATE 值,而你的計算只會包括 YEAR、MONTH和DAY部分(即, 沒有時間部分), 其結(jié)果是一個DATE 值。否則,結(jié)果將是一個 DATETIME值。
若位于另一端的表達(dá)式是一個日期或日期時間值 , 則INTERVAL expr type只允許在 + 操作符的兩端。對于 –操作符, INTERVAL expr type 只允許在其右端,原因是從一個時間間隔中提取一個日期或日期時間值是毫無意義的。 (見下面的例子)。
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 DATE_ADD('1992-12-31 23:59:59.000002', -> INTERVAL '1.999999' SECOND_MICROSECOND); -> '1993-01-01 00:00:01.000001'若你指定了一個過于短的時間間隔值 (不包括type 關(guān)鍵詞所預(yù)期的所有時間間隔部分), MySQL 假定你已經(jīng)省去了時間間隔值的最左部分。 例如,你指定了一種類型的DAY_SECOND, expr 的值預(yù)期應(yīng)當(dāng)具有天、 小時、分鐘和秒部分。若你指定了一個類似 '1:10'的值, MySQL 假定天和小時部分不存在,那么這個值代表分和秒。換言之, '1:10' DAY_SECOND 被解釋為相當(dāng)于 '1:10' MINUTE_SECOND。這相當(dāng)于 MySQL將TIME 值解釋為所耗費的時間而不是日時的解釋方式。
假如你對一個日期值添加或減去一些含有時間部分的內(nèi)容,則結(jié)果自動轉(zhuǎn)化為一個日期時間值:
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'假如你使用了格式嚴(yán)重錯誤的日期,則結(jié)果為 NULL。假如你添加了 MONTH、YEAR_MONTH或YEAR ,而結(jié)果日期中有一天的日期大于添加的月份的日期最大限度,則這個日期自動被調(diào)整為添加月份的最大日期:
mysql> SELECT DATE_ADD('1998-01-30', INTERVAL 1 MONTH); -> '1998-02-28'- DATE_FORMAT(date,format) 根據(jù)format 字符串安排date 值的格式。 以下說明符可用在 format 字符串中:
所有其它字符都被復(fù)制到結(jié)果中,無需作出解釋。
注意, ‘%’字符要求在格式指定符之前。
月份和日期說明符的范圍從零開始,原因是 MySQL允許存儲諸如 '2004-00-00'的不完全日期.
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' mysql> SELECT DATE_FORMAT('1999-01-01', '%X %V'); -> '1998 52'-
DAY(date) DAY() 和DAYOFMONTH()的意義相同。
-
DAYNAME(date) 返回date 對應(yīng)的工作日名稱。
mysql> SELECT DAYNAME('1998-02-05');-> '周四' -
DAYOFMONTH(date) 返回date 對應(yīng)的該月日期,范圍是從 1到31。
mysql> SELECT DAYOFMONTH('1998-02-03');-> 3 -
DAYOFWEEK(date) 返回date (1 = 周日, 2 = 周一, ..., 7 = 周六)對應(yīng)的工作日索引。這些索引值符合 ODBC標(biāo)準(zhǔn)。
mysql> SELECT DAYOFWEEK('1998-02-03');-> 3 -
DAYOFYEAR(date) 返回date 對應(yīng)的一年中的天數(shù),范圍是從 1到366。
mysql> SELECT DAYOFYEAR('1998-02-03');-> 34 -
EXTRACT(type FROM date) EXTRACT()函數(shù)所使用的時間間隔類型說明符同 DATE_ADD()或DATE_SUB()的相同,但它從日期中提取其部分,而不是執(zhí)行日期運算。
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 mysql> SELECT EXTRACT(MICROSECOND -> FROM '2003-01-02 10:30:00.00123'); -> 123 -
FROM_DAYS(N) 給定一個天數(shù) N, 返回一個DATE值。
mysql> SELECT FROM_DAYS(729669);-> '1997-10-07'
使用 FROM_DAYS()處理古老日期時,務(wù)必謹(jǐn)慎。他不用于處理陽歷出現(xiàn)前的日期(1582)
-
FROM_UNIXTIME(unix_timestamp) , FROM_UNIXTIME(unix_timestamp,format) 返回'YYYY-MM-DD HH:MM:SS'或YYYYMMDDHHMMSS 格式值的unix_timestamp參數(shù)表示,具體格式取決于該函數(shù)是否用在字符串中或是數(shù)字語境中。 若format 已經(jīng)給出,則結(jié)果的格式是根據(jù)format 字符串而定。 format 可以包含同DATE_FORMAT() 函數(shù)輸入項列表中相同的說明符。
mysql> SELECT FROM_UNIXTIME(875996580);-> '1997-10-04 22:23:00' mysql> SELECT FROM_UNIXTIME(875996580) + 0; -> 19971004222300 mysql> SELECT FROM_UNIXTIME(UNIX_TIMESTAMP(), -> '%Y %D %M %h:%i:%s %x'); -> '2003 6th August 06:22:58 2003' -
GET_FORMAT(DATE|TIME|DATETIME, 'EUR'|'USA'|'JIS'|'ISO'|'INTERNAL') 返回一個格式字符串。這個函數(shù)在同DATE_FORMAT() 及STR_TO_DATE()函數(shù)結(jié)合時很有用。 第一個參數(shù)的3個可能值和第二個參數(shù)的5個可能值產(chǎn)生 15 個可能格式字符串 (對于使用的說明符,請參見DATE_FORMAT()函數(shù)說明表 )。
ISO 格式為ISO 9075, 而非ISO 8601.
也可以使用TIMESTAMP, 這時GET_FORMAT()的返回值和DATETIME相同。
mysql> SELECT DATE_FORMAT('2003-10-03',GET_FORMAT(DATE,'EUR')); -> '03.10.2003' mysql> SELECT STR_TO_DATE('10.31.2003',GET_FORMAT(DATE,'USA')); -> '2003-10-31'- HOUR(time) 返回time 對應(yīng)的小時數(shù)。對于日時值的返回值范圍是從 0 到 23 。 mysql> SELECT HOUR('10:05:03');-> 10
然而, TIME 值的范圍實際上非常大, 所以HOUR可以返回大于23的值。
mysql> SELECT HOUR('272:59:59');-> 272-
LAST_DAY(date) 獲取一個日期或日期時間值,返回該月最后一天對應(yīng)的值。若參數(shù)無效,則返回NULL。
mysql> SELECT LAST_DAY('2003-02-05');-> '2003-02-28' mysql> SELECT LAST_DAY('2004-02-05'); -> '2004-02-29' mysql> SELECT LAST_DAY('2004-01-01 01:01:01'); -> '2004-01-31' mysql> SELECT LAST_DAY('2003-03-32'); -> NULL -
LOCALTIME, LOCALTIME() LOCALTIME 及 LOCALTIME()和NOW()具有相同意義。
-
LOCALTIMESTAMP, LOCALTIMESTAMP() LOCALTIMESTAMP和LOCALTIMESTAMP()和NOW()具有相同意義。
-
MAKEDATE(year,dayofyear) 給出年份值和一年中的天數(shù)值,返回一個日期。dayofyear 必須大于 0 ,否則結(jié)果為 NULL。
mysql> SELECT MAKEDATE(2001,31), MAKEDATE(2001,32); -> '2001-01-31', '2001-02-01' mysql> SELECT MAKEDATE(2001,365), MAKEDATE(2004,365); -> '2001-12-31', '2004-12-30' mysql> SELECT MAKEDATE(2001,0); -> NULL -
MAKETIME(hour,minute,second) 返回由hour、 minute和second 參數(shù)計算得出的時間值。
mysql> SELECT MAKETIME(12,15,30); -> '12:15:30' -
MICROSECOND(expr) 從時間或日期時間表達(dá)式expr返回微秒值,其數(shù)字范圍從 0到 999999。
mysql> SELECT MICROSECOND('12:00:00.123456');-> 123456 mysql> SELECT MICROSECOND('1997-12-31 23:59:59.000010'); -> 10 -
MINUTE(time) 返回 time 對應(yīng)的分鐘數(shù),范圍是從 0 到 59。
mysql> SELECT MINUTE('98-02-03 10:05:03');-> 5 -
MONTH(date) 返回date 對應(yīng)的月份,范圍時從 1 到 12。
mysql> SELECT MONTH('1998-02-03');-> 2 -
MONTHNAME(date) 返回date 對應(yīng)月份的全名。
mysql> SELECT MONTHNAME('1998-02-05');-> 'February ' -
NOW() 返回當(dāng)前日期和時間值,其格式為 'YYYY-MM-DD HH:MM:SS' 或YYYYMMDDHHMMSS , 具體格式取決于該函數(shù)是否用在字符串中或數(shù)字語境中。
mysql> SELECT NOW();-> '1997-12-15 23:50:26' mysql> SELECT NOW() + 0; -> 19971215235026
在一個存儲程序或觸發(fā)器內(nèi), NOW() 返回一個常數(shù)時間,該常數(shù)指示了該程序或觸發(fā)語句開始執(zhí)行的時間。這同SYSDATE()的運行有所不同。
-
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 -
QUARTER(date) 返回date 對應(yīng)的一年中的季度值,范圍是從 1到 4。
mysql> SELECT QUARTER('98-04-01');-> 2 -
SECOND(time) 返回time 對應(yīng)的秒數(shù), 范圍是從 0到59。
mysql> SELECT SECOND('10:05:03');-> 3 -
SEC_TO_TIME(seconds) 返回被轉(zhuǎn)化為小時、 分鐘和秒數(shù)的seconds參數(shù)值, 其格式為 'HH:MM:SS' 或HHMMSS,具體格式根據(jù)該函數(shù)是否用在字符串或數(shù)字語境中而定。
mysql> SELECT SEC_TO_TIME(2378);-> '00:39:38' mysql> SELECT SEC_TO_TIME(2378) + 0; -> 3938 -
STR_TO_DATE(str,format) 這是DATE_FORMAT() 函數(shù)的倒轉(zhuǎn)。它獲取一個字符串 str 和一個格式字符串format。若格式字符串包含日期和時間部分,則 STR_TO_DATE()返回一個 DATETIME 值, 若該字符串只包含日期部分或時間部分,則返回一個 DATE 或TIME值。 str所包含的日期、時間或日期時間值應(yīng)該在format指示的格式中被給定。對于可用在format中的說明符,請參見DATE_FORMAT() 函數(shù)說明表。 所有其它的字符被逐字獲取,因此不會被解釋。若 str 包含一個非法日期、時間或日期時間值,則 STR_TO_DATE()返回NULL。同時,一個非法值會引起警告。 對日期值部分的范圍檢查在11.3.1節(jié),“DATETIME、DATE和TIMESTAMP類型”有詳細(xì)說明。其意義是,例如, 只要具體日期部分的范圍時從 1到 31之間,則允許一個日期中的具體日期部分大于一個月中天數(shù)值。并且,允許“零”日期或帶有0值部分的日期。
mysql> SELECT STR_TO_DATE('00/00/0000', '%m/%d/%Y'); -> '0000-00-00' mysql> SELECT STR_TO_DATE('04/31/2004', '%m/%d/%Y'); -> '2004-04-31' -
SUBDATE(date,INTERVAL expr type) SUBDATE(expr,days) 當(dāng)被第二個參數(shù)的 INTERVAL型式調(diào)用時, SUBDATE()和DATE_SUB()的意義相同。
mysql> SELECT DATE_SUB('1998-01-02', INTERVAL 31 DAY); -> '1997-12-02' mysql> SELECT SUBDATE('1998-01-02', INTERVAL 31 DAY); -> '1997-12-02'
第二個形式允許對days使用整數(shù)值。在這些情況下,它被算作由日期或日期時間表達(dá)式 expr中提取的天數(shù)。
mysql> SELECT SUBDATE('1998-01-02 12:00:00', 31); -> '1997-12-02 12:00:00'注意不能使用格式 "%X%V" 來將一個 year-week 字符串轉(zhuǎn)化為一個日期,原因是當(dāng)一個星期跨越一個月份界限時,一個年和星期的組合不能標(biāo)示一個唯一的年和月份。若要將year-week轉(zhuǎn)化為一個日期,則也應(yīng)指定具體工作日:
mysql> select str_to_date('200442 Monday', '%X%V %W'); -> 2004-10-18-
SUBTIME(expr,expr2) SUBTIME()從expr 中提取expr2 ,然后返回結(jié)果。expr 是一個時間或日期時間表達(dá)式,而xpr2 是一個時間表達(dá)式。
mysql> SELECT SUBTIME('1997-12-31 23:59:59.999999','1 1:1:1.000002'); -> '1997-12-30 22:58:58.999997' mysql> SELECT SUBTIME('01:00:00.999999', '02:00:00.999998'); -> '-00:59:59.999999' -
SYSDATE() 返回當(dāng)前日期和時間值,格式為'YYYY-MM-DD HH:MM:SS' 或YYYYMMDDHHMMSS, 具體格式根據(jù)函數(shù)是否用在字符串或數(shù)字語境而定。 在一個存儲程序或觸發(fā)器中, SYSDATE()返回其執(zhí)行的時間, 而非存儲或觸發(fā)語句開始執(zhí)行的時間。這個NOW()的運作有所不同。
-
TIME(expr) 提取一個時間或日期時間表達(dá)式的時間部分,并將其以字符串形式返回。
mysql> SELECT TIME('2003-12-31 01:02:03');-> '01:02:03' mysql> SELECT TIME('2003-12-31 01:02:03.000123'); -> '01:02:03.000123' -
TIMEDIFF(expr,expr2) TIMEDIFF() 返回起始時間 expr 和結(jié)束時間expr2 之間的時間。 expr 和expr2 為時間或 date-and-time 表達(dá)式,兩個的類型必須一樣。
mysql> SELECT TIMEDIFF('2000:01:01 00:00:00',-> '2000:01:01 00:00:00.000001');-> '-00:00:00.000001' mysql> SELECT TIMEDIFF('1997-12-31 23:59:59.000001', -> '1997-12-30 01:01:01.000002'); -> '46:58:57.999999' -
TIMESTAMP(expr) , TIMESTAMP(expr,expr2) 對于一個單參數(shù),該函數(shù)將日期或日期時間表達(dá)式 expr 作為日期時間值返回.對于兩個參數(shù), 它將時間表達(dá)式 expr2 添加到日期或日期時間表達(dá)式 expr 中,將theresult作為日期時間值返回。
mysql> SELECT TIMESTAMP('2003-12-31');-> '2003-12-31 00:00:00' mysql> SELECT TIMESTAMP('2003-12-31 12:00:00','12:00:00'); -> '2004-01-01 00:00:00' -
TIMESTAMPADD(interval,intexpr,datetime_expr) 將整型表達(dá)式int_expr 添加到日期或日期時間表達(dá)式 datetime_expr中。 int_expr 的單位被時間間隔參數(shù)給定,該參數(shù)必須是以下值的其中一個: FRAC_SECOND、SECOND、 MINUTE、 HOUR、 DAY、 WEEK、 MONTH、 QUARTER或 YEAR。 可使用所顯示的關(guān)鍵詞指定Interval值,或使用SQL_TSI前綴。例如, DAY或SQL_TSI_DAY 都是正確的。
mysql> SELECT TIMESTAMPADD(MINUTE,1,'2003-01-02'); -> '2003-01-02 00:01:00' mysql> SELECT TIMESTAMPADD(WEEK,1,'2003-01-02'); -> '2003-01-09' -
TIMESTAMPDIFF(interval,datetime_expr1,datetime_expr2) 返回日期或日期時間表達(dá)式datetime_expr1 和datetime_expr2the 之間的整數(shù)差。其結(jié)果的單位由interval 參數(shù)給出。interval 的法定值同TIMESTAMPADD()函數(shù)說明中所列出的相同。
mysql> SELECT TIMESTAMPDIFF(MONTH,'2003-02-01','2003-05-01'); -> 3 mysql> SELECT TIMESTAMPDIFF(YEAR,'2002-05-01','2001-01-01'); -> -1 -
TIME_FORMAT(time,format) 其使用和 DATE_FORMAT()函數(shù)相同, 然而format 字符串可能僅會包含處理小時、分鐘和秒的格式說明符。其它說明符產(chǎn)生一個NULL值或0。 若time value包含一個大于23的小時部分,則 %H 和 %k 小時格式說明符會產(chǎn)生一個大于0..23的通常范圍的值。另一個小時格式說明符產(chǎn)生小時值模數(shù)12。
mysql> SELECT TIME_FORMAT('100:00:00', '%H %k %h %I %l'); -> '100 100 04 04 4' -
TIME_TO_SEC(time) 返回已轉(zhuǎn)化為秒的time參數(shù)。
mysql> SELECT TIME_TO_SEC('22:23:00');-> 80580 mysql> SELECT TIME_TO_SEC('00:39:38'); -> 2378 -
TO_DAYS(date) 給定一個日期date, 返回一個天數(shù) (從年份0開始的天數(shù) )。
mysql> SELECT TO_DAYS(950501);-> 728779 mysql> SELECT TO_DAYS('1997-10-07'); -> 729669
TO_DAYS() 不用于陽歷出現(xiàn)(1582)前的值,原因是當(dāng)日歷改變時,遺失的日期不會被考慮在內(nèi)。
- UNIX_TIMESTAMP(), UNIX_TIMESTAMP(date) 若無參數(shù)調(diào)用,則返回一個Unix timestamp ('1970-01-01 00:00:00' GMT 之后的秒數(shù)) 作為無符號整數(shù)。若用date 來調(diào)用UNIX_TIMESTAMP(),它會將參數(shù)值以'1970-01-01 00:00:00' GMT后的秒數(shù)的形式返回。date 可以是一個DATE 字符串、一個 DATETIME字符串、一個 TIMESTAMP或一個當(dāng)?shù)貢r間的YYMMDD 或YYYMMDD格式的數(shù)字。 mysql> SELECT UNIX_TIMESTAMP();-> 882226357 mysql> SELECT UNIX_TIMESTAMP('1997-10-04 22:23:00'); -> 875996580
當(dāng) UNIX_TIMESTAMP被用在 TIMESTAMP列時, 函數(shù)直接返回內(nèi)部時戳值, 而不進(jìn)行任何隱含的 “string-to-Unix-timestamp”轉(zhuǎn)化。假如你向UNIX_TIMESTAMP()傳遞一個溢出日期,它會返回 0,但請注意只有基本范圍檢查會被履行 (年份從1970 到 2037, 月份從01到12,日期從 01 到31)。
-
UTC_DATE, UTC_DATE() 返回當(dāng)前 UTC日期值,其格式為 'YYYY-MM-DD' 或 YYYYMMDD,具體格式取決于函數(shù)是否用在字符串或數(shù)字語境中。
mysql> SELECT UTC_DATE(), UTC_DATE() + 0; -> '2014-10-29', 20141029 -
UTC_TIME, UTC_TIME() 返回當(dāng)前 UTC 值,其格式為 'HH:MM:SS' 或HHMMSS,具體格式根據(jù)該函數(shù)是否用在字符串或數(shù)字語境而定。
mysql> SELECT UTC_TIME(), UTC_TIME() + 0; -> '18:07:53', 180753 -
UTC_TIMESTAMP, UTC_TIMESTAMP() 返回當(dāng)前UTC日期及時間值,格式為 'YYYY-MM-DD HH:MM:SS' 或YYYYMMDDHHMMSS,具體格式根據(jù)該函數(shù)是否用在字符串或數(shù)字語境而定。
mysql> SELECT UTC_TIMESTAMP(), UTC_TIMESTAMP() + 0; -> '2003-08-14 18:08:04', 20030814180804 -
WEEK(date[,mode]) 該函數(shù)返回date 對應(yīng)的星期數(shù)。WEEK() 的雙參數(shù)形式允許你指定該星期是否起始于周日或周一, 以及返回值的范圍是否為從0 到53 或從1 到53。若 mode參數(shù)被省略,則使用default_week_format系統(tǒng)自變量的值。請參見5.3.3節(jié),“服務(wù)器系統(tǒng)變量”。
以下表說明了mode 參數(shù)的工作過程:
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注意,假如有一個日期位于前一年的最后一周, 若你不使用2、3、6或7作為mode 參數(shù)選擇,則MySQL返回 0:
mysql> SELECT YEAR('2000-01-01'), WEEK('2000-01-01',0); -> 2000, 0有人或許會提出意見,認(rèn)為 MySQL 對于WEEK() 函數(shù)應(yīng)該返回 52 ,原因是給定的日期實際上發(fā)生在1999年的第52周。我們決定返回0作為代替的原因是我們希望該函數(shù)能返回“給定年份的星期數(shù)”。這使得WEEK() 函數(shù)在同其它從日期中抽取日期部分的函數(shù)結(jié)合時的使用更加可靠。
假如你更希望所計算的關(guān)于年份的結(jié)果包括給定日期所在周的第一天,則應(yīng)使用 0、2、5或 7 作為mode參數(shù)選擇。
mysql> SELECT WEEK('2000-01-01',2); -> 52作為選擇,可使用 YEARWEEK()函數(shù):
mysql> SELECT YEARWEEK('2000-01-01');-> 199952 mysql> SELECT MID(YEARWEEK('2000-01-01'),5,2); -> '52'-
WEEKDAY(date) 返回date (0 = 周一, 1 = 周二, ... 6 = 周日)對應(yīng)的工作日索引 weekday index for
mysql> SELECT WEEKDAY('1998-02-03 22:23:00');-> 1 mysql> SELECT WEEKDAY('1997-11-05'); -> 2 -
WEEKOFYEAR(date) 將該日期的陽歷周以數(shù)字形式返回,范圍是從1到53。它是一個兼容度函數(shù),相當(dāng)于WEEK(date,3)。
mysql> SELECT WEEKOFYEAR('1998-02-20');-> 8 -
YEAR(date) 返回date 對應(yīng)的年份,范圍是從1000到9999。
mysql> SELECT YEAR('98-02-03');-> 1998 -
YEARWEEK(date), YEARWEEK(date,start) 返回一個日期對應(yīng)的年或周。start參數(shù)的工作同 start參數(shù)對 WEEK()的工作相同。結(jié)果中的年份可以和該年的第一周和最后一周對應(yīng)的日期參數(shù)有所不同。
mysql> SELECT YEARWEEK('1987-01-01');-> 198653
注意,周數(shù)和WEEK()函數(shù)隊可選參數(shù)0或 1可能會返回的(0) w有所不同,原因是此時 WEEK() 返回給定年份的語境中的周。
六、全文搜索功能
MATCH (col1,col2,...) AGAINST (expr [IN BOOLEAN MODE | WITH QUERY EXPANSION])MySQL支持全文索引和搜索功能。MySQL中的全文索引類型FULLTEXT的索引。 FULLTEXT 索引僅可用于 MyISAM 表;他們可以從CHAR、 VARCHAR或TEXT列中作為CREATE TABLE語句的一部分被創(chuàng)建,或是隨后使用ALTER TABLE 或 CREATE INDEX被添加。對于較大的數(shù)據(jù)集,將你的資料輸入一個沒有FULLTEXT索引的表中,然后創(chuàng)建索引, 其速度比把資料輸入現(xiàn)有FULLTEXT索引的速度更為快。
mysql> CREATE TABLE articles (-> id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,-> title VARCHAR(200),-> body TEXT,-> FULLTEXT (title,body) -> ); mysql> INSERT INTO articles (title,body) VALUES-> ('MySQL Tutorial','DBMS stands for DataBase ...'),-> ('How To Use MySQL Well','After you went through a ...'), -> ('Optimizing MySQL','In this tutorial we will show ...'), -> ('1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'), -> ('MySQL vs. YourSQL','In the following database comparison ...'), -> ('MySQL Security','When configured properly, MySQL ...'); mysql> SELECT * FROM articles-> WHERE MATCH (title,body) AGAINST ('database'); mysql> SELECT id, MATCH (title,body) AGAINST ('Tutorial')-> FROM articles; mysql> SELECT id, body, MATCH (title,body) AGAINST-> ('Security implications of running MySQL as root') AS score-> FROM articles WHERE MATCH (title,body) AGAINST-> ('Security implications of running MySQL as root'); mysql> SELECT * FROM articles-> WHERE MATCH (title,body) AGAINST ('MySQL');七、Cast函數(shù)和操作符
- BINARY BINARY操作符將后面的字符串拋給一個二進(jìn)制字符串。這是一種簡單的方式來促使逐字節(jié)而不是逐字符的進(jìn)行列比較。這使得比較區(qū)分大小寫,即使該列不被定義為 BINARY或 BLOB。BINARY也會產(chǎn)生結(jié)尾空白,從而更加顯眼。 mysql> SELECT 'a' = 'A';-> 1 mysql> SELECT BINARY 'a' = 'A'; -> 0 mysql> SELECT 'a' = 'a '; -> 1 mysql> SELECT BINARY 'a' = 'a '; -> 0
BINARY影響整個比較;它可以在任何操作數(shù)前被給定,而產(chǎn)生相同的結(jié)果。
BINARY str 是CAST(str AS BINARY)的縮略形式。
注意,在一些語境中,假如你將一個編入索引的列派給BINARY, MySQL 將不能有效使用這個索引。
假如你想要將一個 BLOB值或其它二進(jìn)制字符串進(jìn)行區(qū)分大小寫的比較,你可利用二進(jìn)制字符串沒有字符集這一事實實現(xiàn)這個目的,這樣就不會有文書夾的概念。為執(zhí)行一個區(qū)分大小寫的比較,可使用 CONVERT()函數(shù)將一個字符串值轉(zhuǎn)化為一個不區(qū)分大小寫的字符集。其結(jié)果為一個非二進(jìn)制字符串,因此 LIKE 操作也不會區(qū)分大小寫:
SELECT 'A' LIKE CONVERT(blob_col USING latin1) FROM tbl_name;若要使用一個不同的字符集, 替換其在上述語句中的latin1名。
CONVERT()一般可用于比較出現(xiàn)在不同字符集中的字符串。
CAST(expr AS type), CONVERT(expr,type) , CONVERT(expr USING transcoding_name) CAST()和CONVERT() 函數(shù)可用來獲取一個類型的值,并產(chǎn)生另一個類型的值。
這個類型可以是以下值其中的一個:
BINARY[(N)] CHAR[(N)] DATE DATETIME DECIMAL SIGNED [INTEGER] TIME UNSIGNED [INTEGER] BINARY 產(chǎn)生一個二進(jìn)制字符串。
假如給定了隨意長度N,則 BINARY[N] 使 cast使用該參數(shù)的不多于 N 個字節(jié)。同樣的, CHAR[N]會使 cast 使用該參數(shù)的不多于N 個字符。
CAST() and CONVERT(... USING ...) 是標(biāo)準(zhǔn) SQL語法。CONVERT()的非USING 格式是ofis ODBC語法。
帶有USING的CONVERT() 被用來在不同的字符集之間轉(zhuǎn)化數(shù)據(jù)。在 MySQL中, 自動譯碼名和相應(yīng)的字符集名稱相同。例如。 這個語句將服務(wù)器的默認(rèn)字符集中的字符串 'abc'轉(zhuǎn)化為utf8字符集中相應(yīng)的字符串:
SELECT CONVERT('abc' USING utf8);當(dāng)你想要在一個CREATE ... SELECT 語句中創(chuàng)建一個特殊類型的列,則cast函數(shù)會很有用:
CREATE TABLE new_table SELECT CAST('2000-01-01' AS DATE);該函數(shù)也用于ENUM 列按詞法順序的排序。通常ENUM列的排序在使用內(nèi)部數(shù)值時發(fā)生。將這些值按照詞法順序派給 CHAR 結(jié)果:
SELECT enum_col FROM tbl_name ORDER BY CAST(enum_col AS CHAR);CAST(str AS BINARY)和BINARY str相同。 CAST(expr AS CHAR) 將表達(dá)式視為一個帶有默認(rèn)字符集的字符串。
若用于一個諸如 CONCAT('Date: ',CAST(NOW() AS DATE))這樣的比較復(fù)雜的表達(dá)式的一部分,CAST()也會改變結(jié)果。
你不應(yīng)在不同的格式中使用 CAST() 來析取數(shù)據(jù),但可以使用諸如LEFT() 或 EXTRACT() 的樣的字符串函數(shù)來代替。
若要在數(shù)值語境中將一個字符串派給一個數(shù)值, 通常情況下,除了將字符串值作為數(shù)字使用外,你不需要做任何事:
mysql> SELECT 1+'1';-> 2若要在一個字符串語境中使用一個數(shù)字,該數(shù)字會被自動轉(zhuǎn)化為一個BINARY 字符串。
mysql> SELECT CONCAT('hello you ',2); -> 'hello you 2'MySQL 支持帶符號和無符號的64比特值的運算。若你正在使用數(shù)字操作符 (如 +) 而其中一個操作數(shù)為無符號整數(shù),則結(jié)果為無符號。可使用SIGNED 和UNSIGNED cast 操作符來覆蓋它。將運算分別派給帶符號或無符號64比特整數(shù)。
mysql> SELECT CAST(1-2 AS UNSIGNED)-> 18446744073709551615 mysql> SELECT CAST(CAST(1-2 AS UNSIGNED) AS SIGNED); -> -1注意,假如任意一個操作數(shù)為一個浮點值,則結(jié)果為一個浮點值, 且不會受到上述規(guī)則影響 (關(guān)于這一點, DECIMAL 列值被視為浮點值)。
mysql> SELECT CAST(1 AS UNSIGNED) - 2.0;-> -1.0若你在一個算術(shù)運算中使用了一個字符串,它會被轉(zhuǎn)化為一個浮點數(shù)。
八、其他函數(shù)
8.1 位函數(shù)
對于比特運算,MySQL 使用 BIGINT (64比特) 算法,因此這些操作符的最大范圍是 64 比特。
- | Bitwise OR: mysql> SELECT 29 | 15;-> 31
其結(jié)果為一個64比特?zé)o符號整數(shù)。
- & Bitwise AND: mysql> SELECT 29 & 15;-> 13
其結(jié)果為一個64比特?zé)o符號整數(shù)。
- ^ Bitwise XOR: mysql> SELECT 1 ^ 1;-> 0 mysql> SELECT 1 ^ 0;-> 1 mysql> SELECT 11 ^ 3;-> 8
結(jié)果為一個64比特?zé)o符號整數(shù)。
- << 把一個longlong (BIGINT)數(shù)左移兩位。 mysql> SELECT 1 << 2;-> 4
其結(jié)果為一個64比特?zé)o符號整數(shù)。
-
> 把一個longlong (BIGINT)數(shù)右移兩位。
mysql> SELECT 4 >> 2;-> 1
其結(jié)果為一個64比特?zé)o符號整數(shù)。
- ~ 反轉(zhuǎn)所有比特。 mysql> SELECT 5 & ~1;-> 4
其結(jié)果為一個64比特?zé)o符號整數(shù)。
- BIT_COUNT(N) 返回參數(shù)N 中所設(shè)置的比特數(shù) mysql> SELECT BIT_COUNT(29);-> 4
8.2 加密函數(shù)
本節(jié)介紹了加密和加密值。若你想要儲存一些由可能包含任意字節(jié)值的加密函數(shù)返回的結(jié)果,使用BLOB列而不是 CHAR 或VARCHAR 列,從而避免由于結(jié)尾空格的刪除而改變一些數(shù)據(jù)值的潛在問題。
-
AES_ENCRYPT(str,key_str) , AES_DECRYPT(crypt_str,key_str) 這些函數(shù)允許使用官方AES進(jìn)行加密和數(shù)據(jù)加密 (高級加密標(biāo)準(zhǔn) ) 算法, 即以前人們所熟知的 “Rijndael”。 保密關(guān)鍵字的長度為128比特,不過你可以通過改變源而將其延長到 256 比特。我們選擇了 128比特的原因是它的速度要快得多,且對于大多數(shù)用途而言這個保密程度已經(jīng)夠用。 輸入?yún)?shù)可以為任何長度。若任何一個參數(shù)為NULL,則函數(shù)的結(jié)果也是NULL。 因為 AES 是塊級算法,使用填充將不均衡長度字符串編碼,這樣結(jié)果字符串的長度的算法為 16 * (trunc(string_length / 16) + 1)。 若 AES_DECRYPT()檢測到無效數(shù)據(jù)或不正確填充,它會返回 NULL。然而,若輸入的資料或密碼無效時, AES_DECRYPT()有可能返回一個非 NULL 值 (可能為無用信息 )。
-
AES_ENCRYPT()和AES_DECRYPT() 可以被看作MySQL中普遍通用的密碼最安全的加密函數(shù)。
-
DECODE(crypt_str,pass_str) 使用 pass_str 作為密碼,解密加密字符串 crypt_str, crypt_str 應(yīng)該是由ENCODE()返回的字符串。
-
ENCODE(str,pass_str) 使用pass_str 作為密碼,解密 str 。 使用DECODE()解密結(jié)果。 結(jié)果是一個和str長度相同的二進(jìn)制字符串。若你想要將其保留在一個列中,可使用 BLOB 列類型。
-
DES_DECRYPT(crypt_str[,key_str]) 使用DES_ENCRYPT()加密一個字符串。若出現(xiàn)錯誤,這個函數(shù)會返回 NULL。 注意,這個函數(shù)只有當(dāng)MySQL在SSL 的支持下配置完畢時才會運作。 假如沒有給定 key_str 參數(shù), DES_DECRYPT() 會首先檢查加密字符串的第一個字節(jié), 從而確定用來加密原始字符串的DES密碼關(guān)鍵字?jǐn)?shù)字,之后從DES關(guān)鍵字文件中讀取關(guān)鍵字從而解密信息。為使其運行,用戶必須享有 SUPER 特權(quán)。可以選擇--des-key-file服務(wù)器指定關(guān)鍵字文件。 假如你向這個函數(shù)傳遞一個key_str 參數(shù),該字符串被用作解密信息的關(guān)鍵字。 若 crypt_str 參數(shù)看起來不是一個加密字符串, MySQL 會返回給定的 crypt_str。
-
DES_ENCRYPT(str[,(key_num|key_str)]) 用Triple-DES 算法給出的關(guān)鍵字加密字符串。若出現(xiàn)錯誤,這個函數(shù)會返回NULL。 注意,這個函數(shù)只有當(dāng)MySQL 在SSL的支持下配置完畢后才會運行。請參見5.8.7節(jié),“使用安全連接”. 使用的加密關(guān)鍵字的選擇基于第二個到 DES_ENCRYPT()的參數(shù),假如給定:
選擇--des-key-file服務(wù)器指定關(guān)鍵字文件。
返回字符串是一個二進(jìn)制字符串,其中第一個字符為 CHAR(128 | key_num)。
加上 128使得識別加密關(guān)鍵字更加容易。若你使用一個字符串關(guān)鍵字,則 key_num 為127。
結(jié)果的字符串長度為 new_len = orig_len + (8-(orig_len % 8))+1。
DES關(guān)鍵字文件中的每一行都具有如下格式:
key_num des_key_str每個key_num 必須是一個從0到0范圍內(nèi)的數(shù)字。文件中行的排列順序是任意的。 des_key_str 是用來加密信息的字符串。在數(shù)字和關(guān)鍵字之間應(yīng)該至少有一個空格。若你未指定任何到DES_ENCRYPT()的關(guān)鍵字參數(shù),則第一個關(guān)鍵字為默認(rèn)的使用關(guān)鍵字。
使用FLUSH DES_KEY_FILE語句,你可以讓 MySQL從關(guān)鍵字文件讀取新的關(guān)鍵字值。這要求你享有 RELOAD特權(quán)。
擁有一套默認(rèn)關(guān)鍵字的一個好處就是它向應(yīng)用程序提供了一個檢驗加密列值的方式,而無須向最終用戶提供解密這些值的權(quán)力。
mysql> SELECT customer_address FROM customer_table> WHERE crypted_credit_card = DES_ENCRYPT('credit_card_number');- ENCRYPT(str[,salt]) 使用Unix crypt() 系統(tǒng)調(diào)用加密 str。 salt 參數(shù)應(yīng)為一個至少包含2個字符的字符串。若沒有給出 salt 參數(shù),則使用任意值。 mysql> SELECT ENCRYPT('hello');-> 'VxuFAJXVARROc'
至少在一些系統(tǒng)中,ENCRYPT()除了str的前八位字符之外會忽略所有內(nèi)容。這個行為由下劃線的crypt() 系統(tǒng)調(diào)用的執(zhí)行所決定。
假如crypt()在你的系統(tǒng)中不可用(正如在 Windows系統(tǒng)), ENCRYPT() 則會始終返回NULL。鑒于這個原因,我們向你推薦使用 MD5() 或SHA1() 來代替,因為這兩個函數(shù)適合所有的平臺。
- MD5(str) 為字符串算出一個 MD5 128比特檢查和。該值以32位十六進(jìn)制數(shù)字的二進(jìn)制字符串的形式返回, 若參數(shù)為 NULL 則會返回 NULL。例如,返回值可被用作散列關(guān)鍵字。 mysql> SELECT MD5('testing');-> 'ae2b1fca515949e5d54fb22b8ed95575'
這是"RSA Data Security, Inc. MD5 Message-Digest Algorithm."
-
OLD_PASSWORD(str) 當(dāng)PASSWORD()的執(zhí)行變?yōu)楦纳瓢踩詴r,OLD_PASSWORD()會被添加到 MySQL。
-
PASSWORD(str) 從原文密碼str 計算并返回密碼字符串,當(dāng)參數(shù)為 NULL 時返回 NULL。這個函數(shù)用于用戶授權(quán)表的Password列中的加密MySQL密碼存儲
mysql> SELECT PASSWORD('badpwd');-> '7f84554057dd964b'
PASSWORD() 加密是單向的 (不可逆 )。
PASSWORD() 執(zhí)行密碼加密與Unix 密碼被加密的方式不同。請參見ENCRYPT()。
注釋: PASSWORD()函數(shù)在MySQL服務(wù)器中的鑒定系統(tǒng)使用;你不應(yīng)將它用在你個人的應(yīng)用程序中。為達(dá)到同樣目的,可使用 MD5()或SHA1() 代替。
- SHA1(str) SHA(str) 為字符串算出一個 SHA1 160比特檢查和,如RFC 3174 (安全散列算法 )中所述。該值被作為40位十六進(jìn)制數(shù)字返回,而當(dāng)參數(shù)為NULL 時則返回 NULL。這個函數(shù)的一個可能的用處就在于其作為散列關(guān)鍵字。你也可以將其作為存儲密碼的密碼安全函數(shù)使用。 mysql> SELECT SHA1('abc');-> 'a9993e364706816aba3e25717850c26c9cd0d89d'
SHA1()可以被視為一個密碼更加安全的函數(shù),相當(dāng)于 MD5()。 SHA() 和SHA1()具有相同的意義。
8.3 信息函數(shù)
- BENCHMARK(count,expr) BENCHMARK() 函數(shù)重復(fù)count 次執(zhí)行表達(dá)式 expr 。 它可以被用于計算 MySQL 處理表達(dá)式的速度。結(jié)果值通常為 0。另一種用處來自 mysql客戶端內(nèi)部,能夠報告問詢執(zhí)行的次數(shù): mysql> SELECT BENCHMARK(1000000,ENCODE('hello','goodbye'));
此處報告的時間是客戶端上的共用時間,而不是服務(wù)器端上的CPU時間。建議執(zhí)行多遍BENCHMARK(),并解釋與服務(wù)器機(jī)器負(fù)荷程度有關(guān)的結(jié)果。
-
CHARSET(str) 返回字符串自變量的字符集。
mysql> SELECT CHARSET('abc');-> 'latin1' mysql> SELECT CHARSET(CONVERT('abc' USING utf8)); -> 'utf8' mysql> SELECT CHARSET(USER()); -> 'utf8' -
COERCIBILITY(str) 返回字符串自變量的整序可壓縮性值。
mysql> SELECT COERCIBILITY('abc' COLLATE latin1_swedish_ci);-> 0 mysql> SELECT COERCIBILITY(USER()); -> 3 mysql> SELECT COERCIBILITY('abc'); -> 4返回值具有如下意義:
下方值得優(yōu)先級較高。
-
COLLATION(str) 返回惠字符串參數(shù)的排序方式。
mysql> SELECT COLLATION('abc');-> 'latin1_swedish_ci' mysql> SELECT COLLATION(_utf8'abc'); -> 'utf8_general_ci' -
CONNECTION_ID() 返回對于連接的連接ID (線程ID)。每個連接都有各自的唯一 ID。
mysql> SELECT CONNECTION_ID();-> 23786 -
CURRENT_USER, CURRENT_USER() 返回當(dāng)前話路被驗證的用戶名和主機(jī)名組合。這個值符合確定你的存取權(quán)限的MySQL 賬戶。在被指定SQL SECURITY DEFINER特征的存儲程序內(nèi), CURRENT_USER() 返回程序的創(chuàng)建者。 CURRENT_USER()的值可以和USER()的值有所不同。
mysql> SELECT USER(); mysql> SELECT * FROM mysql.user; mysql> SELECT CURRENT_USER(); -
DATABASE() 返回使用 utf8 字符集的默認(rèn)(當(dāng)前)數(shù)據(jù)庫名。在存儲程序里,默認(rèn)數(shù)據(jù)庫是同該程序向關(guān)聯(lián)的數(shù)據(jù)庫,但并不一定與調(diào)用語境的默認(rèn)數(shù)據(jù)庫相同。
mysql> SELECT DATABASE();-> 'test'
若沒有默認(rèn)數(shù)據(jù)庫, DATABASE()返回 NULL。
- FOUND_ROWS() A SELECT語句可能包括一個 LIMIT 子句,用來限制服務(wù)器返回客戶端的行數(shù)。在有些情況下,需要不用再次運行該語句而得知在沒有LIMIT 時到底該語句返回了多少行。為了知道這個行數(shù), 包括在SELECT 語句中選擇 SQL_CALC_FOUND_ROWS ,隨后調(diào)用 FOUND_ROWS() : mysql> SELECT SQL_CALC_FOUND_ROWS * FROM tbl_name-> WHERE id > 100 LIMIT 10; mysql> SELECT FOUND_ROWS();
第二個 SELECT返回一個數(shù)字,指示了在沒有LIMIT子句的情況下,第一個SELECT返回了多少行 (若上述的 SELECT語句不包括 SQL_CALC_FOUND_ROWS 選項,則使用LIMIT 和不使用時,FOUND_ROWS() 可能會返回不同的結(jié)果)。
通過 FOUND_ROWS()的有效行數(shù)是瞬時的,并且不用于越過SELECT SQL_CALC_FOUND_ROWS語句后面的語句。若你需要稍候參閱這個值,那么將其保存:
mysql> SELECT SQL_CALC_FOUND_ROWS * FROM ... ; mysql> SET @rows = FOUND_ROWS();假如你正在使用 SELECT SQL_CALC_FOUND_ROWS, MySQL 必須計算出在全部結(jié)果集合中有所少行。然而, 這比不用LIMIT而再次運行問詢要快,原因是結(jié)果集合不需要被送至客戶端。
SQL_CALC_FOUND_ROWS 和 FOUND_ROWS() 在當(dāng)你希望限制一個問詢返回的行數(shù)時很有用,同時還能不需要再次運行問詢而確定全部結(jié)果集合中的行數(shù)。一個例子就是提供頁式顯示的Web腳本,該顯示包含顯示搜索結(jié)果其它部分的頁的連接。使用FOUND_ROWS() 使你確定剩下的結(jié)果需要多少其它的頁。
SQL_CALC_FOUND_ROWS 和 FOUND_ROWS() 的應(yīng)用對于UNION 問詢比對于簡單SELECT 語句更為復(fù)雜,原因是在UNION 中,LIMIT 可能會出現(xiàn)在多個位置。它可能適用于UNION中的個人 SELECT語句,或是總體上 到UNION 結(jié)果的全程。
SQL_CALC_FOUND_ROWS對于 UNION的意向是它應(yīng)該不需要全程LIMIT而返回應(yīng)返回的行數(shù)。SQL_CALC_FOUND_ROWS 和UNION 一同使用的條件是:
SQL_CALC_FOUND_ROWS 關(guān)鍵詞必須出現(xiàn)在UNION的第一個 SELECT中。 FOUND_ROWS()的值只有在使用 UNION ALL時才是精確的。若使用不帶ALL的UNION,則會發(fā)生兩次刪除, 而 FOUND_ROWS() 的指只需近似的。 假若UNION 中沒有出現(xiàn) LIMIT ,則SQL_CALC_FOUND_ROWS 被忽略,返回臨時表中的創(chuàng)建的用來處理UNION的行數(shù)。
- LAST_INSERT_ID() LAST_INSERT_ID(expr) 自動返回最后一個INSERT或 UPDATE 問詢?yōu)?AUTO_INCREMENT列設(shè)置的第一個發(fā)生的值。 mysql> SELECT LAST_INSERT_ID();-> 195
產(chǎn)生的ID每次連接后保存在服務(wù)器中。這意味著函數(shù)向一個給定客戶端返回的值是該客戶端產(chǎn)生對影響AUTO_INCREMENT列的最新語句第一個 AUTO_INCREMENT值的。這個值不能被其它客戶端影響,即使它們產(chǎn)生它們自己的 AUTO_INCREMENT值。這個行為保證了你能夠找回自己的 ID 而不用擔(dān)心其它客戶端的活動,而且不需要加鎖或處理。
-
ROW_COUNT() ROW_COUNT()返回被前面語句升級的、插入的或刪除的行數(shù)。 這個行數(shù)和 mysql 客戶端顯示的行數(shù)及 mysql_affected_rows() C API 函數(shù)返回的值相同。
mysql> SELECT ROW_COUNT(); -
SCHEMA() 這個函數(shù)和 DATABASE()具有相同的意義。
-
SESSION_USER() SESSION_USER()和 USER()具有相同的意義。
-
SYSTEM_USER() SYSTEM_USER()合 USER()具有相同的意義。
-
USER() 返回當(dāng)前 MySQL用戶名和機(jī)主名
-
VERSION() 返回指示 MySQL 服務(wù)器版本的字符串。這個字符串使用 utf8 字符集。
mysql> SELECT VERSION();
注意,假如你的版本字符串以-log結(jié)尾,這說明登錄已被激活。
8.4 其他函數(shù)
- DEFAULT(col_name) 返回一個表列的默認(rèn)值。若該列沒有默認(rèn)值則會產(chǎn)生錯誤。
-
FORMAT(X,D) 將數(shù)字X 的格式寫為'#,###,###.##',以四舍五入的方式保留小數(shù)點后 D 位, 并將結(jié)果以字符串的形式返回。若 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' -
GET_LOCK(str,timeout) 設(shè)法使用字符串str 給定的名字得到一個鎖, 超時為timeout 秒。若成功得到鎖,則返回 1,若操作超時則返回0 (例如,由于另一個客戶端已提前封鎖了這個名字 ),若發(fā)生錯誤則返回NULL (諸如缺乏記憶或線程mysqladmin kill 被斷開 )。假如你有一個用GET_LOCK()得到的鎖,當(dāng)你執(zhí)行RELEASE_LOCK()或你的連接斷開(正常或非正常)時,這個鎖就會解除。 這個函數(shù)可用于執(zhí)行應(yīng)用程序鎖或模擬記錄鎖定。名稱被鎖定在服務(wù)器范圍內(nèi)。假如一個名字已經(jīng)被一個客戶端封鎖, GET_LOCK() 會封鎖來自另一個客戶端申請封鎖同一個名字的任何請求。這使對一個封鎖名達(dá)成協(xié)議的客戶端使用這個名字合作執(zhí)行建議鎖。然而要知道它也允許不在一組合作客戶端中的一個客戶端封鎖名字,不論是服役的還是非故意的,這樣阻止任何合作中的客戶端封鎖這個名字。一個減少這種情況發(fā)生的辦法就是使用數(shù)據(jù)庫特定的或應(yīng)用程序特定的封鎖名。例如, 使用db_name.str或 app_name.str 形式的封鎖名。
mysql> SELECT GET_LOCK('lock1',10); -> 1 mysql> SELECT IS_FREE_LOCK('lock2'); -> 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)用解開。
- INET_ATON(expr) 給出一個作為字符串的網(wǎng)絡(luò)地址的點地址表示,返回一個代表該地址數(shù)值的整數(shù)。地址可以是4或8比特地址。 mysql> SELECT INET_ATON('209.207.224.40');-> 3520061480
產(chǎn)生的數(shù)字總是按照網(wǎng)絡(luò)字節(jié)順序。如上面的例子,數(shù)字按照 209×2563 + 207×2562 + 224×256 + 40 進(jìn)行計算。
INET_ATON() 也能理解短格式 IP 地址:
mysql> SELECT INET_ATON('127.0.0.1'), INET_ATON('127.1'); -> 2130706433, 2130706433注釋: 在存儲由INET_ATON() 產(chǎn)生的值時,推薦你使用 INT UNSIGNED 列。假如你使用 (帶符號) INT列, 則相應(yīng)的第一個八位組大于127的IP 地址值會被截至 2147483647 (即, INET_ATON('127.255.255.255') 所返回的值)。
-
INET_NTOA(expr) 給定一個數(shù)字網(wǎng)絡(luò)地址 (4 或 8 比特),返回作為字符串的該地址的電地址表示。
mysql> SELECT INET_NTOA(3520061480);-> '209.207.224.40' -
IS_FREE_LOCK(str) 檢查名為str的鎖是否可以使用 (換言之,沒有被封鎖)。若鎖可以使用,則返回 1 (沒有人在用這個鎖), 若這個鎖正在被使用,則返回0 ,出現(xiàn)錯誤則返回 NULL (諸如不正確的參數(shù) )。
-
IS_USED_LOCK(str) 檢查名為str的鎖是否正在被使用(換言之,被封鎖)。若被封鎖,則返回使用該鎖的客戶端的連接標(biāo)識符。否則返回 NULL。
-
MASTER_POS_WAIT(log_name,log_pos[,timeout]) 該函數(shù)對于控制主從同步很有用處。它會持續(xù)封鎖,直到從設(shè)備閱讀和應(yīng)用主機(jī)記錄中所有補(bǔ)充資料到指定的位置。返回值是其為到達(dá)指定位置而必須等待的記錄事件的數(shù)目。若從設(shè)備SQL線程沒有被啟動、從設(shè)備主機(jī)信息尚未初始化、參數(shù)不正確或出現(xiàn)任何錯誤,則該函數(shù)返回 NULL。若超時時間被超過,則返回-1。若在MASTER_POS_WAIT() 等待期間,從設(shè)備SQL線程中止,則該函數(shù)返回 NULL。若從設(shè)備由指定位置通過,則函數(shù)會立即返回結(jié)果。
假如已經(jīng)指定了一個超時時間值,當(dāng) 超時時間 秒數(shù)經(jīng)過后MASTER_POS_WAIT()會停止等待。超時時間 必須大于 0;一個為零或為負(fù)值的 超時時間 表示沒有超時時間。
- NAME_CONST(name,value) 返回給定值。 當(dāng)用來產(chǎn)生一個結(jié)果集合列時, NAME_CONST()促使該列使用給定名稱。 mysql> SELECT NAME_CONST('myname', 14);
這個函數(shù)被添加進(jìn) MySQL 5.0.12。它只做內(nèi)部使用。
-
RELEASE_LOCK(str) 解開被GET_LOCK()獲取的,用字符串str 所命名的鎖。若鎖被解開,則返回 1,若改線程尚未創(chuàng)建鎖,則返回0 (此時鎖沒有被解開 ), 若命名的鎖不存在,則返回 NULL。若該鎖從未被對GET_LOCK()的調(diào)用獲取,或鎖已經(jīng)被提前解開,則該鎖不存在。
-
SLEEP(duration) 睡眠(暫停) 時間為duration 參數(shù)給定的秒數(shù),然后返回 0。若 SLEEP() 被中斷,它會返回 1。 duration 或許或包括一個給定的以微秒為單位的分?jǐn)?shù)部分。
-
UUID() 返回一個通用唯一標(biāo)識符(UUID) ,其產(chǎn)生的根據(jù)是《DCE 1.1: 遠(yuǎn)程過程調(diào)用》 (附錄A) CAE (公共應(yīng)用軟件環(huán)境) 的說明,該作品于1997年10月由 The Open Group 出版 (文件編號 C706,?http://www.opengroup.org/public/pubs/catalog/c706.htm). UUID被設(shè)計成一個在時間和空間上都獨一無二的數(shù)字。2個對UUID() 的調(diào)用應(yīng)產(chǎn)生2個不同的值,即使這些調(diào)用的執(zhí)行是在兩個互不相連的單獨電腦上進(jìn)行。 UUID 是一個由5位十六進(jìn)制數(shù)的字符串表示的128比特數(shù)字 ,其格式為 aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee : 前3個數(shù)字從一個時間戳產(chǎn)生。 第4 個數(shù)字保持暫時唯一性,以防時間戳值失去單一性 (例如, 由于經(jīng)濟(jì)時)。 第5個數(shù)字是一個 IEEE 802 節(jié)點號,它提供空間唯一性。若后者不可用,則用一個隨機(jī)數(shù)字替換。 (例如, 由于主機(jī)沒有以太網(wǎng)卡,或我們不知道怎樣在你的操作系統(tǒng)上找到界面的機(jī)器地址 )。假若這樣,空間唯一性就不能得到保證。盡管如此,一個沖突的發(fā)生機(jī)率還是非常低的。 目前,一個界面的 MAC 地址盡被FreeBSD 和 Linux考慮到。在其它操作系統(tǒng)中, MySQL使用隨機(jī)產(chǎn)生的 48比特數(shù)字。
mysql> SELECT UUID();-> '6ccd780c-baba-1026-9564-0040f4311e29'
注意, UUID() 不支持復(fù)制功能。
- VALUES(col_name) 在一個INSERT … ON DUPLICATE KEY UPDATE …語句中,你可以在UPDATE 子句中使用 VALUES(col_name)函數(shù),用來訪問來自該語句的INSERT 部分的列值。換言之,UPDATE 子句中的 VALUES(col_name) 訪問需要被插入的col_name 的值,并不會發(fā)生重復(fù)鍵沖突。這個函數(shù)在多行插入中特別有用。 VALUES()函數(shù)只在INSERT ... UPDATE 語句中有意義,而在其它情況下只會返回 NULL。
轉(zhuǎn)載于:https://www.cnblogs.com/yangxiao99/p/4728459.html
總結(jié)
以上是生活随笔為你收集整理的(大数据工程师学习路径)第五步 MySQL参考手册中文版----MySQL函数和操作符的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用阿里云接口进行银行卡三要素实名认证
- 下一篇: 如何提升抖音直播间人气热度?首先做好直播