MySQL函數(shù)和操作符
1. 環(huán)境登錄
無(wú)需密碼自動(dòng)登錄,系統(tǒng)用戶名shiyanlou
2. 環(huán)境介紹
本實(shí)驗(yàn)環(huán)境采用帶桌面的Ubuntu Linux環(huán)境,實(shí)驗(yàn)中會(huì)用到桌面上的程序:
命令行終端: Linux命令行終端,打開(kāi)后會(huì)進(jìn)入Bash環(huán)境,可以使用Linux命令
Firefox及Opera:瀏覽器,可以用在需要前端界面的課程里,只需要打開(kāi)環(huán)境里寫(xiě)的HTML/JS頁(yè)面即可
gvim:非常好用的Vim編輯器,最簡(jiǎn)單的用法可以參考課程Vim編輯器
gedit及Brackets:如果您對(duì)gvim的使用不熟悉,可以用這兩個(gè)作為代碼編輯器,其中Brackets非常適用于前端代碼開(kāi)發(fā)
3. 環(huán)境使用
使用GVim編輯器輸入實(shí)驗(yàn)所需的代碼及文件,使用Xfce終端(XfceTerminal)運(yùn)行所需命令進(jìn)行操作。
實(shí)驗(yàn)報(bào)告可以在個(gè)人主頁(yè)中查看,其中含有每次實(shí)驗(yàn)的截圖及筆記,以及每次實(shí)驗(yàn)的有效學(xué)習(xí)時(shí)間(指的是在實(shí)驗(yàn)桌面內(nèi)操作的時(shí)間,如果沒(méi)有操作,系統(tǒng)會(huì)記錄為發(fā)呆時(shí)間)。這些都是您學(xué)習(xí)的真實(shí)性證明。
1.1 操作符優(yōu)先級(jí)
以下列表顯示了操作符優(yōu)先級(jí)的由低到高的順序。排列在同一行的操作符具有相同的優(yōu)先級(jí)。
其中,部分操作符的優(yōu)先級(jí)取決于SQL的模式:
- 默認(rèn)情況下,||是邏輯運(yùn)算符
OR 。當(dāng)啟用PIPES_AS_CONCAT模式時(shí),|| 就是一個(gè)字符串連接符,優(yōu)先級(jí)處于^與一元運(yùn)算符之間。
- 默認(rèn)情況下,!的優(yōu)先級(jí)高于
NOT 。但當(dāng)啟用HIGH_NOT_PRECEDENCE模式時(shí),! 和NOT 擁有相同的優(yōu)先級(jí)。
1.2 圓括號(hào)( ... )
使用括弧來(lái)規(guī)定表達(dá)式的運(yùn)算順序,例如:
mysql> SELECT 1+2*3;
mysql> SELECT (1+2)*3;
1.3 比較函數(shù)和操作符
比較運(yùn)算產(chǎn)生的結(jié)果為1(TRUE) 、0 (FALSE) 或NULL 。這些運(yùn)算可用于數(shù)字和字符串。如果必要的話,字符串可自動(dòng)轉(zhuǎn)換為數(shù)字,而數(shù)字也可自動(dòng)轉(zhuǎn)換為字符串。
本節(jié)中的一些函數(shù)(如LEAST()和GREATEST())的返回值并不會(huì)返回1(TRUE) 、 0 (FALSE) 和NULL 這樣的結(jié)果。但是按照下述規(guī)則函數(shù)進(jìn)行比較運(yùn)算后其返回值可以為以上結(jié)果:
MySQL按照以下規(guī)則進(jìn)行數(shù)值比較:
- 若函數(shù)中有一個(gè)或兩個(gè)參數(shù)都是
NULL ,則比較運(yùn)算的結(jié)果為NULL ,除非是等號(hào)比較運(yùn)算符<=> 。
- 若同一個(gè)比較運(yùn)算中的兩個(gè)參數(shù)都是字符串類型,則作為字符串進(jìn)行比較。
- 若兩個(gè)參數(shù)均為整數(shù),則按照整數(shù)進(jìn)行比較。
- 十六進(jìn)制值在不作為數(shù)字進(jìn)行比較時(shí),則按照二進(jìn)制字符串處理。
- 假如參數(shù)中的一個(gè)為
TIMESTAMP 或DATETIME 數(shù)據(jù)類型,而其它參數(shù)均為常數(shù),則在進(jìn)行比較前應(yīng)該將常數(shù)轉(zhuǎn)為timestamp 類型。這樣做的目的是為了使ODBC 的進(jìn)行更加順利。注意:這不用于IN()中的參數(shù)!為了更加可靠,在進(jìn)行對(duì)比時(shí)通常使用完整的datetime/date/time 字符串。
- 在其它情況下,參數(shù)作為浮點(diǎn)數(shù)(實(shí)數(shù))進(jìn)行比較。
在默認(rèn)狀態(tài)下,字符串比較不區(qū)分大小寫(xiě),并使用現(xiàn)有字符集(默認(rèn)為cp1252 Latin1 ,同時(shí)也適用于英語(yǔ))。
為了達(dá)到比較的目的,可使用CAST()函數(shù)將某個(gè)值轉(zhuǎn)為另外一種類型。使用CONVERT()可以將字符串值轉(zhuǎn)為不同的字符集。
下面對(duì)各類操作符的使用進(jìn)行示例:
= 等于:
mysql> SELECT 1 = 0;
mysql> SELECT '0' = 0;
mysql> SELECT '0.01' = 0;
對(duì)于行比較,(a, b) = (x, y)相當(dāng)于:(a = x) AND (b = y)。
<=> 空值安全的等號(hào):
這個(gè)操作符與= 操作符執(zhí)行相同的比較操作,不過(guò)在兩個(gè)操作碼均為NULL 時(shí),其返回至為1 而不為NULL ,而當(dāng)一個(gè)操作碼為NULL 時(shí),其所得值為0 而不為NULL 。
mysql> SELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL;
mysql> SELECT 1 = 1, NULL = NULL, 1 = NULL;
對(duì)于行比較,(a, b) <=> (x, y)相當(dāng)于:(a <=> x) AND (b <=> y)。
<> 或 != 不等于:
mysql> SELECT '.01' <> '0.01';
mysql> SELECT .01 <> '0.01';
mysql> SELECT 'zapp' <> 'zappp';
對(duì)于行比較,(a, b) <> (x, y)相當(dāng)于:(a <> x) OR (b <> y)。
<=< code=""> 小于等于:
mysql> SELECT 0.1 <= 2;
對(duì)于行比較,(a, b) <= (x, y)相當(dāng)于:(a <= x) AND (b <= y)。
> 大于:
mysql> SELECT 2 > 2;
對(duì)于行比較,(a, b) > (x, y)相當(dāng)于:(a > x) AND (b > y)。
IS boolean_value 和IS NOT boolean_value :根據(jù)一個(gè)布爾值來(lái)檢驗(yàn)一個(gè)值,在這里,布爾值可以是TRUE 、FALSE 或UNKNOWN 。
mysql> SELECT 1 IS TRUE, 0 IS FALSE, NULL IS UNKNOWN;
mysql> SELECT 1 IS NOT UNKNOWN, 0 IS NOT UNKNOWN, NULL IS NOT UNKNOWN;
# IS NULL 和 IS NOT NULL 檢驗(yàn)一個(gè)值是否為 NULL。
mysql> SELECT 1 IS NULL, 0 IS NULL, NULL IS NULL;
mysql> SELECT 1 IS NOT NULL, 0 IS NOT NULL, NULL IS NOT NULL;
expr BETWEEN min AND max 假如expr 大于或等于min 且expr 小于或等于max , 則BETWEEN 的返回值為1 ,否則是0 。若所有參數(shù)都是同一類型,則上述關(guān)系相當(dāng)于表達(dá)式 :min <= expr="" and="" <="max。其它類型的轉(zhuǎn)換 根據(jù)本章開(kāi)篇所述規(guī)律進(jìn)行,且適用于3種參數(shù)中任意一種。
mysql> SELECT 1 BETWEEN 2 AND 3;
mysql> SELECT 'b' BETWEEN 'a' AND 'c';
mysql> SELECT 2 BETWEEN 2 AND '3';
expr NOT BETWEEN min AND max 這相當(dāng)于NOT(expr BETWEEN min AND max) 。
COALESCE(value,...) 返回參數(shù)列表當(dāng)中的第一個(gè)非NULL 值,在沒(méi)有非NULL 值的情況下返回值為NULL 。
mysql> SELECT COALESCE(NULL,1);
mysql> SELECT COALESCE(NULL,NULL,NULL);
GREATEST(value1,value2,...) 當(dāng)有2個(gè)或2個(gè)以上參數(shù)時(shí),返回值為最大(最大值的)參數(shù)。比較參數(shù)所依據(jù)的規(guī)律同LEAST()相同。
mysql> SELECT GREATEST(2,0);
mysql> SELECT GREATEST('B','A','C');
在所有參數(shù)為NULL 的情況下,GREATEST() 的返回值為NULL 。
expr IN (value,...) 若expr 為IN 列表中的任意一個(gè)值,則其返回值為1 , 否則返回值為0 。假如所有的值都是常數(shù),則其計(jì)算和分類根據(jù) expr 的類型進(jìn)行。這時(shí),使用二分搜索來(lái)搜索信息。如果IN 值列表全部由常數(shù)組成,則意味著IN 的速度非???。如果expr 是一個(gè)區(qū)分大小寫(xiě)的字符串表達(dá)式,則字符串比較也按照區(qū)分大小寫(xiě)的方式進(jìn)行。
mysql> SELECT 2 IN (0,3,5,'wefwf');
mysql> SELECT 'wefwf' IN (0,3,5,'wefwf');
嘗試輸入上述語(yǔ)句并分析結(jié)果,思考第二條語(yǔ)句的可行性。
IN 列表中所列值的個(gè)數(shù)僅受限于max_allowed_packet 值。
為了同SQL 標(biāo)準(zhǔn)相一致,在左側(cè)表達(dá)式為NULL 的情況下,或是表中找不到匹配項(xiàng)或是表中一個(gè)表達(dá)式為NULL 的情況下,IN 的返回值均為NULL 。
IN() 語(yǔ)法也可用于書(shū)寫(xiě)某些類型的子查詢。
expr NOT IN (value,...) 這與NOT (expr IN (value,...)) 相同。
ISNULL(expr) 如果expr 為NULL ,那么ISNULL() 的返回值為1 ,否則返回值為0 。
mysql> SELECT ISNULL(1+1);
mysql> SELECT ISNULL(1/0);
通常使用ISNULL()來(lái)判斷一個(gè)值是否為NULL 。(使用= 比較符對(duì)比一個(gè)值與NULL 值是錯(cuò)誤的)。
INTERVAL(N,N1,N2,N3,...) 假如N < N1 ,則返回值為0 ;假如N < N2 等,則返回值為1 ;假如N 為NULL,則返回值為-1 。所有的參數(shù)均按照整數(shù)處理。為了這個(gè)函數(shù)的正確運(yùn)行,必須滿足N1 < N2 < N3 < ……< Nn 。其原因是使用了二分查找(極快速)。
mysql> SELECT INTERVAL(23, 1, 15, 17, 30, 44, 200);
mysql> SELECT INTERVAL(10, 1, 10, 100, 1000);
mysql> SELECT INTERVAL(22, 23, 30, 44, 200);
1.4 邏輯操作符
在SQL中,所有邏輯操作符的計(jì)算所得結(jié)果均為TRUE 、FALSE 或NULL (UNKNOWN )。在MySQL中,它們的表達(dá)形式為1 (TRUE) 、 0 (FALSE) 和NULL ,這在不同SQL數(shù)據(jù)庫(kù)服務(wù)器上都是通用的,然而有一些服務(wù)器對(duì)TRUE 的返回值可能是任意一個(gè)非零值。
NOT ,! :邏輯NOT 。
當(dāng)操作數(shù)為0 時(shí),所得值為1 ;當(dāng)操作數(shù)為非零值時(shí),所得值為0 ,而當(dāng)操作數(shù)為NOT NULL 時(shí),所得的返回值為NULL 。
mysql> SELECT NOT 10;
mysql> SELECT NOT 0;
mysql> SELECT NOT NULL;
mysql> SELECT ! (1+1);
mysql> SELECT ! 1+1;
嘗試運(yùn)行上面的語(yǔ)句,發(fā)現(xiàn)最后一個(gè)例子產(chǎn)生的結(jié)果為 1 ,原因是表達(dá)式的計(jì)算方式和(!1)+1 相同。
AND ,&& :邏輯AND 。
當(dāng)所有操作數(shù)均為非零值、并且不為NULL 時(shí),計(jì)算所得結(jié)果為1 ,當(dāng)一個(gè)或多個(gè)操作數(shù)為0 時(shí),所得結(jié)果為0 ,其余情況返回值為NULL 。
mysql> SELECT 1 && 1;
mysql> SELECT 1 && 0;
mysql> SELECT 1 && NULL;
mysql> SELECT 0 && NULL;
OR ,|| :邏輯OR 。
當(dāng)兩個(gè)操作數(shù)均為非NULL 值時(shí),如有任意一個(gè)操作數(shù)為非零值,則結(jié)果為1 ,否則結(jié)果為0 。當(dāng)有一個(gè)操作數(shù)為NULL 時(shí),如另一個(gè)操作數(shù)為非零值,則結(jié)果為1 ,否則結(jié)果為NULL 。假如兩個(gè)操作數(shù)均為NULL ,則所得結(jié)果為NULL 。
mysql> SELECT 1 || 1;
mysql> SELECT 1 || 0;
mysql> SELECT 0 || 0;
mysql> SELECT 0 || NULL;
mysql> SELECT 1 || NULL;
XOR :邏輯XOR 。
當(dāng)任意一個(gè)操作數(shù)為NULL 時(shí),返回值為NULL 。對(duì)于非NULL 的操作數(shù),假如有奇數(shù)個(gè)操作數(shù)為非零值,則計(jì)算所得結(jié)果為 1 ,否則為 0 。
mysql> SELECT 1 XOR 1;
mysql> SELECT 1 XOR 0;
mysql> SELECT 1 XOR NULL;
mysql> SELECT 1 XOR 1 XOR 1;
a XOR b 的計(jì)算等同于(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
在上面第一條語(yǔ)句返回的是value=compare-value 的結(jié)果。而第二條語(yǔ)句的返回結(jié)果是第一條語(yǔ)句的真正的結(jié)果。如果沒(méi)有匹配的結(jié)果值,則返回結(jié)果為ELSE 語(yǔ)句后的結(jié)果,如果沒(méi)有ELSE 部分,則返回值為NULL 。
mysql> SELECT CASE 1 WHEN 1 THEN 'one'
-> WHEN 2 THEN 'two' ELSE 'more' END;
mysql> SELECT CASE WHEN 1>0 THEN 'true' ELSE 'false' END;
mysql> SELECT CASE BINARY 'B'
-> WHEN 'a' THEN 1 WHEN 'b' THEN 2 END;
一個(gè)CASE 表達(dá)式的默認(rèn)返回值類型是任何返回值的兼容類型,但具體情況視其所在語(yǔ)境而定。如果用在字符串語(yǔ)境中,則返回結(jié)果為字符串類型。如果用在數(shù)字語(yǔ)境中,則返回結(jié)果為十進(jìn)制值、實(shí)數(shù)值或整數(shù)值。
IF(expr1,expr2,expr3)
如果expr1 是TRUE(expr1 <> 0 and expr1 <> NULL) ,則IF() 的返回值為expr2 ; 否則返回值則為expr3 。IF() 的返回值是否為數(shù)字值或字符串值,具體情況視其所在語(yǔ)境而定。
mysql> SELECT IF(1>2,2,3);
mysql> SELECT IF(1<2,'yes ','no');
mysql> SELECT IF(STRCMP('test','test1'),'no','yes');
如果expr2 或expr3 中只有一個(gè)表達(dá)式是NULL 值,則IF() 函數(shù)的結(jié)果類型 為非NULL 表達(dá)式的結(jié)果類型。
expr1 必須作為一個(gè)整數(shù)值進(jìn)行評(píng)估,也就是說(shuō),假如你正在驗(yàn)證浮點(diǎn)值或字符串值,那么應(yīng)該使用比較運(yùn)算進(jìn)行檢驗(yàn)。
mysql> SELECT IF(0.1,1,0);
-> 1
mysql> SELECT IF(0.1<>0,1,0);
-> 1
觀察并對(duì)比上述語(yǔ)句的返回結(jié)果,發(fā)現(xiàn)在上述的第一個(gè)例子中,IF(0.1) 的返回值為1 ,原因是IF(0.1) 檢驗(yàn)為真。在第二個(gè)例子中,比較檢驗(yàn)了原始浮點(diǎn)值,目的是為了了解是否其為非零值,對(duì)比的結(jié)果是0.1 確實(shí)不等于0 ,那么第一個(gè)表達(dá)式的結(jié)果就是整數(shù)1 ,因此返回結(jié)果為1 。
IF() (這一點(diǎn)在其被儲(chǔ)存到臨時(shí)表時(shí)很重要)的默認(rèn)返回值類型按照以下方式計(jì)算:
假如expr2 和expr3 都是字符串類型,且其中任何一個(gè)字符串區(qū)分大小寫(xiě),則返回結(jié)果都是區(qū)分大小寫(xiě)。
IFNULL(expr1,expr2)
假如expr1 不為NULL ,則IFNULL() 的返回值為 expr1 ;否則其返回值為expr2 。IFNULL() 的返回值是否為數(shù)字或是字符串,具體情況取決于其所使用的語(yǔ)境。
mysql> SELECT IFNULL(1,0);
mysql> SELECT IFNULL(NULL,10);
mysql> SELECT IFNULL(1/0,10);
IFNULL(expr1,expr2) 的默認(rèn)結(jié)果值為兩個(gè)表達(dá)式中數(shù)據(jù)類型更加“通用”的一個(gè),順序?yàn)?code>STRING、REAL 或INTEGER 。假設(shè)有一個(gè)表中含有該表達(dá)式,或MySQL必須在內(nèi)存儲(chǔ)器中儲(chǔ)存IFNULL()的返回值到一個(gè)臨時(shí)表中:
CREATE TABLE tmp SELECT IFNULL(1,'test') AS test;
DESCRIBE tmp;
在這個(gè)例子中,測(cè)試列的類型為字符串類型CHAR(4) 。
NULLIF(expr1,expr2)
如果expr1 = expr2 成立,那么返回值為NULL ,否則返回值為expr1 。這和CASE WHEN expr1 = expr2 THEN NULL ELSE expr1 END 語(yǔ)句的原理相同。
mysql> SELECT NULLIF(1,1);
mysql> SELECT NULLIF(1,2);
注意:如果參數(shù)不相等,則MySQL會(huì)評(píng)估expr1 兩次。
三、字符串函數(shù)
如果字符串函數(shù)返回結(jié)果的長(zhǎng)度大于max_allowed_packet 系統(tǒng)變量的最大值時(shí),字符串值函數(shù)的返回值為NULL。
對(duì)于在字符串上操作的函數(shù),第一個(gè)位置的編號(hào)為 1。
ASCII(str)
返回值為字符串str 的最左字符的數(shù)值。假如str 為空字符串,則返回值為 0 。假如str 為NULL ,則返回值為NULL 。ASCII() 用于從0 到255 的 數(shù)值的字符。
mysql> SELECT ASCII('2');
mysql> SELECT ASCII(2);
mysql> SELECT ASCII('dx');
更多疑問(wèn)見(jiàn)ORD()函數(shù)。
-BIN(N)
返回值為N 的二進(jìn)制值的字符串表示,其中N 為一個(gè)longlong (BIGINT) 型數(shù)字。等同于CONV(N,10,2)。假如N 為NULL ,則返回值為NULL 。
mysql> SELECT BIN(12);
BIT_LENGTH(str)
返回值為二進(jìn)制的字符串str 長(zhǎng)度。
mysql> SELECT BIT_LENGTH('text');
CHAR(N,... [USING charset])
CHAR() 將每個(gè)參數(shù)N 理解為一個(gè)整數(shù),其返回值為一個(gè)由這些參數(shù)轉(zhuǎn)換為字符后組成的字符串。其中NULL 值被省略。
mysql> SELECT CHAR(77,121,83,81,'76');
mysql> SELECT CHAR(77,77.3,'77.3');
大于255 的CHAR() 參數(shù)被轉(zhuǎn)換為多個(gè)字符。 例如,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() 的返回值為一個(gè)二進(jìn)制字符串??蛇x擇使用USING 語(yǔ)句產(chǎn)生一個(gè)給定的字符集中的字符串:
mysql> SELECT CHARSET(CHAR(0x65)), CHARSET(CHAR(0x65 USING utf8));
mysql> SELECT CHARSET(CHAR(0x65)), CHARSET(CHAR(0x65 USING utf8));
如果USING 已經(jīng)被給定,而結(jié)果字符串不符合給出的字符集,則會(huì)發(fā)出警告。同樣,如果嚴(yán)格的SQL模式被激活,則CHAR() 的結(jié)果會(huì)是NULL 。
CHAR_LENGTH(str)
返回值為字符串str 的長(zhǎng)度,長(zhǎng)度單位為字符,一個(gè)多字節(jié)字符算作一個(gè)單字符。對(duì)于一個(gè)包含五個(gè)二字節(jié)字符集,LENGTH() 返回值為10 ,而CHAR_LENGTH() 的返回值為5。
CHARACTER_LENGTH(str)
CHARACTER_LENGTH() 等價(jià)于CHAR_LENGTH() 。
CONCAT(str1,str2,...)
返回結(jié)果為連接參數(shù)產(chǎn)生的字符串。如有任何一個(gè)參數(shù)為NULL ,則返回值為 NULL 。 如果所有參數(shù)均為非二進(jìn)制字符串,則結(jié)果為非二進(jìn)制字符串。 如果自變量中含有任一個(gè)二進(jìn)制字符串,則結(jié)果為一個(gè)二進(jìn)制字符串。一個(gè)數(shù)字參數(shù)將被轉(zhuǎn)化為與之相等的二進(jìn)制字符串格式;若要避免這種情況,可使用顯式類型cast 轉(zhuǎn)換, 例如:
SELECT CONCAT(CAST(int_col AS CHAR), char_col)
mysql> SELECT CONCAT('My', 'S', 'QL');
mysql> SELECT CONCAT('My', NULL, 'QL');
mysql> SELECT CONCAT(14.3);
CONCAT_WS(separator,str1,str2,...)
CONCAT_WS() 代表CONCAT With Separator (使用分隔符連接),是CONCAT() 的特殊形式。 第一個(gè)參數(shù)是其它參數(shù)的分隔符。分隔符的位置放在要連接的兩個(gè)字符串之間。分隔符可以是一個(gè)字符串,也可以是其它參數(shù)。如果分隔符為 NULL ,則結(jié)果為NULL 。函數(shù)會(huì)忽略任何分隔符參數(shù)后的NULL 值。
mysql> SELECT CONCAT_WS(',','First name','Second name','Last Name');
mysql> SELECT CONCAT_WS(',','First name',NULL,'Last Name');
CONCAT_WS() 不會(huì)忽略任何空字符串。 (然而會(huì)忽略所有的NULL )。
ELT(N,str1,str2,str3,...)
若N = 1 ,則返回值為str1 ,若N = 2 ,則返回值為tr2 ,以此類推。 若N 小于1 或大于參數(shù)的數(shù)目,則返回值為NULL (突然覺(jué)得這個(gè)函數(shù)好神奇)。
mysql> SELECT ELT(1, 'ej', 'Heja', 'hej', 'foo');
mysql> SELECT ELT(4, 'ej', 'Heja', 'hej', 'foo');
EXPORT_SET(bits,on,off[,separator[,number_of_bits]])
返回值為字符串。bits 中的比特值按照從右到左的順序接受檢驗(yàn) (低位比特到高位比特的順序)。字符串被分隔字符串分開(kāi)(默認(rèn)為逗號(hào)','),按照從左到右的順序被添加到結(jié)果中。其中number_of_bits 會(huì)給出被檢驗(yàn)的二進(jìn)制位數(shù) (默認(rèn)為64 )。
mysql> SELECT EXPORT_SET(5,'Y','N',',',4);
mysql> SELECT EXPORT_SET(6,'1','0',',',10);
FIELD(str,str1,str2,str3,...)
返回值為str1, str2,str3,…… 列表中的str 所在位置。在找不到str 的情況下,返回值為0 。如果所有FIELD() 的參數(shù)均為字符串,則所有參數(shù)均按照字符串進(jìn)行比較。如果所有的參數(shù)均為數(shù)字,則按照數(shù)字進(jìn)行比較。否則,參數(shù)按照雙精度類型進(jìn)行比較。如果str 為NULL 值,則返回值為0 ,原因是NULL 不能同任何值進(jìn)行同等比較。
mysql> SELECT FIELD('ej', 'Hej', 'ej', 'Heja', 'hej', 'foo');
mysql> SELECT FIELD('fo', 'Hej', 'ej', 'Heja', 'hej', 'foo');
FIND_IN_SET(str,strlist)
假如字符串str 在由N 子字符串組成的字符串列表strlist 中,則返回值的范圍在1 到N 之間。一個(gè)字符串列表就是一個(gè)由一些被‘,’符號(hào)分開(kāi)的子字符串組成的字符串。如果第一個(gè)參數(shù)是一個(gè)常數(shù)字符串,而第二個(gè)是SET類型的數(shù)據(jù),則FIND_IN_SET() 函數(shù)將被使用比特計(jì)算優(yōu)化。如果str 不在strlist 或strlist 為空字符串,則返回值為0 。如果任意一個(gè)參數(shù)為NULL ,則返回值為NULL 。 該函數(shù)在第一個(gè)參數(shù)就包含逗號(hào)(‘,’)時(shí)將無(wú)法正常運(yùn)行。
mysql> SELECT FIND_IN_SET('b','a,b,c,d');
FORMAT(X,D)
將數(shù)字X 的格式設(shè)置為'#,###,###.##',以四舍五入的方式保留到小數(shù)點(diǎn)后D位, 返回結(jié)果為一個(gè)字符串。
HEX(N_or_S)
如果N_OR_S 是一個(gè)數(shù)字,則返回一個(gè)十六進(jìn)制值N 的字符串表示,其中,N 是一個(gè)longlong (也就是BIGINT )類型的數(shù)。如果N_OR_S 是一個(gè)字符串,則返回值為一個(gè)N_OR_S 的十六進(jìn)制字符串表示,其中字符串N_OR_S 里的每個(gè)字符都被轉(zhuǎn)化為兩個(gè)十六進(jìn)制數(shù)字。
mysql> SELECT HEX(255);
mysql> SELECT 0x616263;
mysql> SELECT HEX('abc');
INSERT(str,pos,len,newstr)
返回字符串str 中起始于pos 位置被字符串newstr 替換長(zhǎng)度為len 后的字符串。如果pos 不在字符串長(zhǎng)度范圍內(nèi),則返回值為原始字符串。 假如len 的長(zhǎng)度大于剩下的字符串的長(zhǎng)度,則從位置pos 開(kāi)始替換。若任何一個(gè)參數(shù)為null ,則返回值為NULL 。
mysql> SELECT INSERT('Quadratic', 3, 4, 'What');
mysql> SELECT INSERT('Quadratic', -1, 4, 'What');
mysql> SELECT INSERT('Quadratic', 3, 100, 'What');
INSTR(str,substr)
返回字符串str 中子字符串substr 第一次出現(xiàn)的位置。
mysql> SELECT INSTR('foobarbar', 'bar');
mysql> SELECT INSTR('xbar', 'foobar');
LEFT(str,len)
返回從字符串str 左邊數(shù)前len 個(gè)字符。
mysql> SELECT LEFT('foobarbar', 5);
LENGTH(str)
返回值為字符串str 的長(zhǎng)度,單位為字節(jié)。對(duì)于一個(gè)包含5 個(gè)2 字節(jié)字符的字符串,LENGTH() 的返回值為10 ,而CHAR_LENGTH() 的返回值則為5 。
mysql> SELECT LENGTH('text');
LOAD_FILE(file_name)
讀取文件并將這一文件按照字符串的格式返回。文件的位置必須在服務(wù)器上,你必須為文件制定路徑全名,而且你還必須擁有FILE權(quán)限。文件必須可讀,文件容量必須小于max_allowed_packet 字節(jié)。若文件不存在,或因不滿足上述條件而不能被讀取,函數(shù)返回值為 NULL。
mysql> UPDATE tbl_name
-> SET blob_column=LOAD_FILE('/tmp/picture')
-> WHERE id=1;
LOCATE(substr,str)
LOCATE(substr,str,pos) 在沒(méi)有參數(shù)pos 時(shí),返回為字符串str 中子字符串substr 的第一次出現(xiàn)的位置。反之,返回字符串str 中以起始位置為pos 開(kāi)始的子字符串substr 的第一次出現(xiàn)的位置。如若substr 不在str 中,則返回值為0 。
mysql> SELECT LOCATE('bar', 'foobarbar');
mysql> SELECT LOCATE('xbar', 'foobar');
mysql> SELECT LOCATE('bar', 'foobarbar',5);
LOWER(str)
返回字符串str 根據(jù)最新的字符集(默認(rèn)為cp1252 Latin1 )映射表轉(zhuǎn)換為小寫(xiě)字母的字符 。
mysql> SELECT LOWER('QUADRATICALLY');
LPAD(str,len,padstr)
返回字符串str 的左邊由字符串padstr 填補(bǔ)到len 字符長(zhǎng)度后的字符串。假如str 的長(zhǎng)度大于len , 則返回值從右邊開(kāi)始被縮短至len 字符。
mysql> SELECT LPAD('hi',4,'??');
mysql> SELECT LPAD('hi',1,'??');
LTRIM(str)
返回刪除空格后的字符串str 。
mysql> SELECT LTRIM(' barbar');
MAKE_SET(bits,str1,str2,...)
返回一個(gè)(一個(gè)包含被‘,’號(hào)分開(kāi)的字符串)由在bits 集合中具有相應(yīng)的比特的字符串組成的設(shè)定值。str1 對(duì)應(yīng)比特0 ,str2 對(duì)應(yīng)比特1 ,以此類推。str1, str2,... 中的NULL 值不會(huì)被添加到返回結(jié)果中。
mysql> SELECT MAKE_SET(1,'a','b','c');
mysql> SELECT MAKE_SET(1 | 4,'hello','nice','world');
mysql> SELECT MAKE_SET(1 | 4,'hello','nice',NULL,'world');
mysql> SELECT MAKE_SET(0,'a','b','c');
OCT(N)
返回N 的八進(jìn)制值的字符串表示,其中N 是一個(gè)longlong(BIGINT) 數(shù)。若N 為NULL ,則返回值為NULL 。
mysql> SELECT OCT(12);
OCTET_LENGTH(str) OCTET_LENGTH() 等價(jià)于LENGTH() 。
ORD(str)
若字符串str 的最左邊的字符是一個(gè)多字節(jié)字符,則返回該字符的代碼,代碼的計(jì)算通過(guò)使用以下公式計(jì)算其組成字節(jié)的數(shù)值而得出:
(1st byte code)+(2nd byte code × 256)+(3rd byte code × 256 × 256) ...
如果最左邊的字符不是一個(gè)多字節(jié)字符,那么ORD() 和函數(shù)ASCII() 返回相同的值。
mysql> SELECT ORD('2');
QUOTE(str) 通過(guò)引用字符串str ,產(chǎn)生一個(gè)在SQL語(yǔ)句中可用作完全轉(zhuǎn)義數(shù)據(jù)值的結(jié)果。返回的字符串由單引號(hào)標(biāo)注,每例都帶有單引號(hào)(' )、反斜線符號(hào)(\ )、ASCII NUL 以及前面有反斜線符號(hào)的Control-Z 。如果自變量的值為NULL ,則返回不帶單引號(hào)的單詞NULL 。
mysql> SELECT QUOTE('Don\'t!');
mysql> SELECT QUOTE(NULL);
REPEAT(str,count)
返回一個(gè)由重復(fù)的字符串str 組成的字符串,字符串str 重復(fù)的數(shù)目為count 。若count <= 0<="" code="">,則返回一個(gè)空字符串。若str 或count 為NULL ,則返回NULL 。
mysql> SELECT REPEAT('MySQL', 3);
REPLACE(str,from_str,to_str)
返回所有被字符串to_str 替代成字符串from_str 后的str 。
mysql> SELECT REPLACE('www.', 'w', 'Ww');
REVERSE(str)
返回和字符正常順序相反的str 。
mysql> SELECT REVERSE('abc');
RIGHT(str,len)
返回str 中從最右開(kāi)始數(shù)len個(gè)字符。
mysql> SELECT RIGHT('foobarbar', 4);
SOUNDEX(str)
str 返回一個(gè)soundex字符串。 兩個(gè)具有幾乎同樣發(fā)音的字符串應(yīng)該具有同樣的soundex 字符串。一個(gè)標(biāo)準(zhǔn)的soundex 字符串的長(zhǎng)度為4 個(gè)字符,然而SOUNDEX() 函數(shù)會(huì)返回一個(gè)任意長(zhǎng)度的字符串。可使用SUBSTRING() 來(lái)得到一個(gè)標(biāo)準(zhǔn)soundex 字符串結(jié)果。在str 中,會(huì)忽略所有未按照字母順序排列的字符。所有不在A-Z 范圍之內(nèi)的國(guó)際字母符號(hào)被視為元音字母。
mysql> SELECT SOUNDEX('Hello');
mysql> SELECT SOUNDEX('Quadratically');
注意:這個(gè)函數(shù)執(zhí)行原始的Soundex 算法,而非更加流行的加強(qiáng)版本算法。其區(qū)別在于原始版本首先會(huì)刪去元音,其次是去除重復(fù)字符,而加強(qiáng)版則首先刪去重復(fù)字符,而后刪去元音字符。
SUBSTRING(str,pos) , SUBSTRING(str FROM pos) SUBSTRING(str,pos,len) , SUBSTRING(str FROM pos FOR len)
不帶有len 參數(shù)的情況,返回一個(gè)起始于位置pos 的子字符串;帶有l(wèi)en參數(shù)的情況,返回一個(gè)起始于位置 pos 長(zhǎng)度同len 相同的子字符串;使用 FROM 的格式為標(biāo)準(zhǔn)SQL語(yǔ)法;也可能對(duì)pos 使用一個(gè)負(fù)值,假若這樣,則子字符串的位置起始于字符串結(jié)尾的第pos 個(gè)字符,而不是字符串的開(kāi)頭位置。請(qǐng)輸入以下語(yǔ)句檢驗(yàn)該函數(shù)的結(jié)果:
mysql> SELECT SUBSTRING('Quadratically',5);
mysql> SELECT SUBSTRING('foobarbar' FROM 4);
mysql> SELECT SUBSTRING('Quadratically',5,6);
mysql> SELECT SUBSTRING('Sakila', -3);
mysql> SELECT SUBSTRING('Sakila', -5, 3);
mysql> SELECT SUBSTRING('Sakila' FROM -4 FOR 2);
注意:如果len 使用的是一個(gè)小于1 的值,則結(jié)果始終為空字符串。
SUBSTRING_INDEX(str,delim,count)
若count 為正值,則返回str 中第count 個(gè)定界符delim (從左邊開(kāi)始)左邊的一切內(nèi)容。若count 為負(fù)值,則返回定界符(從右邊開(kāi)始)右邊的一切內(nèi)容。
mysql> SELECT SUBSTRING_INDEX('www.', '.', 2);
mysql> SELECT SUBSTRING_INDEX('www.', '.', -2);
TRIM([{BOTH | LEADING | TRAILING} [remstr] FROM] str) TRIM(remstr FROM] str)
返回字符串str ,其中所有remstr 前綴或后綴都已被刪除。若分類符BOTH 、LEADING 或TRAILING 中沒(méi)有一個(gè)被指定,則假設(shè)為BOTH 。remstr 為可選項(xiàng),在未指定情況下,刪除空格。
mysql> SELECT TRIM(' bar ');
mysql> SELECT TRIM(LEADING 'x' FROM 'xxxbarxxx');
mysql> SELECT TRIM(BOTH 'x' FROM 'xxxbarxxx');
mysql> SELECT TRIM(TRAILING 'xyz' FROM 'barxxyz');
四、數(shù)值函數(shù)
4.1 算數(shù)操作符
+ 加號(hào):mysql> SELECT 3+5;
- 減號(hào):mysql> SELECT 3-5;
- 負(fù)號(hào):
mysql> SELECT - 2;
注意:若該操作符同一個(gè)BIGINT 同時(shí)使用,則返回值也是一個(gè)BIGINT 。
* 乘號(hào):
mysql> SELECT 3*5;
mysql> SELECT 18014398509481984*18014398509481984.0;
mysql> SELECT 18014398509481984*18014398509481984;
觀察最后一個(gè)表達(dá)式的結(jié)果。原因是整數(shù)相乘的結(jié)果超過(guò)了BIGINT 計(jì)算的 64位范圍。
/ 除號(hào):
mysql> SELECT 3/5;
被零除的結(jié)果為NULL :
mysql> SELECT 102/(1-1);
DIV 整數(shù)除法。
類似于FLOOR() 。
mysql> SELECT 5 DIV 2;
4.2 數(shù)學(xué)函數(shù)
若發(fā)生錯(cuò)誤,所有數(shù)學(xué)函數(shù)會(huì)返回NULL 。
ABS(X)
返回X 的絕對(duì)值。
mysql> SELECT ABS(2);
mysql> SELECT ABS(-32);
該函數(shù)支持使用BIGINT 值。
ACOS(X)
返回X 的反余弦, 即余弦是X 的值。若X 不在-1 到1 的范圍之內(nèi),則返回NULL 。
mysql> SELECT ACOS(1);
mysql> SELECT ACOS(1.0001);
mysql> SELECT ACOS(0);
ATAN(Y,X) , ATAN2(Y,X)
返回兩個(gè)變量X 及Y 的反正切。
mysql> SELECT ATAN(-2,2);
mysql> SELECT ATAN2(PI(),0);
CEILING(X),CEIL(X)
返回不小于X 的最小整數(shù)值。
mysql> SELECT CEILING(1.23);
mysql> SELECT CEIL(-1.23);
CRC32(expr)
計(jì)算循環(huán)冗余碼校驗(yàn)值并返回一個(gè)32 位無(wú)符號(hào)值。若參數(shù)為NULL ,則結(jié)果為NULL 。該參數(shù)應(yīng)為一個(gè)字符串,而且在不是字符串的情況下會(huì)被作為字符串處理(如果必要的話)。
mysql> SELECT CRC32('MySQL');
mysql> SELECT CRC32('mysql');
DEGREES(X)
返回參數(shù)X 由弧度被轉(zhuǎn)化為度以后的值。
mysql> SELECT DEGREES(PI());
mysql> SELECT DEGREES(PI() / 2);
EXP(X) 返回e (自然對(duì)數(shù)的底)的X 乘方后的值。
mysql> SELECT EXP(2);
mysql> SELECT EXP(-2);
mysql> SELECT EXP(0);
FLOOR(X)
返回不大于X 的最大整數(shù)值 。
mysql> SELECT FLOOR(1.23);
mysql> SELECT FLOOR(-1.23);
FORMAT(X,D)
將數(shù)字X 的格式寫(xiě)成'#,###,###.##'格式,且保留小數(shù)點(diǎn)后D 位,而第D 位的保留方式為四舍五入,然后將結(jié)果以字符串的形式返回。
LN(X)
返回X 的自然對(duì)數(shù),即X 相對(duì)于基數(shù)e 的對(duì)數(shù)。
mysql> SELECT LN(2);
mysql> SELECT LN(-2);
該函數(shù)同LOG(X) 具有相同意義。
LOG(X),LOG(B,X)
若只用一個(gè)參數(shù)調(diào)用,該函數(shù)就會(huì)返回X 的自然對(duì)數(shù)。
mysql> SELECT LOG(2);
mysql> SELECT LOG(-2);
若用兩個(gè)參數(shù)進(jìn)行調(diào)用,該函數(shù)會(huì)返回X 對(duì)于任意基數(shù)B 的對(duì)數(shù)。
mysql> SELECT LOG(2,65536);
mysql> SELECT LOG(10,100);
LOG(B,X) 就相當(dāng)于LOG(X) / LOG(B) 。
LOG2(X)
返回X 的基數(shù)為2的對(duì)數(shù)。
mysql> SELECT LOG2(65536);
mysql> SELECT LOG2(-100);
要想查出存儲(chǔ)一個(gè)數(shù)字需要多少個(gè)比特,LOG2() 函數(shù)會(huì)非常有效。這個(gè)函數(shù)相當(dāng)于表達(dá)式LOG(X) / LOG(2) 。
MOD(N,M) , N % M N MOD M
模操作。返回N 被 M 除后的余數(shù)。
mysql> SELECT MOD(234, 10);
mysql> SELECT 253 % 7;
mysql> SELECT MOD(29,9);
mysql> SELECT 29 MOD 9;
MOD() 對(duì)于帶有小數(shù)部分的數(shù)值也起作用,它返回除法運(yùn)算后的精確余數(shù):
mysql> SELECT MOD(34.5,3);
PI()
返回?(pi) 的值。默認(rèn)的顯示小數(shù)位數(shù)是7 位,但是MySQL內(nèi)部可以使用完全雙精度值。
mysql> SELECT PI();
mysql> SELECT PI()+0.000000000000000000;
POW(X,Y) , POWER(X,Y)
返回X 的Y 乘方的結(jié)果值。
mysql> SELECT POW(2,2);
mysql> SELECT POW(2,-2);
RADIANS(X)
返回由度轉(zhuǎn)化為弧度的參數(shù)X , (注意? 弧度等于180 度)。
mysql> SELECT RADIANS(90);
RAND()
RAND(N) 返回一個(gè)范圍在0 到1 之間(即范圍為 0 ≤ v ≤1.0)的隨機(jī)浮點(diǎn)值v 。若已指定一個(gè)整數(shù)參數(shù)N ,則該參數(shù)將被用作種子值,用來(lái)產(chǎn)生重復(fù)序列。
mysql> SELECT RAND();
mysql> SELECT RAND(20);
mysql> SELECT RAND(20);
mysql> SELECT RAND();
若要在i ≤ R ≤ j 這個(gè)范圍得到一個(gè)隨機(jī)整數(shù)R ,需要用到表達(dá)式FLOOR(i + RAND() * (j – i + 1)) 。例如, 若要在7 到 12 的范圍(包括7 和12 )內(nèi)得到一個(gè)隨機(jī)整數(shù), 可使用以下語(yǔ)句:
SELECT FLOOR(7 + (RAND() * 6));
在ORDER BY 語(yǔ)句中,不能使用一個(gè)帶有RAND() 值的列,原因是 ORDER BY 會(huì)計(jì)算列中的重復(fù)數(shù)值。但是也可按照如下的隨機(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 語(yǔ)句中,WHERE 每執(zhí)行一次,RAND() 就會(huì)被再執(zhí)行一次。
RAND() 的作用不是作為一個(gè)精確的隨機(jī)發(fā)生器,而是一種用來(lái)發(fā)生在同樣的MySQL版本的平臺(tái)之間的可移動(dòng)ad hoc 隨機(jī)數(shù)的快速方式。
ROUND(X),ROUND(X,D)
返回與參數(shù)X 最接近的整數(shù)。在有兩個(gè)參數(shù)的情況下,返回保留到小數(shù)點(diǎn)后D 位的X ,而第D 位的保留方式為四舍五入。若要返回保留X 值小數(shù)點(diǎn)左邊的D 位,可將D 設(shè)為負(fù)值。
mysql> SELECT ROUND(-1.23);
mysql> SELECT ROUND(-1.58);
mysql> SELECT ROUND(1.58);
mysql> SELECT ROUND(1.298, 1);
mysql> SELECT ROUND(1.298, 0);
mysql> SELECT ROUND(23.298, -1);
返回值的類型同第一個(gè)參數(shù)類型相同(假設(shè)它是一個(gè)整數(shù)、雙精度數(shù)或小數(shù))。這意味著對(duì)于一個(gè)整數(shù)參數(shù),結(jié)果也是一個(gè)整數(shù)(無(wú)小數(shù)部分)。
ROUND() 在以下情況下依賴于第一個(gè)參數(shù)的類型:
- 對(duì)于準(zhǔn)確值數(shù)字,
ROUND() 使用“四舍五入” 或“舍入成最接近的數(shù)” 的規(guī)則:對(duì)于一個(gè)分?jǐn)?shù)部分為.5 或大于 .5 的值,正數(shù)則上舍入到鄰近的整數(shù)值,負(fù)數(shù)則下舍入臨近的整數(shù)值。(換言之,其舍入的方向是數(shù)軸上遠(yuǎn)離零的方向)。對(duì)于一個(gè)分?jǐn)?shù)部分小于.5 的值,正數(shù)則下舍入下一個(gè)整數(shù)值,負(fù)數(shù)則下舍入鄰近的整數(shù)值,而正數(shù)則上舍入鄰近的整數(shù)值。
- 對(duì)于近似值數(shù)字,其結(jié)果根據(jù) C 庫(kù)而定。在很多系統(tǒng)中,這意味著
ROUND() 的使用遵循“舍入成最接近的偶數(shù)”的規(guī)則: 一個(gè)帶有任何小數(shù)部分的值會(huì)被舍入成最接近的偶數(shù)。 以下舉例說(shuō)明舍入法對(duì)于精確值和近似值的不同之處:
mysql> SELECT ROUND(2.5), ROUND(25E-1);
SIGN(X)
返回參數(shù)X 的符號(hào),該符號(hào)取決于X 的值是否為負(fù)、零或正。
mysql> SELECT SIGN(-32);
mysql> SELECT SIGN(0);
mysql> SELECT SIGN(234);
SQRT(X)
返回非負(fù)數(shù)X 的二次方根。
mysql> SELECT SQRT(4);
mysql> SELECT SQRT(-16);
五、日期和時(shí)間函數(shù)
ADDDATE(date,INTERVAL expr type),ADDDATE(expr,days)
當(dāng)被第二個(gè)參數(shù)INTERVAL 被設(shè)置后,ADDDATE()就是等價(jià)于DATE_ADD() 。
mysql> SELECT DATE_ADD('1998-01-02', INTERVAL 31 DAY);
mysql> SELECT ADDDATE('1998-01-02', INTERVAL 31 DAY);
若days 參數(shù)只是整數(shù)值,則 MySQL 5.1將其作為天數(shù)值添加至expr 。
mysql> SELECT ADDDATE('1998-01-02', 31);
ADDTIME(expr,expr2)
ADDTIME() 將expr2 添加至expr 然后再返回結(jié)果。expr 是一個(gè)時(shí)間或日期表達(dá)式,而expr2 是一個(gè)時(shí)間表達(dá)式。
mysql> SELECT ADDTIME('1997-12-31 23:59:59.999999',
-> '1 1:1:1.000002');
mysql> SELECT ADDTIME('01:00:00.999999', '02:00:00.999998');
CONVERT_TZ(dt,from_tz,to_tz)
CONVERT_TZ() 將時(shí)間日期值dt 從from_tz 給出的時(shí)區(qū)轉(zhuǎn)到to_tz 給出的時(shí)區(qū),然后返回結(jié)果值。在從from_tz 到UTC 的轉(zhuǎn)化過(guò)程中,如果該值超出TIMESTAMP 類型的被支持范圍,那么轉(zhuǎn)化不會(huì)發(fā)生。
mysql> SELECT CONVERT_TZ('2004-01-01 12:00:00','GMT','MET');
mysql> SELECT CONVERT_TZ('2004-01-01 12:00:00','+00:00','+10:00');
注釋:若要使用諸如 MET 或Europe/Moscow 之類指定時(shí)間區(qū),首先要設(shè)置正確的時(shí)區(qū)表。
CURDATE()`
將當(dāng)前日期按照'YYYY-MM-DD' 或YYYYMMDD 格式返回,具體格式根據(jù)函數(shù)用在字符串或是數(shù)字語(yǔ)境中而定。
mysql> SELECT CURDATE();
mysql> SELECT CURDATE() + 0;
CURRENT_DATE,CURRENT_DATE()
CURRENT_DATE 等價(jià)于CURRENT_DATE() ,CURTIME() 將當(dāng)前時(shí)間以'HH:MM:SS' 或HHMMSS 的格式返回, 具體格式根據(jù)函數(shù)用在字符串或是數(shù)字語(yǔ)境中而定。
mysql> SELECT CURTIME();
mysql> SELECT CURTIME() + 0;
DATEDIFF(expr,expr2)
DATEDIFF() 返回起始時(shí)間expr 和結(jié)束時(shí)間expr2 之間的天數(shù)。Expr 和expr2 為日期或date-and-time 表達(dá)式。計(jì)算中只用到這些值的日期部分。
mysql> SELECT DATEDIFF('1997-12-31 23:59:59','1997-12-30');
mysql> SELECT DATEDIFF('1997-11-30 23:59:59','1997-12-31');
DATE_ADD(date,INTERVAL expr type),DATE_SUB(date,INTERVAL expr type)
這些函數(shù)執(zhí)行日期運(yùn)算。 date 是一個(gè)DATETIME 或DATE 值,用來(lái)指定起始時(shí)間。expr 是一個(gè)表達(dá)式,用來(lái)指定從起始日期添加或減去的時(shí)間間隔值。 Expr 是一個(gè)字符串;對(duì)于負(fù)值的時(shí)間間隔,它可以以一個(gè)'-' 開(kāi)頭。 type 為關(guān)鍵詞,它指示了表達(dá)式被解釋的方式。
關(guān)鍵詞INTERVA 及type 分類符均不區(qū)分大小寫(xiě)。
下表顯示了type 和expr 參數(shù)的關(guān)系:
MySQL 允許任何expr 格式中的標(biāo)點(diǎn)分隔符,表中所顯示的是建議的分隔符。若date 參數(shù)是一個(gè)DATE 類型的 值,那么計(jì)算只會(huì)包括YEAR 、MONTH 和DAY 部分(即沒(méi)有時(shí)間部分),其結(jié)果也是一個(gè)DATE 類型的 值。否則,結(jié)果將是一個(gè)DATETIME 類型值。
若位于另一端的表達(dá)式是一個(gè)日期或日期時(shí)間值 , 則INTERVAL expr type 只允許出現(xiàn)在+ 操作符的兩端。對(duì)于 – 操作符, INTERVAL expr type 只允許在其右端,原因是從一個(gè)時(shí)間間隔中提取一個(gè)日期或日期時(shí)間值是毫無(wú)意義的(見(jiàn)下面的例子)。
mysql> SELECT '1997-12-31 23:59:59' + INTERVAL 1 SECOND;
mysql> SELECT INTERVAL 1 DAY + '1997-12-31';
mysql> SELECT '1998-01-01' - INTERVAL 1 SECOND;
mysql> SELECT DATE_ADD('1997-12-31 23:59:59',
-> INTERVAL 1 SECOND);
mysql> SELECT DATE_ADD('1997-12-31 23:59:59',
-> INTERVAL 1 DAY);
mysql> SELECT DATE_ADD('1997-12-31 23:59:59',
-> INTERVAL '1:1' MINUTE_SECOND);
mysql> SELECT DATE_SUB('1998-01-01 00:00:00',
-> INTERVAL '1 1:1:1' DAY_SECOND);
mysql> SELECT DATE_ADD('1998-01-01 00:00:00',
-> INTERVAL '-1 10' DAY_HOUR);
mysql> SELECT DATE_SUB('1998-01-02', INTERVAL 31 DAY);
mysql> SELECT DATE_ADD('1992-12-31 23:59:59.000002',
-> INTERVAL '1.999999' SECOND_MICROSECOND);
若你指定了一個(gè)過(guò)于短的時(shí)間間隔值(不包括type 關(guān)鍵詞所預(yù)期的所有時(shí)間間隔部分), MySQL 會(huì)假定你已經(jīng)省去了時(shí)間間隔值的最左部分。 例如,你指定了一種類型的DAY_SECOND ,expr 的值應(yīng)當(dāng)具有天、 小時(shí)、分鐘和秒部分。若你指定了一個(gè)類似'1:10' 的值, MySQL會(huì)假定天和小時(shí)部分不存在,那么這個(gè)值代表分和秒。
假如你對(duì)一個(gè)日期值添加或減去一些含有時(shí)間部分的內(nèi)容,則結(jié)果自動(dòng)轉(zhuǎn)化為一個(gè)日期時(shí)間值:
mysql> SELECT DATE_ADD('1999-01-01', INTERVAL 1 DAY);
mysql> SELECT DATE_ADD('1999-01-01', INTERVAL 1 HOUR);
假如你使用了格式嚴(yán)重錯(cuò)誤的日期,則結(jié)果為NULL 。假如你添加了MONTH 、YEAR_MONTH 或YEAR ,而結(jié)果日期中有一天的日期大于添加的月份的日期最大限度,則這個(gè)日期自動(dòng)被調(diào)整為添加該月份的最大日期:
mysql> SELECT DATE_ADD('1998-01-30', INTERVAL 1 MONTH);
DATE_FORMAT(date,format)
根據(jù)format 字符串安排date 值的格式。
注意: 字符% 要求在格式指定符之前。
月份和日期說(shuō)明符的范圍從零開(kāi)始,原因是 MySQL允許存儲(chǔ)諸如 '2004-00-00'這樣的的不完全日期.
mysql> SELECT DATE_FORMAT('1997-10-04 22:23:00', '%W %M %Y');
mysql> SELECT DATE_FORMAT('1997-10-04 22:23:00', '%H:%i:%s');
mysql> SELECT DATE_FORMAT('1997-10-04 22:23:00',
->'%D %y %a %d %m %b %j');
mysql> SELECT DATE_FORMAT('1997-10-04 22:23:00',
-> '%H %k %I %r %T %S %w');
mysql> SELECT DATE_FORMAT('1999-01-01', '%X %V');
DAYNAME(date)
返回date 對(duì)應(yīng)的工作日名稱。
mysql> SELECT DAYNAME('1998-02-05');
EXTRACT(type FROM date)
EXTRACT() 函數(shù)所使用的時(shí)間間隔類型說(shuō)明符同DATE_ADD() 或ATE_SUB() 的相同,但它從日期中提取其部分,而不是執(zhí)行日期運(yùn)算。
mysql> SELECT EXTRACT(YEAR FROM '1999-07-02');
mysql> SELECT EXTRACT(YEAR_MONTH FROM '1999-07-02 01:02:03');
mysql> SELECT EXTRACT(MICROSECOND
-> FROM '2003-01-02 10:30:00.00123');
FROM_DAYS(N)
給定一個(gè)天數(shù)N ,返回一個(gè)DATE 類型的值。
mysql> SELECT FROM_DAYS(729669);
注意:使用FROM_DAYS() 處理古老日期時(shí),務(wù)必謹(jǐn)慎。它并不用于處理陽(yáng)歷出現(xiàn)前的日期(1582 )。詳情請(qǐng)參考請(qǐng)MySQL使用什么日歷?。
FROM_UNIXTIME(unix_timestamp) , FROM_UNIXTIME(unix_timestamp,format)
返回'YYYY-MM-DD HH:MM:SS' 或YYYYMMDDHHMMSS 格式值的unix_timestamp 參數(shù)表示,具體格式取決于該函數(shù)是否用在字符串中或是數(shù)字語(yǔ)境中。 若format 已經(jīng)給出,則結(jié)果的格式是根據(jù)format 字符串而定。 format 可以包含同DATE_FORMAT() 函數(shù)輸入項(xiàng)列表中相同的說(shuō)明符。
mysql> SELECT FROM_UNIXTIME(875996580);
mysql> SELECT FROM_UNIXTIME(875996580) + 0;
mysql> SELECT FROM_UNIXTIME(UNIX_TIMESTAMP(),
-> '%Y %D %M %h:%i:%s %x');
GET_FORMAT(DATE|TIME|DATETIME, 'EUR'|'USA'|'JIS'|'ISO'|'INTERNAL')
返回一個(gè)格式字符串。該函數(shù)在同DATE_FORMAT() 及STR_TO_DATE() 函數(shù)結(jié)合時(shí)很有用。 第一個(gè)參數(shù)的3個(gè)可能值和第二個(gè)參數(shù)的5個(gè)可能值產(chǎn)生 15 個(gè)可能格式字符串 (對(duì)于使用的說(shuō)明符,請(qǐng)參見(jiàn)DATE_FORMAT() 函數(shù)說(shuō)明表 )。
其中,ISO 格式為ISO 9075 , 而非ISO 8601 。
DATE_FORMAT() 函數(shù)的第一個(gè)參數(shù)也可以使用TIMESTAMP , 這時(shí)GET_FORMAT() 的返回值和DATETIME 相同。
mysql> SELECT DATE_FORMAT('2003-10-03',GET_FORMAT(DATE,'EUR'));
mysql> SELECT STR_TO_DATE('10.31.2003',GET_FORMAT(DATE,'USA'));
HOUR(time)
返回time 對(duì)應(yīng)的小時(shí)數(shù)。對(duì)于日時(shí)值的返回值范圍是從0 到23 。
mysql> SELECT HOUR('10:05:03');
然而,TIME 值的范圍實(shí)際上非常大, 所以HOUR 可以返回大于23 的值。如:
mysql> SELECT HOUR('272:59:59');
LAST_DAY(date)
獲取一個(gè)日期或日期時(shí)間值,返回該月最后一天對(duì)應(yīng)的值。若參數(shù)無(wú)效,則返回NULL 。
mysql> SELECT LAST_DAY('2003-02-05');
mysql> SELECT LAST_DAY('2004-02-05');
mysql> SELECT LAST_DAY('2004-01-01 01:01:01');
mysql> SELECT LAST_DAY('2003-03-32');
MAKEDATE(year,dayofyear)
給出年份值和一年中的天數(shù),最后返回一個(gè)日期。dayofyear 必須大于0 ,否則結(jié)果為NULL 。
mysql> SELECT MAKEDATE(2001,31), MAKEDATE(2001,32);
mysql> SELECT MAKEDATE(2001,365), MAKEDATE(2004,365);
mysql> SELECT MAKEDATE(2001,0);
MAKETIME(hour,minute,second)
返回由hour 、 minute 和second 參數(shù)計(jì)算得出的時(shí)間值。
mysql> SELECT MAKETIME(12,15,30);
NOW()
返回當(dāng)前日期和時(shí)間值,其格式為'YYYY-MM-DD HH:MM:SS' 或YYYYMMDDHHMMSS , 具體格式取決于該函數(shù)所用處于的字符串或數(shù)字類型語(yǔ)境中。
mysql> SELECT NOW();
mysql> SELECT NOW() + 0;
在一個(gè)存儲(chǔ)程序或觸發(fā)器內(nèi), NOW() 返回一個(gè)常數(shù)時(shí)間,該常數(shù)指示了該程序或觸發(fā)語(yǔ)句開(kāi)始執(zhí)行的時(shí)間。這同SYSDATE() 的運(yùn)行有所不同。
PERIOD_ADD(P,N)
添加 N 個(gè)月至周期P (格式為YYMM 或YYYYMM ),返回值的格式為 YYYYMM 。注意周期參數(shù)P 不是日期值。
mysql> SELECT PERIOD_ADD(9801,2);
PERIOD_DIFF(P1,P2)
返回周期P1 和P2 之間的月份數(shù)。P1 和P2 的格式應(yīng)該為YYMM 或YYYYMM 。注意周期參數(shù)P1 和P2 不是日期值。
mysql> SELECT PERIOD_DIFF(9802,199703);
QUARTER(date)
返回date 對(duì)應(yīng)的一年中的季度值,范圍是從 1到 4。
mysql> SELECT QUARTER('98-04-01');
SEC_TO_TIME(seconds)
返回被轉(zhuǎn)化為小時(shí)、 分鐘和秒數(shù)的seconds參數(shù)值, 其格式為 'HH:MM:SS' 或HHMMSS ,具體格式根據(jù)該函數(shù)是否用在字符串或數(shù)字語(yǔ)境中而定。
mysql> SELECT SEC_TO_TIME(2378);
mysql> SELECT SEC_TO_TIME(2378) + 0;
UNIX_TIMESTAMP(), UNIX_TIMESTAMP(date)
若無(wú)參數(shù)調(diào)用,則返回一個(gè)Unix timestamp ('1970-01-01 00:00:00' GMT 時(shí)間之后的秒數(shù)) 作為無(wú)符號(hào)整數(shù)。若用date 參數(shù)來(lái)調(diào)用UNIX_TIMESTAMP() ,它會(huì)將參數(shù)值以'1970-01-01 00:00:00' GMT后的秒數(shù)的形式返回。date 可以是一個(gè)DATE 類型的 字符串、一個(gè) DATETIME 類型的字符串、一個(gè) TIMESTAMP 或一個(gè)當(dāng)?shù)貢r(shí)間的YYMMDD 或YYYMMDD 格式的數(shù)字。
mysql> SELECT UNIX_TIMESTAMP();
mysql> SELECT UNIX_TIMESTAMP('1997-10-04 22:23:00');
當(dāng) UNIX_TIMESTAMP 被用在 TIMESTAMP 列時(shí), 函數(shù)直接返回內(nèi)部時(shí)戳值, 而不進(jìn)行任何隱含的 “string-to-Unix-timestamp” 轉(zhuǎn)化。假如你向UNIX_TIMESTAMP() 傳遞一個(gè)溢出日期,它會(huì)返回 0 ,但請(qǐng)注意只有一般的時(shí)間范圍生效(年份從1970 到2037 , 月份從01 到12 ,日期從01 到31 )。
UTC_DATE, UTC_DATE()
返回當(dāng)前UTC 日期值,其格式為'YYYY-MM-DD' 或 YYYYMMDD ,具體格式取決于函數(shù)是否用在字符串或數(shù)字語(yǔ)境中。
mysql> SELECT UTC_DATE(), UTC_DATE() + 0;
UTC_TIME, UTC_TIME()
返回當(dāng)前 UTC 值,其格式為 'HH:MM:SS' 或HHMMSS ,具體格式根據(jù)該函數(shù)是否用在字符串或數(shù)字語(yǔ)境而定。
mysql> SELECT UTC_TIME(), UTC_TIME() + 0;
WEEK(date[,mode])
該函數(shù)返回date 對(duì)應(yīng)的星期數(shù)。WEEK() 的雙參數(shù)形式允許你指定該星期是否起始于周日或周一, 以及返回值的范圍是否為從0 到53 或從1 到53 。若 mode 參數(shù)被省略,則使用default_week_format 系統(tǒng)值。請(qǐng)參見(jiàn)服務(wù)器系統(tǒng)變量。
下表說(shuō)明了mode 參數(shù)的工作過(guò)程:
mysql> SELECT WEEK('1998-02-20');
mysql> SELECT WEEK('1998-02-20',0);
mysql> SELECT WEEK('1998-02-20',1);
mysql> SELECT WEEK('1998-12-31',1);
注意:假如有一個(gè)日期位于前一年的最后一周, 若你不使用2 、3 、6 或7 作為mode 參數(shù)選擇,則MySQL返回 0 :
mysql> SELECT YEAR('2000-01-01'), WEEK('2000-01-01',0);
有人或許會(huì)提出意見(jiàn),認(rèn)為 MySQL 對(duì)于WEEK() 函數(shù)應(yīng)該返回 52 ,原因是給定的日期實(shí)際上發(fā)生在1999 年的第52 周。我們決定返回0 作為代替的原因是我們希望該函數(shù)能返回“給定年份的星期數(shù)”。這使得WEEK() 函數(shù)在同其它從日期中抽取日期部分的函數(shù)結(jié)合時(shí)的使用更加可靠。
假如你更希望所計(jì)算的關(guān)于年份的結(jié)果包括給定日期所在周的第一天,則應(yīng)使用0 、2 、5 或7 作為mode 參數(shù)選擇。
mysql> SELECT WEEK('2000-01-01',2);
作為選擇,也可使用 YEARWEEK() 函數(shù):
mysql> SELECT YEARWEEK('2000-01-01');
mysql> SELECT MID(YEARWEEK('2000-01-01'),5,2);
六、全文搜索功能
MATCH (col1,col2,...) AGAINST (expr [IN BOOLEAN MODE | WITH QUERY EXPANSION])
MySQL支持全文索引和搜索功能。
- MySQL中的全文索引是針對(duì)
FULLTEXT 類型的索引。
FULLTEXT 索引僅可用于 MyISAM 表(在MySQL5.6以及以上的版本也可用于InnoDB 表);可以從CHAR 、 VARCHAR 或TEXT 列中作為CREATE TABLE 語(yǔ)句的一部分被創(chuàng)建,或是隨后使用ALTER TABLE 或 CREATE INDEX 添加。對(duì)于較大的數(shù)據(jù)集,將你的資料輸入一個(gè)沒(méi)有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 操作符將后面的字符串轉(zhuǎn)換成一個(gè)二進(jìn)制字符串。這是一種簡(jiǎn)單的方式來(lái)促使逐字節(jié)而不是逐字符的進(jìn)行列比較。這使得比較區(qū)分大小寫(xiě),即使該列不被定義為BINARY 或 BLOB 類型。
mysql> SELECT 'a' = 'A';
mysql> SELECT BINARY 'a' = 'A';
mysql> SELECT 'a' = 'a ';
mysql> SELECT BINARY 'a' = 'a ';
在比較運(yùn)算中,BINARY 會(huì)影響整個(gè)操作;它可以在任何操作數(shù)前被給定,而產(chǎn)生相同的結(jié)果。
CAST(expr AS type), CONVERT(expr,type) , CONVERT(expr USING transcoding_name)
CAST() 和CONVERT() 函數(shù)通過(guò)獲取一個(gè)類型的值,轉(zhuǎn)化為另一個(gè)被指定類型的值。
這里的類型可以是以下列表中的任意一個(gè):
BINARY[(N)]
CHAR[(N)]
DATE
DATETIME
DECIMAL
SIGNED[INTEGER]
TIME
UNSIGNED [INTEGER]
其中BINARY 產(chǎn)生一個(gè)二進(jìn)制字符串。
假如給定了隨意長(zhǎng)度N ,則 BINARY[N] 使 cast 使用不多于N 個(gè)字節(jié)的參數(shù)。同樣, CHAR[N] 會(huì)使 cast 使用不多于N 個(gè)字符的參數(shù)。
CAST() and CONVERT(... USING ...) 是標(biāo)準(zhǔn) SQL語(yǔ)法。CONVERT() 的非USING 格式是ofis ODBC 語(yǔ)法。
帶有USING 的CONVERT() 被用來(lái)在不同的字符集之間轉(zhuǎn)化數(shù)據(jù)。在 MySQL中, 自動(dòng)譯碼名和相應(yīng)的字符集名稱相同。例如,以下語(yǔ)句將服務(wù)器的默認(rèn)字符集中的字符串 'abc' 轉(zhuǎn)化為utf8 字符集中相應(yīng)的字符串:
SELECT CONVERT('abc' USING utf8);
當(dāng)你想要在一個(gè)CREATE ... SELECT 語(yǔ)句中創(chuàng)建一個(gè)特殊類型的列時(shí),cast 函數(shù)會(huì)很有用:
CREATE TABLE new_table SELECT CAST('2000-01-01' AS DATE);
該函數(shù)也用于ENUM 列按詞法順序的排序。通常ENUM 列的排序在使用內(nèi)部數(shù)值時(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á)式視為一個(gè)帶有默認(rèn)字符集的字符串。
你不應(yīng)在不同的格式中使用 CAST() 來(lái)析取數(shù)據(jù),但可以使用諸如LEFT() 或 EXTRACT() 這樣的字符串函數(shù)來(lái)代替。
若要在數(shù)值語(yǔ)境中將一個(gè)字符串派給一個(gè)數(shù)值, 通常情況下,除了將字符串值作為數(shù)字使用外,你不需要做任何事:
mysql> SELECT 1+'1';
若要在一個(gè)字符串語(yǔ)境中使用一個(gè)數(shù)字,該數(shù)字會(huì)被自動(dòng)轉(zhuǎn)化為一個(gè)BINARY 字符串。
mysql> SELECT CONCAT('hello you ',2);
八、其他函數(shù)
位函數(shù)
對(duì)于位運(yùn)算,MySQL 使用 BIGINT (64位) 算法,因此這些操作符的最大范圍是 64 位。
| 按位OR :
mysql> SELECT 29 | 15;
& 按位 AND :
mysql> SELECT 29 & 15;
^ 按位XOR :
mysql> SELECT 1 ^ 1;
mysql> SELECT 1 ^ 0;
mysql> SELECT 11 ^ 3;
<< 把一個(gè)longlong (BIGINT) 數(shù)左移兩位。
mysql> SELECT 1 << 2;
> 把一個(gè)longlong (BIGINT) 數(shù)右移兩位。
mysql> SELECT 4 >> 2;
~ 反轉(zhuǎn)所有位。
mysql> SELECT 5 & ~1;
BIT_COUNT(N) 返回參數(shù)N 中所設(shè)置的位的數(shù)量。
mysql> SELECT BIT_COUNT(29);
九、思考與練習(xí)
當(dāng)你看到這一節(jié)的時(shí)候,恭喜你,你已經(jīng)完成了一個(gè)艱巨的任務(wù)!因?yàn)槲以诜g的時(shí)候就知道涉及到的知識(shí)很多,當(dāng)然還有很多函數(shù)沒(méi)有全部寫(xiě)上,既然是參考手冊(cè),不要求你們?nèi)空莆?,只要在需要的時(shí)候查閱即可,但是前提是得掌握一些基本的函數(shù)和操作符的運(yùn)用;因此,希望你們能在實(shí)驗(yàn)樓操作以上函數(shù)或者操作符中感興趣的語(yǔ)句,記得寫(xiě)入實(shí)驗(yàn)報(bào)告讓我瞧瞧你的學(xué)習(xí)狀態(tài)哦~
|