日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

(大数据工程师学习路径)第五步 MySQL参考手册中文版----MySQL函数和操作符

發布時間:2024/1/18 数据库 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 (大数据工程师学习路径)第五步 MySQL参考手册中文版----MySQL函数和操作符 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、操作符

1.1 操作符優先級

以下列表顯示了操作符優先級的由低到高的順序。排列在同一行的操作符具有相同的優先級。

操作符優先級
:=1
||, OR, XOR2
&&, AND3
NOT4
BETWEEN, CASE, WHEN, THEN, ELSE5
=, <=>, >=, >, <=, <, <>, !=, IS, LIKE, REGEXP, IN6
7
&8
<<, >>9
-, +10
*, /, DIV, %, MOD11
^12
- (一元減號), ~ (一元比特反轉)12
!13
BINARY, COLLATE14

注釋:假如 HIGH_NOT_PRECEDENCE SQL 模式被激活,則 NOT 的優先級同 the ! 操作符相同。

1.2 圓括號

( ... )

使用括弧來規定表達式的運算順序,例如:

mysql> SELECT 1+2*3;-> 7 mysql> SELECT (1+2)*3;-> 9

1.3 比較函數和操作符

比較運算產生的結果為1(TRUE)、0 (FALSE)或 NULL。這些運算可用于數字和字符串。根據需要,字符串可自動轉換為數字,而數字也可自動轉換為字符串。

本節中的一些函數 (如LEAST()和GREATEST()) 的所得值不包括 1 (TRUE)、 0 (FALSE)和 NULL。然而,其所得值乃是基于按照下述規則運行的比較運算:

MySQL按照以下規則進行數值比較:

  • 若有一個或兩個參數為 NULL,除非NULL-safe <=> 等算符,則比較運算的結果為NULL。
  • 若同一個比較運算中的兩個參數都是字符串,則按照字符串進行比較。
  • 若兩個參數均為整數,則按照整數進行比較。
  • 十六進制值在不需要作為數字進行比較時,則按照二進制字符串進行處理。
  • 假如參數中的一個為 TIMESTAMP 或 DATETIME 列,而其它參數均為常數, 則在進行比較前將常數轉為 timestamp。這樣做的目的是為了使ODBC的進行更加順利。 注意,這不適合IN()中的參數!為了更加可靠,在進行對比時通常使用完整的 datetime/date/time字符串。
  • 在其它情況下,參數作為浮點數進行比較。

在默認狀態下,字符串比較不區分大小寫,并使用現有字符集(默認為cp1252 Latin1,同時對英語也適合)。

為了進行比較,可使用CAST()函數將某個值轉為另外一種類型。 使用CONVERT()將字符串值轉為不同的字符集。

以下例子說明了比較運算中將字符串轉為數字的過程:

mysql> SELECT 1 > '6x';-> 0 mysql> SELECT 7 > '6x'; -> 1 mysql> SELECT 0 > 'x6'; -> 0 mysql> SELECT 0 = 'x6'; -> 1

注意,在將一個字符串列同一個數字進行比較時, MySQL 不能使用列中的索引進行快速查找。假如str_col 是一個編入索引的字符串列,則在以下語句中,索引不能執行查找功能:

SELECT * FROM tbl_name WHERE str_col=1;

其原因是許多不同的字符串都可被轉換為數值 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.這個操作符和=操作符執行相同的比較操作,不過在兩個操作碼均為NULL時,其所得值為1而不為NULL,而當一個操作碼為NULL時,其所得值為0而不為NULL。

mysql> SELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL; -> 1, 1, 0 mysql> SELECT 1 = 1, NULL = NULL, 1 = NULL; -> 1, NULL, NULL
  • <>?或?!=?不等于:

    mysql> SELECT '.01' <> '0.01';-> 1 mysql> SELECT .01 <> '0.01'; -> 0 mysql> SELECT 'zapp' <> 'zappp'; -> 1
  • <=?小于等于:

mysql> SELECT 0.1 <= 2;-> 1
  • <?小于:

    mysql> SELECT 2 < 2;-> 0
  • >=?大于等于:

    mysql> SELECT 2 >= 2;-> 1
  • >?大于:

    mysql> SELECT 2 > 2;-> 0
  • IS boolean_value?和?IS NOT boolean_value?根據一個布爾值來檢驗一個值,在這里,布爾值可以是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。若所有參數都是同一類型,則上述關系相當于表達式 (min <= expr AND expr <= max)。其它類型的轉換根據本章開篇所述規律進行,且適用于3種參數中任意一種。

    mysql> SELECT 1 BETWEEN 2 AND 3;-> 0 mysql> SELECT 'b' BETWEEN 'a' AND 'c'; -> 1 mysql> SELECT 2 BETWEEN 2 AND '3'; -> 1 mysql> SELECT 2 BETWEEN 2 AND 'x-3'; -> 0
  • expr NOT BETWEEN min AND max?這相當于NOT(expr BETWEEN min AND max)。

  • COALESCE(value,...) 返回值為列表當中的第一個非 NULL值,在沒有非NULL 值得情況下返回值為 NULL 。

    mysql> SELECT COALESCE(NULL,1);-> 1 mysql> SELECT COALESCE(NULL,NULL,NULL); -> NULL
  • GREATEST(value1,value2,...)?當有2或多個參數時,返回值為最大(最大值的)參數。比較參數所依據的規律同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。假如所有的值都是常數,則其計算和分類根據 expr 的類型進行。這時,使用二分搜索來搜索信息。如IN值列表全部由常數組成,則意味著IN 的速度非常之快。如expr 是一個區分大小寫的字符串表達式,則字符串比較也按照區分大小寫的方式進行。 mysql> SELECT 2 IN (0,3,5,'wefwf'); -> 0 mysql> SELECT 'wefwf' IN (0,3,5,'wefwf'); -> 1

IN 列表中所列值的個數僅受限于 max_allowed_packet 值。

為了同SQL 標準相一致,在左側表達式為NULL的情況下,或是表中找不到匹配項或是表中一個表達式為NULL 的情況下,IN的返回值均為NULL。

IN() 語構也可用書寫某些類型的子查詢。

  • 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 。所有的參數均按照整數處理。為了這個函數的正確運行,必須滿足 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,...)?在有兩個或多個參數的情況下, 返回值為最小 (最小值) 參數。用一下規則將自變量進行對比: 假如返回值被用在一個 INTEGER 語境中,或是所有參數均為整數值,則將其作為整數值進行比較。 假如返回值被用在一個 REAL語境中,或所有參數均為實值,則 將其作為實值進行比較。 假如任意一個參數是一個區分大小寫的字符串,則將參數按照區分大小寫的字符串進行比較。 在其它情況下,將參數作為區分大小寫的字符串進行比較。 假如任意一個自變量為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'

注意,上面的轉換規則在一些邊界情形中會產生一些奇特的結果:

mysql> SELECT CAST(LEAST(3600, 9223372036854775808.0) as SIGNED); -> -9223372036854775808

發生這種情況的原因是MySQL在整數語境中讀取9223372036854775808.0。整數表示法不利于保存數值,因此它包括一個帶符號整數。

1.4 邏輯操作符

在SQL中,所有邏輯 操作符的求值所得結果均為 TRUE、FALSE或 NULL (UNKNOWN)。在 MySQL中,它們體現為 1 (TRUE)、 0 (FALSE)和 NULL。其大多數都與不同的數據庫SQL通用,然而一些服務器對TRUE的返回值可能是任意一個非零值。

  • NOT !?邏輯 NOT。當操作數為0 時,所得值為 1 ;當操作數為非零值時,所得值為 0 ,而當操作數為NOT NULL時,所得的返回值為 NULL。 mysql> SELECT NOT 10;-> 0 mysql> SELECT NOT 0;-> 1 mysql> SELECT NOT NULL; -> NULL mysql> SELECT ! (1+1); -> 0 mysql> SELECT ! 1+1; -> 1

最后一個例子產生的結果為 1,原因是表達式的計算方式和(!1)+1相同。

  • AND &&?邏輯AND。當所有操作數均為非零值、并且不為NULL時,計算所得結果為 1 ,當一個或多個操作數為0 時,所得結果為 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。當兩個操作數均為非 NULL值時,如有任意一個操作數為非零值,則結果為1,否則結果為0。當有一個操作數為NULL時,如另一個操作數為非零值,則結果為1,否則結果為 NULL 。假如兩個操作數均為 NULL,則所得結果為 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。當任意一個操作數為 NULL時,返回值為NULL。對于非 NULL 的操作數,假如一個奇數操作數為非零值,則計算所得結果為 1 ,否則為 0 。

    mysql> SELECT 1 XOR 1;-> 0 mysql> SELECT 1 XOR 0; -> 1 mysql> SELECT 1 XOR NULL; -> NULL mysql> SELECT 1 XOR 1 XOR 1; -> 1

a XOR b 的計算等同于 (a AND (NOT b)) OR ((NOT a)和 b)。

二、控制流程函數

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

在第一個方案的返回結果中, value=compare-value。而第二個方案的返回結果是第一種情況的真實結果。如果沒有匹配的結果值,則返回結果為ELSE后的結果,如果沒有ELSE 部分,則返回值為 NULL。

mysql> SELECT CASE 1 WHEN 1 THEN 'one'-> WHEN 2 THEN 'two' ELSE 'more' END; -> 'one' mysql> SELECT CASE WHEN 1>0 THEN 'true' ELSE 'false' END; -> 'true' mysql> SELECT CASE BINARY 'B' -> WHEN 'a' THEN 1 WHEN 'b' THEN 2 END; -> NULL

一個CASE表達式的默認返回值類型是任何返回值的相容集合類型,但具體情況視其所在語境而定。如果用在字符串語境中,則返回結果味字符串。如果用在數字語境中,則返回結果為十進制值、實值或整數值。

  • IF(expr1,expr2,expr3) 如果 expr1 是TRUE (expr1 <> 0 and expr1 <> NULL),則 IF()的返回值為expr2; 否則返回值則為 expr3。IF() 的返回值為數字值或字符串值,具體情況視其所在語境而定。 mysql> SELECT IF(1>2,2,3); -> 3 mysql> SELECT IF(1<2,'yes ','no'); -> 'yes' mysql> SELECT IF(STRCMP('test','test1'),'no','yes'); -> 'no'

如果expr2 或expr3中只有一個明確是 NULL,則IF() 函數的結果類型 為非NULL表達式的結果類型。

expr1 作為一個整數值進行計算,就是說,假如你正在驗證浮點值或字符串值, 那么應該使用比較運算進行檢驗。

mysql> SELECT IF(0.1,1,0);-> 0 mysql> SELECT IF(0.1<>0,1,0); -> 1

在所示的第一個例子中,IF(0.1)的返回值為0,原因是 0.1 被轉化為整數值,從而引起一個對 IF(0)的檢驗。這或許不是你想要的情況。在第二個例子中,比較檢驗了原始浮點值,目的是為了了解是否其為非零值。比較結果使用整數。

IF() (這一點在其被儲存到臨時表時很重要 ) 的默認返回值類型按照以下方式計算:

假如expr2 和expr3 都是字符串,且其中任何一個字符串區分大小寫,則返回結果是區分大小寫。

  • IFNULL(expr1,expr2) 假如expr1 不為 NULL,則 IFNULL() 的返回值為 expr1; 否則其返回值為 expr2。IFNULL()的返回值是數字或是字符串,具體情況取決于其所使用的語境。 mysql> SELECT IFNULL(1,0); -> 1 mysql> SELECT IFNULL(NULL,10); -> 10 mysql> SELECT IFNULL(1/0,10); -> 10 mysql> SELECT IFNULL(1/0,'yes'); -> 'yes'

IFNULL(expr1,expr2)的默認結果值為兩個表達式中更加“通用”的一個,順序為STRING、 REAL或 INTEGER。假設一個基于表達式的表的情況, 或MySQL必須在內存儲器中儲存一個臨時表中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

注意,如果參數不相等,則 MySQL 兩次求得的值為 expr1 。

三、字符串函數

假如結果的長度大于 max_allowed_packet 系統變量的最大值時,字符串值函數的返回值為NULL。

對于在字符串位置操作的函數,第一個位置的編號為 1。

  • ASCII(str) 返回值為字符串str 的最左字符的數值。假如str為空字符串,則返回值為 0 。假如str 為NULL,則返回值為 NULL。 ASCII()用于帶有從 0到255的數值的字符。 mysql> SELECT ASCII('2');-> 50 mysql> SELECT ASCII(2); -> 50 mysql> SELECT ASCII('dx'); -> 100

見 ORD()函數。

  • BIN(N) 返回值為N的二進制值的字符串表示,其中 N 為一個longlong (BIGINT) 數字。這等同于 CONV(N,10,2)。假如N 為NULL,則返回值為 NULL。

    mysql> SELECT BIN(12);-> '1100'
  • BIT_LENGTH(str) 返回值為二進制的字符串str 長度。

    mysql> SELECT BIT_LENGTH('text');-> 32
  • CHAR(N,... [USING charset]) CHAR()將每個參數N理解為一個整數,其返回值為一個包含這些整數的代碼值所給出的字符的字符串。NULL值被省略。

    mysql> SELECT CHAR(77,121,83,81,'76'); -> 'MySQL' mysql> SELECT CHAR(77,77.3,'77.3'); -> 'MMM'

大于 255的CHAR()參數被轉換為多結果字符。 例如,CHAR(256) 相當于 CHAR(1,0), 而CHAR(256*256) 則相當于 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()的返回值為一個二進制字符串。可選擇使用USING語句產生一個給出的字符集中的字符串:

mysql> SELECT CHARSET(CHAR(0x65)), CHARSET(CHAR(0x65 USING utf8)); mysql> SELECT CHARSET(CHAR(0x65)), CHARSET(CHAR(0x65 USING utf8));

如果 USING已經產生,而結果字符串不符合給出的字符集,則會發出警告。 同樣,如果嚴格的SQL模式被激活,則CHAR()的結果會成為 NULL。

  • CHAR_LENGTH(str) 返回值為字符串str 的長度,長度的單位為字符。一個多字節字符算作一個單字符。對于一個包含五個二字節字符集, LENGTH()返回值為 10, 而CHAR_LENGTH()的返回值為5。

  • CHARACTER_LENGTH(str) CHARACTER_LENGTH()是CHAR_LENGTH()的同義詞。

  • COMPRESS(string_to_compress) 壓縮一個字符串。這個函數要求 MySQL已經用一個諸如zlib的壓縮庫壓縮過。 否則,返回值始終是NULL。UNCOMPRESS() 可將壓縮過的字符串進行解壓縮。

    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

壓縮后的字符串的內容按照以下方式存儲: 空字符串按照空字符串存儲。 非空字符串未壓縮字符串的四字節長度進行存儲(首先為低字節),后面是壓縮字符串。如果字符串以空格結尾,就會在后加一個"."號,以防止當結果值是存儲在CHAR或VARCHAR類型的字段列時,出現自動把結尾空格去掉的現象。(不推薦使用 CHAR 或VARCHAR 來存儲壓縮字符串。最好使用一個 BLOB 列代替)。

  • CONCAT(str1,str2,...) 返回結果為連接參數產生的字符串。如有任何一個參數為NULL ,則返回值為 NULL。或許有一個或多個參數。 如果所有參數均為非二進制字符串,則結果為非二進制字符串。 如果自變量中含有任一二進制字符串,則結果為一個二進制字符串。一個數字參數被轉化為與之相等的二進制字符串格式;若要避免這種情況,可使用顯式類型 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()的特殊形式。 第一個參數是其它參數的分隔符。分隔符的位置放在要連接的兩個字符串之間。分隔符可以是一個字符串,也可以是其它參數。如果分隔符為 NULL,則結果為 NULL。函數會忽略任何分隔符參數后的 NULL 值。

    mysql> SELECT CONCAT_WS(',','First name','Second name','Last Name'); -> 'First name,Second name,Last Name' mysql> SELECT CONCAT_WS(',','First name',NULL,'Last Name'); -> 'First name,Last Name'

CONCAT_WS()不會忽略任何空字符串。 (然而會忽略所有的 NULL)。

  • CONV(N,from_base,to_base) 不同數基間轉換數字。返回值為數字的N字符串表示,由from_base基轉化為 to_base 基。如有任意一個參數為NULL,則返回值為 NULL。自變量 N 被理解為一個整數,但是可以被指定為一個整數或字符串。最小基數為 2 ,而最大基數則為 36。 If to_base 是一個負數,則 N 被看作一個帶符號數。否則, N 被看作無符號數。 CONV() 的運行精確度為 64比特。

    mysql> SELECT CONV('a',16,2); -> '1010' mysql> SELECT CONV('6E',18,8); -> '172' mysql> SELECT CONV(-17,10,-18); -> '-H' mysql> SELECT CONV(10+'10'+'10'+0xa,10,10); -> '40'
  • ELT(N,str1,str2,str3,...) 若N = 1,則返回值為 str1 ,若N = 2,則返回值為 str2 ,以此類推。 若N 小于1或大于參數的數目,則返回值為 NULL 。 ELT() 是 FIELD()的補數。

    mysql> SELECT ELT(1, 'ej', 'Heja', 'hej', 'foo'); -> 'ej' mysql> SELECT ELT(4, 'ej', 'Heja', 'hej', 'foo'); -> 'foo'
  • EXPORT_SET(bits,on,off[,separator[,number_of_bits]]) 返回值為一個字符串,其中對于bits值中的每個位組,可以得到一個 on 字符串,而對于每個清零比特位,可以得到一個off 字符串。bits 中的比特值按照從右到左的順序接受檢驗 (由低位比特到高位比特)。字符串被分隔字符串分開(默認為逗號‘,’),按照從左到右的順序被添加到結果中。number_of_bits 會給出被檢驗的二進制位數 (默認為 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 指數。在找不到str 的情況下,返回值為 0 。 如果所有對于FIELD() 的參數均為字符串,則所有參數均按照字符串進行比較。如果所有的參數均為數字,則按照數字進行比較。否則,參數按照雙倍進行比較。 如果str 為NULL,則返回值為0 ,原因是NULL不能同任何值進行同等比較。FIELD() 是ELT()的補數。

    mysql> SELECT FIELD('ej', 'Hej', 'ej', 'Heja', 'hej', 'foo'); -> 2 mysql> SELECT FIELD('fo', 'Hej', 'ej', 'Heja', 'hej', 'foo'); -> 0
  • FIND_IN_SET(str,strlist) 假如字符串str 在由N 子鏈組成的字符串列表strlist 中, 則返回值的范圍在 1 到 N 之間 。一個字符串列表就是一個由一些被‘,’符號分開的自鏈組成的字符串。如果第一個參數是一個常數字符串,而第二個是type SET列,則 FIND_IN_SET() 函數被優化,使用比特計算。如果str不在strlist 或strlist 為空字符串,則返回值為 0 。如任意一個參數為NULL,則返回值為 NULL。 這個函數在第一個參數包含一個逗號(‘,’)時將無法正常運行。

    mysql> SELECT FIND_IN_SET('b','a,b,c,d'); -> 2
  • FORMAT(X,D) 將number X設置為格式 '#,###,###.##', 以四舍五入的方式保留到小數點后D位, 而返回結果為一個字符串。

  • HEX(N_or_S) 如果N_OR_S 是一個數字,則返回一個 十六進制值 N 的字符串表示,在這里, N 是一個longlong (BIGINT)數。這相當于 CONV(N,10,16)。 如果N_OR_S 是一個字符串,則返回值為一個N_OR_S的十六進制字符串表示, 其中每個N_OR_S 里的每個字符被轉化為兩個十六進制數字。

    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開始替換。若任何一個參數為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'

這個函數支持多字節字元。

  • INSTR(str,substr) 返回字符串 str 中子字符串的第一個出現位置。這和LOCATE()的雙參數形式相同,除非參數的順序被顛倒。

    mysql> SELECT INSTR('foobarbar', 'bar'); -> 4 mysql> SELECT INSTR('xbar', 'foobar'); -> 0

    這個函數支持多字節字元,并且只有當至少有一個參數是二進制字符串時區分大小寫。

  • LCASE(str) LCASE() 是 LOWER()的同義詞。

  • LEFT(str,len) 返回從字符串str 開始的len 最左字符。

    mysql> SELECT LEFT('foobarbar', 5); -> 'fooba'
  • LENGTH(str) 返回值為字符串str 的長度,單位為字節。一個多字節字符算作多字節。這意味著 對于一個包含5個2字節字符的字符串, LENGTH() 的返回值為 10, 而 CHAR_LENGTH()的返回值則為5。

    mysql> SELECT LENGTH('text');-> 4
  • LOAD_FILE(file_name) 讀取文件并將這一文件按照字符串的格式返回。 文件的位置必須在服務器上,你必須為文件制定路徑全名,而且你還必須擁有FILE 特許權。文件必須可讀取,文件容量必須小于 max_allowed_packet字節。 若文件不存在,或因不滿足上述條件而不能被讀取, 則函數返回值為 NULL。

    mysql> UPDATE tbl_nameSET blob_column=LOAD_FILE('/tmp/picture')WHERE id=1;
  • LOCATE(substr,str) , LOCATE(substr,str,pos) 第一個語法返回字符串 str中子字符串substr的第一個出現位置。第二個語法返回字符串 str中子字符串substr的第一個出現位置, 起始位置在pos。如若substr 不在str中,則返回值為0。

    mysql> SELECT LOCATE('bar', 'foobarbar'); -> 4 mysql> SELECT LOCATE('xbar', 'foobar'); -> 0 mysql> SELECT LOCATE('bar', 'foobarbar',5); -> 7

這個函數支持多字節字元,并且只有當至少有一個參數是二進制字符串時區分大小寫。

  • LOWER(str) 返回字符串 str 以及所有根據最新的字符集映射表變為小寫字母的字符 (默認為 cp1252 Latin1)。 mysql> SELECT LOWER('QUADRATICALLY');-> 'quadratically'

這個函數支持多字節字元。

  • LPAD(str,len,padstr) 返回字符串 str, 其左邊由字符串padstr 填補到len 字符長度。假如str 的長度大于len, 則返回值被縮短至 len 字符。

    mysql> SELECT LPAD('hi',4,'??'); -> '??hi' mysql> SELECT LPAD('hi',1,'??'); -> 'h'
  • LTRIM(str) 返回字符串 str ,其引導空格字符被刪除。

    mysql> SELECT LTRIM(' barbar');-> 'barbar'

這個函數支持多字節字元。

  • MAKE_SET(bits,str1,str2,...) 返回一個設定值 (一個包含被‘,’號分開的字字符串的字符串) ,由在bits 組中具有相應的比特的字符串組成。str1 對應比特 0, str2 對應比特1,以此類推。str1, str2, ...中的 NULL值不會被添加到結果中。

    mysql> SELECT MAKE_SET(1,'a','b','c'); -> 'a' mysql> SELECT MAKE_SET(1 | 4,'hello','nice','world'); -> 'hello,world' mysql> SELECT MAKE_SET(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的八進制值的字符串表示,其中 N 是一個longlong (BIGINT)數。這等同于CONV(N,10,8)。若N 為 NULL ,則返回值為NULL。

    mysql> SELECT OCT(12);-> '14'
  • OCTET_LENGTH(str) OCTET_LENGTH() 是 LENGTH()的同義詞。

  • ORD(str) 若字符串str 的最左字符是一個多字節字符,則返回該字符的代碼, 代碼的計算通過使用以下公式計算其組成字節的數值而得出: (1st byte code) (2nd byte code × 256) (3rd byte code × 2562) ... 假如最左字符不是一個多字節字符,那么 ORD()和函數ASCII()返回相同的值。

    mysql> SELECT ORD('2');-> 50
  • POSITION(substr IN str) POSITION(substr IN str)是 LOCATE(substr,str)同義詞。

  • QUOTE(str) 引證一個字符串,由此產生一個在SQL語句中可用作完全轉義數據值的結果。 返回的字符串由單引號標注,每例都帶有單引號 (‘'’)、 反斜線符號 (‘\’)、 ASCII NUL以及前面有反斜線符號的Control-Z 。如果自變量的值為NULL, 則返回不帶單引號的單詞 “NULL”。

    mysql> SELECT QUOTE('Don\'t!');-> 'Don\'t!' mysql> SELECT QUOTE(NULL); -> NULL
  • REPEAT(str,count) 返回一個由重復的字符串str 組成的字符串,字符串str的數目等于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'

這個函數支持多字節字元。

  • REVERSE(str) 返回字符串 str ,順序和字符順序相反。

    mysql> SELECT REVERSE('abc');-> 'cba'

    這個函數支持多字節字元。

  • RIGHT(str,len) 從字符串str 開始,返回最右len 字符。

    mysql> SELECT RIGHT('foobarbar', 4); -> 'rbar'

這個函數支持多字節字元。

  • RPAD(str,len,padstr) 返回字符串str, 其右邊被字符串 padstr填補至len 字符長度。假如字符串str 的長度大于 len,則返回值被縮短到與 len 字符相同長度。 mysql> SELECT RPAD('hi',5,'?'); -> 'hi???' mysql> SELECT RPAD('hi',1,'?'); -> 'h'

這個函數支持多字節字元。

  • RTRIM(str) 返回字符串 str ,結尾空格字符被刪去。 mysql> SELECT RTRIM('barbar ');-> 'barbar'

這個函數支持多字節字元。

  • SOUNDEX(str) 從str返回一個soundex字符串。 兩個具有幾乎同樣探測的字符串應該具有同樣的 soundex 字符串。一個標準的soundex 字符串的長度為4個字符,然而SOUNDEX() 函數會返回一個人以長度的字符串。 可使用結果中的SUBSTRING() 來得到一個標準 soundex 字符串。在str中,會忽略所有未按照字母順序排列的字符。 所有不在A-Z范圍之內的國際字母符號被視為元音字母。 mysql> SELECT SOUNDEX('Hello');-> 'H400' mysql> SELECT SOUNDEX('Quadratically'); -> 'Q36324'

注意:這個函數執行原始的Soundex算法,而非更加流行的加強版本(如D. Knuth所述)。其區別在于原始版本首先會刪去元音,其次是重復,而加強版則首先刪去重復,而后刪去元音。

  • expr1 SOUNDS LIKE expr2 這相當于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) 不帶有len 參數的格式從字符串str返回一個子字符串,起始于位置 pos。帶有len參數的格式從字符串str返回一個長度同len字符相同的子字符串,起始于位置 pos。 使用 FROM的格式為標準 SQL 語法。也可能對pos使用一個負值。假若這樣,則子字符串的位置起始于字符串結尾的pos 字符,而不是字符串的開頭位置。在以下格式的函數中可以對pos 使用一個負值。

    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'

這個函數支持多字節字元。

注意,如果對len使用的是一個小于1的值,則結果始終為空字符串。

SUBSTR()是 SUBSTRING()的同義詞。

  • SUBSTRING_INDEX(str,delim,count) 在定界符 delim 以及count 出現前,從字符串str返回自字符串。若count為正值,則返回最終定界符(從左邊開始)左邊的一切內容。若count為負值,則返回定界符(從右邊開始)右邊的一切內容。 mysql> SELECT SUBSTRING_INDEX('www.shiyanlou.com', '.', 2); -> 'www.shiyanlou' mysql> SELECT SUBSTRING_INDEX('www.shiyanlou.com', '.', -2); -> 'shiyanlou.com'

這個函數支持多字節字元。

  • TRIM([{BOTH | LEADING | TRAILING} [remstr] FROM] str) TRIM(remstr FROM] str) 返回字符串 str , 其中所有remstr 前綴和/或后綴都已被刪除。若分類符BOTH、LEADIN或TRAILING中沒有一個是給定的,則假設為BOTH 。 remstr 為可選項,在未指定情況下,可刪除空格。

    mysql> SELECT TRIM(' bar ');-> 'bar' mysql> SELECT TRIM(LEADING 'x' FROM 'xxxbarxxx'); -> 'barxxx' mysql> SELECT TRIM(BOTH 'x' FROM 'xxxbarxxx'); -> 'bar' mysql> SELECT TRIM(TRAILING 'xyz' FROM 'barxxyz'); -> 'barx'

    這個函數支持多字節字元。

  • UCASE(str) UCASE()是UPPER()的同義詞。

  • UNCOMPRESS(string_to_uncompress) 對經COMPRESS()函數壓縮后的字符串進行解壓縮。若參數為壓縮值,則結果為 NULL。這個函數要求 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) 執行從HEX(str)的反向操作。就是說,它將參數中的每一對十六進制數字理解為一個數字,并將其轉化為該數字代表的字符。結果字符以二進制字符串的形式返回。

    mysql> SELECT UNHEX('4D7953514C');-> 'MySQL' mysql> SELECT 0x4D7953514C; -> 'MySQL' mysql> SELECT UNHEX(HEX('string')); -> 'string' mysql> SELECT HEX(UNHEX('1267')); -> '1267'
  • UPPER(str) 返回字符串str, 以及根據最新字符集映射轉化為大寫字母的字符 (默認為cp1252 Latin1).

    mysql> SELECT UPPER('Hej');-> 'HEJ'

該函數支持多字節字元

  • STRCMP(expr1,expr2) 若所有的字符串均相同,則返回STRCMP(),若根據當前分類次序,第一個參數小于第二個,則返回 -1,其它情況返回 1 。 mysql> SELECT STRCMP('text', 'text2'); -> -1 mysql> SELECT STRCMP('text2', 'text'); -> 1 mysql> SELECT STRCMP('text', 'text'); -> 0

在執行比較時,STRCMP() 使用當前字符集。這使得默認的比較區分大小寫,當操作數中的一個或兩個都是二進制字符串時除外。

四、數值函數

4.1 算數操作符

  • +?加號:

    mysql> SELECT 3+5;-> 8
  • -?減號:

    mysql> SELECT 3-5;-> -2
  • -?一元減號。更換參數符號。

    mysql> SELECT - 2;-> -2

注意:若該 操作符同一個BIGINT同時使用,則返回值也是一個BIGINT。這意味著你應當盡量避免對可能產生–263的整數使用 –。

  • *?乘號: mysql> SELECT 3*5;-> 15 mysql> SELECT 18014398509481984*18014398509481984.0;-> 324518553658426726783156020576256.0 mysql> SELECT 18014398509481984*18014398509481984;-> 0

最后一個表達式的結果是不正確的。原因是整數相乘的結果超過了BIGINT 計算的 64比特范圍。

  • /?除號: mysql> SELECT 3/5;-> 0.60

被零除的結果為 NULL:

mysql> SELECT 102/(1-1);-> NULL

只有當執行的語境中,其結果要被轉化為一個整數時 ,除法才會和 BIGINT 算法一起使用。

  • DIV?整數除法。 類似于 FLOOR(),然而使用BIGINT 算法也是可靠的。 mysql> SELECT 5 DIV 2;-> 2

4.2 數學函數

若發生錯誤,所有數學函數會返回 NULL 。

  • ABS(X) 返回X 的絕對值。 mysql> SELECT ABS(2);-> 2 mysql> SELECT ABS(-32); -> 32

該函數支持使用BIGINT值。

  • ACOS(X) 返回X 反余弦, 即, 余弦是X的值。若X 不在-1到 1的范圍之內,則返回 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的范圍之內,則返回 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的反正切計算, 除非兩個參數的符號均用于確定結果所在象限。

    mysql> SELECT ATAN(-2,2);-> -0.78539816339745 mysql> SELECT ATAN2(PI(),0); -> 1.5707963267949
  • CEILING(X) CEIL(X) 返回不小于X 的最小整數值。

    mysql> SELECT CEILING(1.23);-> 2 mysql> SELECT CEIL(-1.23); -> -1

這兩個函數的意義相同。注意返回值會被轉化為一個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) 計算循環冗余碼校驗值并返回一個 32比特無符號值。若參數為NULL ,則結果為 NULL。該參數應為一個字符串,而且在不是字符串的情況下會被作為字符串處理(若有可能)。

    mysql> SELECT CRC32('MySQL');-> 3259397556 mysql> SELECT CRC32('mysql'); -> 2501908538
  • DEGREES(X) 返回參數 X, 該參數由弧度被轉化為度。

    mysql> SELECT DEGREES(PI());-> 180 mysql> SELECT DEGREES(PI() / 2); -> 90
  • EXP(X) 返回e的X乘方后的值(自然對數的底)。

    mysql> SELECT EXP(2);-> 7.3890560989307 mysql> SELECT EXP(-2); -> 0.13533528323661 mysql> SELECT EXP(0); -> 1
  • FLOOR(X) 返回不大于X的最大整數值 。

    mysql> SELECT FLOOR(1.23);-> 1 mysql> SELECT FLOOR(-1.23); -> -2

注意,返回值會被轉化為一個 BIGINT。

  • FORMAT(X,D) 將數字X 的格式寫成'#,###,###.##'格式, 即保留小數點后 D位,而第D位的保留方式為四舍五入,然后將結果以字符串的形式返回。

  • LN(X) 返回X 的自然對數,即, X 相對于基數e 的對數。

    mysql> SELECT LN(2);-> 0.69314718055995 mysql> SELECT LN(-2); -> NULL

這個函數同LOG(X)具有相同意義。

  • LOG(X) LOG(B,X) 若用一個參數調用,這個函數就會返回X 的自然對數。 mysql> SELECT LOG(2);-> 0.69314718055995 mysql> SELECT LOG(-2); -> NULL

若用兩個參數進行調用,這個函數會返回X 對于任意基數B 的對數。

mysql> SELECT LOG(2,65536);-> 16 mysql> SELECT LOG(10,100); -> 2

LOG(B,X) 就相當于 LOG(X) / LOG(B)。

  • LOG2(X) 返回X 的基數為2的對數。 mysql> SELECT LOG2(65536);-> 16 mysql> SELECT LOG2(-100); -> NULL

對于查出存儲一個數字需要多少個比特,LOG2()非常有效。這個函數相當于表達式 LOG(X) / LOG(2)。

  • LOG10(X) 返回X的基數為10的對數。 mysql> SELECT LOG10(2);-> 0.30102999566398 mysql> SELECT LOG10(100); -> 2 mysql> SELECT LOG10(-100); -> NULL

LOG10(X)相當于LOG(10,X)。

  • MOD(N,M) , N % M N MOD M 模操作。返回N 被 M除后的余數。 mysql> SELECT MOD(234, 10);-> 4 mysql> SELECT 253 % 7; -> 1 mysql> SELECT MOD(29,9); -> 2 mysql> SELECT 29 MOD 9; -> 2

這個函數支持使用BIGINT 值。

MOD() 對于帶有小數部分的數值也起作用, 它返回除法運算后的精確余數:

mysql> SELECT MOD(34.5,3);-> 1.5
  • PI() 返回 ? (pi)的值。默認的顯示小數位數是7位,然而 MySQL內部會使用完全雙精度值。

    mysql> SELECT PI();-> 3.141593 mysql> SELECT PI()+0.000000000000000000; -> 3.141592653589793116
  • POW(X,Y) , POWER(X,Y) 返回X 的Y乘方的結果值。

    mysql> SELECT POW(2,2);-> 4 mysql> SELECT POW(2,-2); -> 0.25
  • RADIANS(X) 返回由度轉化為弧度的參數 X, (注意 ? 弧度等于180度)。

    mysql> SELECT RADIANS(90);-> 1.5707963267949
  • RAND() RAND(N) 返回一個隨機浮點值 v ,范圍在 0 到1 之間 (即, 其范圍為 0 ≤ v ≤ 1.0)。若已指定一個整數參數 N ,則它被用作種子值,用來產生重復序列。

    mysql> SELECT RAND();-> 0.9233482386203 mysql> SELECT RAND(20); -> 0.15888261251047 mysql> SELECT RAND(20); -> 0.15888261251047 mysql> SELECT RAND(); -> 0.63553050033332 mysql> SELECT RAND(); -> 0.70100469486881 mysql> SELECT RAND(20); -> 0.15888261251047

若要在i ≤ R ≤ j 這個范圍得到一個隨機整數R ,需要用到表達式 FLOOR(i + RAND() * (j – i + 1))。例如, 若要在7 到 12 的范圍(包括7和12)內得到一個隨機整數, 可使用以下語句:

SELECT FLOOR(7 + (RAND() * 6));

在ORDER BY語句中,不能使用一個帶有RAND()值的列,原因是 ORDER BY 會計算列的多重時間。然而,可按照如下的隨機順序檢索數據行:

mysql> SELECT * FROM tbl_name ORDER BY RAND();

ORDER BY RAND()同 LIMIT 的結合從一組列中選擇隨機樣本很有用:

mysql> SELECT * FROM table1, table2 WHERE a=b AND c<d-> ORDER BY RAND() LIMIT 1000;

注意,在WHERE語句中,WHERE每執行一次, RAND()就會被再計算一次。

RAND()的作用不是作為一個精確的隨機發生器,而是一種用來發生在同樣的 MySQL版本的平臺之間的可移動ad hoc隨機數的快速方式。

  • ROUND(X) ROUND(X,D) 返回參數X, 其值接近于最近似的整數。在有兩個參數的情況下,返回 X ,其值保留到小數點后D位,而第D位的保留方式為四舍五入。若要接保留X值小數點左邊的D 位,可將 D 設為負值。 mysql> SELECT ROUND(-1.23);-> -1 mysql> SELECT ROUND(-1.58); -> -2 mysql> SELECT ROUND(1.58); -> 2 mysql> SELECT ROUND(1.298, 1); -> 1.3 mysql> SELECT ROUND(1.298, 0); -> 1 mysql> SELECT ROUND(23.298, -1); -> 20

返回值的類型同 第一個自變量相同(假設它是一個整數、雙精度數或小數)。這意味著對于一個整數參數,結果也是一個整數(無小數部分)。

當第一個參數是十進制常數時,對于準確值參數,ROUND() 使用精密數學題庫:

對于準確值數字, ROUND() 使用“四舍五入” 或“舍入成最接近的數” 的規則:對于一個分數部分為 .5或大于 .5的值,正數則上舍入到鄰近的整數值, 負數則下舍入臨近的整數值。(換言之, 其舍入的方向是數軸上遠離零的方向)。對于一個分數部分小于.5 的值,正數則下舍入下一個整數值,負數則下舍入鄰近的整數值,而正數則上舍入鄰近的整數值。 對于近似值數字,其結果根據C 庫而定。在很多系統中,這意味著 ROUND()的使用遵循“舍入成最接近的偶數”的規則: 一個帶有任何小數部分的值會被舍入成最接近的偶數整數。 以下舉例說明舍入法對于精確值和近似值的不同之處:

mysql> SELECT ROUND(2.5), ROUND(25E-1);

SIGN(X) 返回參數作為-1、 0或1的符號,該符號取決于X 的值為負、零或正。

mysql> SELECT SIGN(-32);-> -1 mysql> SELECT SIGN(0); -> 0 mysql> SELECT SIGN(234); -> 1

SIN(X) 返回X 正弦,其中 X 在弧度中被給定。

mysql> SELECT SIN(PI());-> 1.2246063538224e-16 mysql> SELECT ROUND(SIN(PI())); -> 0
  • SQRT(X) 返回非負數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) 返回被舍去至小數點后D位的數字X。若D 的值為 0, 則結果不帶有小數點或不帶有小數部分。可以將D設為負數,若要截去(歸零) X小數點左起第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

所有數字的舍入方向都接近于零。

五、日期和時間函數

  • ADDDATE(date,INTERVAL expr type) ADDDATE(expr,days) 當被第二個參數的INTERVAL格式激活后, ADDDATE()就是DATE_ADD()的同義詞。相關函數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 參數只是整數值,則 MySQL 5.1將其作為天數值添加至 expr。

mysql> SELECT ADDDATE('1998-01-02', 31); -> '1998-02-02'
  • ADDTIME(expr,expr2) ADDTIME()將 expr2添加至expr 然后返回結果。 expr 是一個時間或時間日期表達式,而expr2 是一個時間表達式。

    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 給出的時區轉到to_tz給出的時區,然后返回結果值。 在從若from_tz 到UTC的轉化過程中,該值超出 TIMESTAMP 類型的被支持范圍,那么轉化不會發生。

    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'之類的指定時間區,首先要設置正確的時區表。

  • CURDATE() 將當前日期按照'YYYY-MM-DD' 或YYYYMMDD 格式的值返回,具體格式根據函數用在字符串或是數字語境中而定。

    mysql> SELECT CURDATE();-> '1997-12-15' mysql> SELECT CURDATE() + 0; -> 19971215
  • CURRENT_DATE CURRENT_DATE() CURRENT_DATE和CURRENT_DATE()是的同義詞.

  • CURTIME() 將當前時間以'HH:MM:SS'或 HHMMSS 的格式返回, 具體格式根據函數用在字符串或是數字語境中而定。

    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) 提取日期或時間日期表達式expr中的日期部分。

    mysql> SELECT DATE('2014-10-29 01:02:03');-> '2014-10-29'
  • DATEDIFF(expr,expr2) DATEDIFF() 返回起始時間 expr和結束時間expr2之間的天數。Expr和expr2 為日期或 date-and-time 表達式。計算中只用到這些值的日期部分。

    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) 這些函數執行日期運算。 date 是一個 DATETIME 或DATE值,用來指定起始時間。 expr 是一個表達式,用來指定從起始日期添加或減去的時間間隔值。 Expr是一個字符串;對于負值的時間間隔,它可以以一個 ‘-’開頭。 type 為關鍵詞,它指示了表達式被解釋的方式。

關鍵詞INTERVA及 type 分類符均不區分大小寫。

以下表顯示了type 和expr 參數的關系:

MySQL 允許任何expr 格式中的標點分隔符。表中所顯示的是建議的 分隔符。若 date 參數是一個 DATE 值,而你的計算只會包括 YEAR、MONTH和DAY部分(即, 沒有時間部分), 其結果是一個DATE 值。否則,結果將是一個 DATETIME值。

若位于另一端的表達式是一個日期或日期時間值 , 則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 關鍵詞所預期的所有時間間隔部分), MySQL 假定你已經省去了時間間隔值的最左部分。 例如,你指定了一種類型的DAY_SECOND, expr 的值預期應當具有天、 小時、分鐘和秒部分。若你指定了一個類似 '1:10'的值, MySQL 假定天和小時部分不存在,那么這個值代表分和秒。換言之, '1:10' DAY_SECOND 被解釋為相當于 '1:10' MINUTE_SECOND。這相當于 MySQL將TIME 值解釋為所耗費的時間而不是日時的解釋方式。

假如你對一個日期值添加或減去一些含有時間部分的內容,則結果自動轉化為一個日期時間值:

mysql> SELECT DATE_ADD('1999-01-01', INTERVAL 1 DAY); -> '1999-01-02' mysql> SELECT DATE_ADD('1999-01-01', INTERVAL 1 HOUR); -> '1999-01-01 01:00:00'

假如你使用了格式嚴重錯誤的日期,則結果為 NULL。假如你添加了 MONTH、YEAR_MONTH或YEAR ,而結果日期中有一天的日期大于添加的月份的日期最大限度,則這個日期自動被調整為添加月份的最大日期:

mysql> SELECT DATE_ADD('1998-01-30', INTERVAL 1 MONTH); -> '1998-02-28'
  • DATE_FORMAT(date,format) 根據format 字符串安排date 值的格式。 以下說明符可用在 format 字符串中:

所有其它字符都被復制到結果中,無需作出解釋。

注意, ‘%’字符要求在格式指定符之前。

月份和日期說明符的范圍從零開始,原因是 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 對應的工作日名稱。

    mysql> SELECT DAYNAME('1998-02-05');-> '周四'
  • DAYOFMONTH(date) 返回date 對應的該月日期,范圍是從 1到31。

    mysql> SELECT DAYOFMONTH('1998-02-03');-> 3
  • DAYOFWEEK(date) 返回date (1 = 周日, 2 = 周一, ..., 7 = 周六)對應的工作日索引。這些索引值符合 ODBC標準。

    mysql> SELECT DAYOFWEEK('1998-02-03');-> 3
  • DAYOFYEAR(date) 返回date 對應的一年中的天數,范圍是從 1到366。

    mysql> SELECT DAYOFYEAR('1998-02-03');-> 34
  • EXTRACT(type FROM date) EXTRACT()函數所使用的時間間隔類型說明符同 DATE_ADD()或DATE_SUB()的相同,但它從日期中提取其部分,而不是執行日期運算。

    mysql> SELECT EXTRACT(YEAR FROM '1999-07-02');-> 1999 mysql> SELECT EXTRACT(YEAR_MONTH FROM '1999-07-02 01:02:03'); -> 199907 mysql> SELECT EXTRACT(DAY_MINUTE FROM '1999-07-02 01:02:03'); -> 20102 mysql> SELECT EXTRACT(MICROSECOND -> FROM '2003-01-02 10:30:00.00123'); -> 123
  • FROM_DAYS(N) 給定一個天數 N, 返回一個DATE值。

    mysql> SELECT FROM_DAYS(729669);-> '1997-10-07'

使用 FROM_DAYS()處理古老日期時,務必謹慎。他不用于處理陽歷出現前的日期(1582)

  • FROM_UNIXTIME(unix_timestamp) , FROM_UNIXTIME(unix_timestamp,format) 返回'YYYY-MM-DD HH:MM:SS'或YYYYMMDDHHMMSS 格式值的unix_timestamp參數表示,具體格式取決于該函數是否用在字符串中或是數字語境中。 若format 已經給出,則結果的格式是根據format 字符串而定。 format 可以包含同DATE_FORMAT() 函數輸入項列表中相同的說明符。

    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') 返回一個格式字符串。這個函數在同DATE_FORMAT() 及STR_TO_DATE()函數結合時很有用。 第一個參數的3個可能值和第二個參數的5個可能值產生 15 個可能格式字符串 (對于使用的說明符,請參見DATE_FORMAT()函數說明表 )。

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 對應的小時數。對于日時值的返回值范圍是從 0 到 23 。 mysql> SELECT HOUR('10:05:03');-> 10

然而, TIME 值的范圍實際上非常大, 所以HOUR可以返回大于23的值。

mysql> SELECT HOUR('272:59:59');-> 272
  • LAST_DAY(date) 獲取一個日期或日期時間值,返回該月最后一天對應的值。若參數無效,則返回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) 給出年份值和一年中的天數值,返回一個日期。dayofyear 必須大于 0 ,否則結果為 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 參數計算得出的時間值。

    mysql> SELECT MAKETIME(12,15,30); -> '12:15:30'
  • MICROSECOND(expr) 從時間或日期時間表達式expr返回微秒值,其數字范圍從 0到 999999。

    mysql> SELECT MICROSECOND('12:00:00.123456');-> 123456 mysql> SELECT MICROSECOND('1997-12-31 23:59:59.000010'); -> 10
  • MINUTE(time) 返回 time 對應的分鐘數,范圍是從 0 到 59。

    mysql> SELECT MINUTE('98-02-03 10:05:03');-> 5
  • MONTH(date) 返回date 對應的月份,范圍時從 1 到 12。

    mysql> SELECT MONTH('1998-02-03');-> 2
  • MONTHNAME(date) 返回date 對應月份的全名。

    mysql> SELECT MONTHNAME('1998-02-05');-> 'February '
  • NOW() 返回當前日期和時間值,其格式為 'YYYY-MM-DD HH:MM:SS' 或YYYYMMDDHHMMSS , 具體格式取決于該函數是否用在字符串中或數字語境中。

    mysql> SELECT NOW();-> '1997-12-15 23:50:26' mysql> SELECT NOW() + 0; -> 19971215235026

在一個存儲程序或觸發器內, NOW() 返回一個常數時間,該常數指示了該程序或觸發語句開始執行的時間。這同SYSDATE()的運行有所不同。

  • PERIOD_ADD(P,N) 添加 N 個月至周期P (格式為YYMM 或YYYYMM),返回值的格式為 YYYYMM。注意周期參數 P 不是日期值。

    mysql> SELECT PERIOD_ADD(9801,2);-> 199803
  • PERIOD_DIFF(P1,P2) 返回周期P1和 P2 之間的月份數。P1 和P2 的格式應該為YYMM或YYYYMM。注意周期參數 P1和P2 不是日期值。

    mysql> SELECT PERIOD_DIFF(9802,199703);-> 11
  • QUARTER(date) 返回date 對應的一年中的季度值,范圍是從 1到 4。

    mysql> SELECT QUARTER('98-04-01');-> 2
  • SECOND(time) 返回time 對應的秒數, 范圍是從 0到59。

    mysql> SELECT SECOND('10:05:03');-> 3
  • SEC_TO_TIME(seconds) 返回被轉化為小時、 分鐘和秒數的seconds參數值, 其格式為 'HH:MM:SS' 或HHMMSS,具體格式根據該函數是否用在字符串或數字語境中而定。

    mysql> SELECT SEC_TO_TIME(2378);-> '00:39:38' mysql> SELECT SEC_TO_TIME(2378) + 0; -> 3938
  • STR_TO_DATE(str,format) 這是DATE_FORMAT() 函數的倒轉。它獲取一個字符串 str 和一個格式字符串format。若格式字符串包含日期和時間部分,則 STR_TO_DATE()返回一個 DATETIME 值, 若該字符串只包含日期部分或時間部分,則返回一個 DATE 或TIME值。 str所包含的日期、時間或日期時間值應該在format指示的格式中被給定。對于可用在format中的說明符,請參見DATE_FORMAT() 函數說明表。 所有其它的字符被逐字獲取,因此不會被解釋。若 str 包含一個非法日期、時間或日期時間值,則 STR_TO_DATE()返回NULL。同時,一個非法值會引起警告。 對日期值部分的范圍檢查在11.3.1節,“DATETIME、DATE和TIMESTAMP類型”有詳細說明。其意義是,例如, 只要具體日期部分的范圍時從 1到 31之間,則允許一個日期中的具體日期部分大于一個月中天數值。并且,允許“零”日期或帶有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) 當被第二個參數的 INTERVAL型式調用時, 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使用整數值。在這些情況下,它被算作由日期或日期時間表達式 expr中提取的天數。

mysql> SELECT SUBDATE('1998-01-02 12:00:00', 31); -> '1997-12-02 12:00:00'

注意不能使用格式 "%X%V" 來將一個 year-week 字符串轉化為一個日期,原因是當一個星期跨越一個月份界限時,一個年和星期的組合不能標示一個唯一的年和月份。若要將year-week轉化為一個日期,則也應指定具體工作日:

mysql> select str_to_date('200442 Monday', '%X%V %W'); -> 2004-10-18
  • SUBTIME(expr,expr2) SUBTIME()從expr 中提取expr2 ,然后返回結果。expr 是一個時間或日期時間表達式,而xpr2 是一個時間表達式。

    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() 返回當前日期和時間值,格式為'YYYY-MM-DD HH:MM:SS' 或YYYYMMDDHHMMSS, 具體格式根據函數是否用在字符串或數字語境而定。 在一個存儲程序或觸發器中, SYSDATE()返回其執行的時間, 而非存儲或觸發語句開始執行的時間。這個NOW()的運作有所不同。

  • TIME(expr) 提取一個時間或日期時間表達式的時間部分,并將其以字符串形式返回。

    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 和結束時間expr2 之間的時間。 expr 和expr2 為時間或 date-and-time 表達式,兩個的類型必須一樣。

    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) 對于一個單參數,該函數將日期或日期時間表達式 expr 作為日期時間值返回.對于兩個參數, 它將時間表達式 expr2 添加到日期或日期時間表達式 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) 將整型表達式int_expr 添加到日期或日期時間表達式 datetime_expr中。 int_expr 的單位被時間間隔參數給定,該參數必須是以下值的其中一個: FRAC_SECOND、SECOND、 MINUTE、 HOUR、 DAY、 WEEK、 MONTH、 QUARTER或 YEAR。 可使用所顯示的關鍵詞指定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) 返回日期或日期時間表達式datetime_expr1 和datetime_expr2the 之間的整數差。其結果的單位由interval 參數給出。interval 的法定值同TIMESTAMPADD()函數說明中所列出的相同。

    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()函數相同, 然而format 字符串可能僅會包含處理小時、分鐘和秒的格式說明符。其它說明符產生一個NULL值或0。 若time value包含一個大于23的小時部分,則 %H 和 %k 小時格式說明符會產生一個大于0..23的通常范圍的值。另一個小時格式說明符產生小時值模數12。

    mysql> SELECT TIME_FORMAT('100:00:00', '%H %k %h %I %l'); -> '100 100 04 04 4'
  • TIME_TO_SEC(time) 返回已轉化為秒的time參數。

    mysql> SELECT TIME_TO_SEC('22:23:00');-> 80580 mysql> SELECT TIME_TO_SEC('00:39:38'); -> 2378
  • TO_DAYS(date) 給定一個日期date, 返回一個天數 (從年份0開始的天數 )。

    mysql> SELECT TO_DAYS(950501);-> 728779 mysql> SELECT TO_DAYS('1997-10-07'); -> 729669

TO_DAYS() 不用于陽歷出現(1582)前的值,原因是當日歷改變時,遺失的日期不會被考慮在內。

  • UNIX_TIMESTAMP(), UNIX_TIMESTAMP(date) 若無參數調用,則返回一個Unix timestamp ('1970-01-01 00:00:00' GMT 之后的秒數) 作為無符號整數。若用date 來調用UNIX_TIMESTAMP(),它會將參數值以'1970-01-01 00:00:00' GMT后的秒數的形式返回。date 可以是一個DATE 字符串、一個 DATETIME字符串、一個 TIMESTAMP或一個當地時間的YYMMDD 或YYYMMDD格式的數字。 mysql> SELECT UNIX_TIMESTAMP();-> 882226357 mysql> SELECT UNIX_TIMESTAMP('1997-10-04 22:23:00'); -> 875996580

當 UNIX_TIMESTAMP被用在 TIMESTAMP列時, 函數直接返回內部時戳值, 而不進行任何隱含的 “string-to-Unix-timestamp”轉化。假如你向UNIX_TIMESTAMP()傳遞一個溢出日期,它會返回 0,但請注意只有基本范圍檢查會被履行 (年份從1970 到 2037, 月份從01到12,日期從 01 到31)。

  • UTC_DATE, UTC_DATE() 返回當前 UTC日期值,其格式為 'YYYY-MM-DD' 或 YYYYMMDD,具體格式取決于函數是否用在字符串或數字語境中。

    mysql> SELECT UTC_DATE(), UTC_DATE() + 0; -> '2014-10-29', 20141029
  • UTC_TIME, UTC_TIME() 返回當前 UTC 值,其格式為 'HH:MM:SS' 或HHMMSS,具體格式根據該函數是否用在字符串或數字語境而定。

    mysql> SELECT UTC_TIME(), UTC_TIME() + 0; -> '18:07:53', 180753
  • UTC_TIMESTAMP, UTC_TIMESTAMP() 返回當前UTC日期及時間值,格式為 'YYYY-MM-DD HH:MM:SS' 或YYYYMMDDHHMMSS,具體格式根據該函數是否用在字符串或數字語境而定。

    mysql> SELECT UTC_TIMESTAMP(), UTC_TIMESTAMP() + 0; -> '2003-08-14 18:08:04', 20030814180804
  • WEEK(date[,mode]) 該函數返回date 對應的星期數。WEEK() 的雙參數形式允許你指定該星期是否起始于周日或周一, 以及返回值的范圍是否為從0 到53 或從1 到53。若 mode參數被省略,則使用default_week_format系統自變量的值。請參見5.3.3節,“服務器系統變量”。

以下表說明了mode 參數的工作過程:

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 參數選擇,則MySQL返回 0:

mysql> SELECT YEAR('2000-01-01'), WEEK('2000-01-01',0); -> 2000, 0

有人或許會提出意見,認為 MySQL 對于WEEK() 函數應該返回 52 ,原因是給定的日期實際上發生在1999年的第52周。我們決定返回0作為代替的原因是我們希望該函數能返回“給定年份的星期數”。這使得WEEK() 函數在同其它從日期中抽取日期部分的函數結合時的使用更加可靠。

假如你更希望所計算的關于年份的結果包括給定日期所在周的第一天,則應使用 0、2、5或 7 作為mode參數選擇。

mysql> SELECT WEEK('2000-01-01',2); -> 52

作為選擇,可使用 YEARWEEK()函數:

mysql> SELECT YEARWEEK('2000-01-01');-> 199952 mysql> SELECT MID(YEARWEEK('2000-01-01'),5,2); -> '52'
  • WEEKDAY(date) 返回date (0 = 周一, 1 = 周二, ... 6 = 周日)對應的工作日索引 weekday index for

    mysql> SELECT WEEKDAY('1998-02-03 22:23:00');-> 1 mysql> SELECT WEEKDAY('1997-11-05'); -> 2
  • WEEKOFYEAR(date) 將該日期的陽歷周以數字形式返回,范圍是從1到53。它是一個兼容度函數,相當于WEEK(date,3)。

    mysql> SELECT WEEKOFYEAR('1998-02-20');-> 8
  • YEAR(date) 返回date 對應的年份,范圍是從1000到9999。

    mysql> SELECT YEAR('98-02-03');-> 1998
  • YEARWEEK(date), YEARWEEK(date,start) 返回一個日期對應的年或周。start參數的工作同 start參數對 WEEK()的工作相同。結果中的年份可以和該年的第一周和最后一周對應的日期參數有所不同。

    mysql> SELECT YEARWEEK('1987-01-01');-> 198653

注意,周數和WEEK()函數隊可選參數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語句的一部分被創建,或是隨后使用ALTER TABLE 或 CREATE INDEX被添加。對于較大的數據集,將你的資料輸入一個沒有FULLTEXT索引的表中,然后創建索引, 其速度比把資料輸入現有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函數和操作符

  • BINARY BINARY操作符將后面的字符串拋給一個二進制字符串。這是一種簡單的方式來促使逐字節而不是逐字符的進行列比較。這使得比較區分大小寫,即使該列不被定義為 BINARY或 BLOB。BINARY也會產生結尾空白,從而更加顯眼。 mysql> SELECT 'a' = 'A';-> 1 mysql> SELECT BINARY 'a' = 'A'; -> 0 mysql> SELECT 'a' = 'a '; -> 1 mysql> SELECT BINARY 'a' = 'a '; -> 0

BINARY影響整個比較;它可以在任何操作數前被給定,而產生相同的結果。

BINARY str 是CAST(str AS BINARY)的縮略形式。

注意,在一些語境中,假如你將一個編入索引的列派給BINARY, MySQL 將不能有效使用這個索引。

假如你想要將一個 BLOB值或其它二進制字符串進行區分大小寫的比較,你可利用二進制字符串沒有字符集這一事實實現這個目的,這樣就不會有文書夾的概念。為執行一個區分大小寫的比較,可使用 CONVERT()函數將一個字符串值轉化為一個不區分大小寫的字符集。其結果為一個非二進制字符串,因此 LIKE 操作也不會區分大小寫:

SELECT 'A' LIKE CONVERT(blob_col USING latin1) FROM tbl_name;

若要使用一個不同的字符集, 替換其在上述語句中的latin1名。

CONVERT()一般可用于比較出現在不同字符集中的字符串。

CAST(expr AS type), CONVERT(expr,type) , CONVERT(expr USING transcoding_name) CAST()和CONVERT() 函數可用來獲取一個類型的值,并產生另一個類型的值。

這個類型可以是以下值其中的一個:

BINARY[(N)] CHAR[(N)] DATE DATETIME DECIMAL SIGNED [INTEGER] TIME UNSIGNED [INTEGER] BINARY 產生一個二進制字符串。

假如給定了隨意長度N,則 BINARY[N] 使 cast使用該參數的不多于 N 個字節。同樣的, CHAR[N]會使 cast 使用該參數的不多于N 個字符。

CAST() and CONVERT(... USING ...) 是標準 SQL語法。CONVERT()的非USING 格式是ofis ODBC語法。

帶有USING的CONVERT() 被用來在不同的字符集之間轉化數據。在 MySQL中, 自動譯碼名和相應的字符集名稱相同。例如。 這個語句將服務器的默認字符集中的字符串 'abc'轉化為utf8字符集中相應的字符串:

SELECT CONVERT('abc' USING utf8);

當你想要在一個CREATE ... SELECT 語句中創建一個特殊類型的列,則cast函數會很有用:

CREATE TABLE new_table SELECT CAST('2000-01-01' AS DATE);

該函數也用于ENUM 列按詞法順序的排序。通常ENUM列的排序在使用內部數值時發生。將這些值按照詞法順序派給 CHAR 結果:

SELECT enum_col FROM tbl_name ORDER BY CAST(enum_col AS CHAR);

CAST(str AS BINARY)和BINARY str相同。 CAST(expr AS CHAR) 將表達式視為一個帶有默認字符集的字符串。

若用于一個諸如 CONCAT('Date: ',CAST(NOW() AS DATE))這樣的比較復雜的表達式的一部分,CAST()也會改變結果。

你不應在不同的格式中使用 CAST() 來析取數據,但可以使用諸如LEFT() 或 EXTRACT() 的樣的字符串函數來代替。

若要在數值語境中將一個字符串派給一個數值, 通常情況下,除了將字符串值作為數字使用外,你不需要做任何事:

mysql> SELECT 1+'1';-> 2

若要在一個字符串語境中使用一個數字,該數字會被自動轉化為一個BINARY 字符串。

mysql> SELECT CONCAT('hello you ',2); -> 'hello you 2'

MySQL 支持帶符號和無符號的64比特值的運算。若你正在使用數字操作符 (如 +) 而其中一個操作數為無符號整數,則結果為無符號。可使用SIGNED 和UNSIGNED cast 操作符來覆蓋它。將運算分別派給帶符號或無符號64比特整數。

mysql> SELECT CAST(1-2 AS UNSIGNED)-> 18446744073709551615 mysql> SELECT CAST(CAST(1-2 AS UNSIGNED) AS SIGNED); -> -1

注意,假如任意一個操作數為一個浮點值,則結果為一個浮點值, 且不會受到上述規則影響 (關于這一點, DECIMAL 列值被視為浮點值)。

mysql> SELECT CAST(1 AS UNSIGNED) - 2.0;-> -1.0

若你在一個算術運算中使用了一個字符串,它會被轉化為一個浮點數。

八、其他函數

8.1 位函數

對于比特運算,MySQL 使用 BIGINT (64比特) 算法,因此這些操作符的最大范圍是 64 比特。

  • | Bitwise OR: mysql> SELECT 29 | 15;-> 31

其結果為一個64比特無符號整數。

  • & Bitwise AND: mysql> SELECT 29 & 15;-> 13

其結果為一個64比特無符號整數。

  • ^ Bitwise XOR: mysql> SELECT 1 ^ 1;-> 0 mysql> SELECT 1 ^ 0;-> 1 mysql> SELECT 11 ^ 3;-> 8

結果為一個64比特無符號整數。

  • << 把一個longlong (BIGINT)數左移兩位。 mysql> SELECT 1 << 2;-> 4

其結果為一個64比特無符號整數。

  • > 把一個longlong (BIGINT)數右移兩位。

    mysql> SELECT 4 >> 2;-> 1

其結果為一個64比特無符號整數。

  • ~ 反轉所有比特。 mysql> SELECT 5 & ~1;-> 4

其結果為一個64比特無符號整數。

  • BIT_COUNT(N) 返回參數N 中所設置的比特數 mysql> SELECT BIT_COUNT(29);-> 4

8.2 加密函數

本節介紹了加密和加密值。若你想要儲存一些由可能包含任意字節值的加密函數返回的結果,使用BLOB列而不是 CHAR 或VARCHAR 列,從而避免由于結尾空格的刪除而改變一些數據值的潛在問題。

  • AES_ENCRYPT(str,key_str) , AES_DECRYPT(crypt_str,key_str) 這些函數允許使用官方AES進行加密和數據加密 (高級加密標準 ) 算法, 即以前人們所熟知的 “Rijndael”。 保密關鍵字的長度為128比特,不過你可以通過改變源而將其延長到 256 比特。我們選擇了 128比特的原因是它的速度要快得多,且對于大多數用途而言這個保密程度已經夠用。 輸入參數可以為任何長度。若任何一個參數為NULL,則函數的結果也是NULL。 因為 AES 是塊級算法,使用填充將不均衡長度字符串編碼,這樣結果字符串的長度的算法為 16 * (trunc(string_length / 16) + 1)。 若 AES_DECRYPT()檢測到無效數據或不正確填充,它會返回 NULL。然而,若輸入的資料或密碼無效時, AES_DECRYPT()有可能返回一個非 NULL 值 (可能為無用信息 )。

  • AES_ENCRYPT()和AES_DECRYPT() 可以被看作MySQL中普遍通用的密碼最安全的加密函數。

  • DECODE(crypt_str,pass_str) 使用 pass_str 作為密碼,解密加密字符串 crypt_str, crypt_str 應該是由ENCODE()返回的字符串。

  • ENCODE(str,pass_str) 使用pass_str 作為密碼,解密 str 。 使用DECODE()解密結果。 結果是一個和str長度相同的二進制字符串。若你想要將其保留在一個列中,可使用 BLOB 列類型。

  • DES_DECRYPT(crypt_str[,key_str]) 使用DES_ENCRYPT()加密一個字符串。若出現錯誤,這個函數會返回 NULL。 注意,這個函數只有當MySQL在SSL 的支持下配置完畢時才會運作。 假如沒有給定 key_str 參數, DES_DECRYPT() 會首先檢查加密字符串的第一個字節, 從而確定用來加密原始字符串的DES密碼關鍵字數字,之后從DES關鍵字文件中讀取關鍵字從而解密信息。為使其運行,用戶必須享有 SUPER 特權。可以選擇--des-key-file服務器指定關鍵字文件。 假如你向這個函數傳遞一個key_str 參數,該字符串被用作解密信息的關鍵字。 若 crypt_str 參數看起來不是一個加密字符串, MySQL 會返回給定的 crypt_str。

  • DES_ENCRYPT(str[,(key_num|key_str)]) 用Triple-DES 算法給出的關鍵字加密字符串。若出現錯誤,這個函數會返回NULL。 注意,這個函數只有當MySQL 在SSL的支持下配置完畢后才會運行。請參見5.8.7節,“使用安全連接”. 使用的加密關鍵字的選擇基于第二個到 DES_ENCRYPT()的參數,假如給定:

選擇--des-key-file服務器指定關鍵字文件。

返回字符串是一個二進制字符串,其中第一個字符為 CHAR(128 | key_num)。

加上 128使得識別加密關鍵字更加容易。若你使用一個字符串關鍵字,則 key_num 為127。

結果的字符串長度為 new_len = orig_len + (8-(orig_len % 8))+1。

DES關鍵字文件中的每一行都具有如下格式:

key_num des_key_str

每個key_num 必須是一個從0到0范圍內的數字。文件中行的排列順序是任意的。 des_key_str 是用來加密信息的字符串。在數字和關鍵字之間應該至少有一個空格。若你未指定任何到DES_ENCRYPT()的關鍵字參數,則第一個關鍵字為默認的使用關鍵字。

使用FLUSH DES_KEY_FILE語句,你可以讓 MySQL從關鍵字文件讀取新的關鍵字值。這要求你享有 RELOAD特權。

擁有一套默認關鍵字的一個好處就是它向應用程序提供了一個檢驗加密列值的方式,而無須向最終用戶提供解密這些值的權力。

mysql> SELECT customer_address FROM customer_table> WHERE crypted_credit_card = DES_ENCRYPT('credit_card_number');
  • ENCRYPT(str[,salt]) 使用Unix crypt() 系統調用加密 str。 salt 參數應為一個至少包含2個字符的字符串。若沒有給出 salt 參數,則使用任意值。 mysql> SELECT ENCRYPT('hello');-> 'VxuFAJXVARROc'

至少在一些系統中,ENCRYPT()除了str的前八位字符之外會忽略所有內容。這個行為由下劃線的crypt() 系統調用的執行所決定。

假如crypt()在你的系統中不可用(正如在 Windows系統), ENCRYPT() 則會始終返回NULL。鑒于這個原因,我們向你推薦使用 MD5() 或SHA1() 來代替,因為這兩個函數適合所有的平臺。

  • MD5(str) 為字符串算出一個 MD5 128比特檢查和。該值以32位十六進制數字的二進制字符串的形式返回, 若參數為 NULL 則會返回 NULL。例如,返回值可被用作散列關鍵字。 mysql> SELECT MD5('testing');-> 'ae2b1fca515949e5d54fb22b8ed95575'

這是"RSA Data Security, Inc. MD5 Message-Digest Algorithm."

  • OLD_PASSWORD(str) 當PASSWORD()的執行變為改善安全性時,OLD_PASSWORD()會被添加到 MySQL。

  • PASSWORD(str) 從原文密碼str 計算并返回密碼字符串,當參數為 NULL 時返回 NULL。這個函數用于用戶授權表的Password列中的加密MySQL密碼存儲

    mysql> SELECT PASSWORD('badpwd');-> '7f84554057dd964b'

PASSWORD() 加密是單向的 (不可逆 )。

PASSWORD() 執行密碼加密與Unix 密碼被加密的方式不同。請參見ENCRYPT()。

注釋: PASSWORD()函數在MySQL服務器中的鑒定系統使用;你不應將它用在你個人的應用程序中。為達到同樣目的,可使用 MD5()或SHA1() 代替。

  • SHA1(str) SHA(str) 為字符串算出一個 SHA1 160比特檢查和,如RFC 3174 (安全散列算法 )中所述。該值被作為40位十六進制數字返回,而當參數為NULL 時則返回 NULL。這個函數的一個可能的用處就在于其作為散列關鍵字。你也可以將其作為存儲密碼的密碼安全函數使用。 mysql> SELECT SHA1('abc');-> 'a9993e364706816aba3e25717850c26c9cd0d89d'

SHA1()可以被視為一個密碼更加安全的函數,相當于 MD5()。 SHA() 和SHA1()具有相同的意義。

8.3 信息函數

  • BENCHMARK(count,expr) BENCHMARK() 函數重復count 次執行表達式 expr 。 它可以被用于計算 MySQL 處理表達式的速度。結果值通常為 0。另一種用處來自 mysql客戶端內部,能夠報告問詢執行的次數: mysql> SELECT BENCHMARK(1000000,ENCODE('hello','goodbye'));

此處報告的時間是客戶端上的共用時間,而不是服務器端上的CPU時間。建議執行多遍BENCHMARK(),并解釋與服務器機器負荷程度有關的結果。

  • 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

    返回值具有如下意義:

下方值得優先級較高。

  • COLLATION(str) 返回惠字符串參數的排序方式。

    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() 返回當前話路被驗證的用戶名和主機名組合。這個值符合確定你的存取權限的MySQL 賬戶。在被指定SQL SECURITY DEFINER特征的存儲程序內, CURRENT_USER() 返回程序的創建者。 CURRENT_USER()的值可以和USER()的值有所不同。

    mysql> SELECT USER(); mysql> SELECT * FROM mysql.user; mysql> SELECT CURRENT_USER();
  • DATABASE() 返回使用 utf8 字符集的默認(當前)數據庫名。在存儲程序里,默認數據庫是同該程序向關聯的數據庫,但并不一定與調用語境的默認數據庫相同。

    mysql> SELECT DATABASE();-> 'test'

若沒有默認數據庫, DATABASE()返回 NULL。

  • FOUND_ROWS() A SELECT語句可能包括一個 LIMIT 子句,用來限制服務器返回客戶端的行數。在有些情況下,需要不用再次運行該語句而得知在沒有LIMIT 時到底該語句返回了多少行。為了知道這個行數, 包括在SELECT 語句中選擇 SQL_CALC_FOUND_ROWS ,隨后調用 FOUND_ROWS() : mysql> SELECT SQL_CALC_FOUND_ROWS * FROM tbl_name-> WHERE id > 100 LIMIT 10; mysql> SELECT FOUND_ROWS();

第二個 SELECT返回一個數字,指示了在沒有LIMIT子句的情況下,第一個SELECT返回了多少行 (若上述的 SELECT語句不包括 SQL_CALC_FOUND_ROWS 選項,則使用LIMIT 和不使用時,FOUND_ROWS() 可能會返回不同的結果)。

通過 FOUND_ROWS()的有效行數是瞬時的,并且不用于越過SELECT SQL_CALC_FOUND_ROWS語句后面的語句。若你需要稍候參閱這個值,那么將其保存:

mysql> SELECT SQL_CALC_FOUND_ROWS * FROM ... ; mysql> SET @rows = FOUND_ROWS();

假如你正在使用 SELECT SQL_CALC_FOUND_ROWS, MySQL 必須計算出在全部結果集合中有所少行。然而, 這比不用LIMIT而再次運行問詢要快,原因是結果集合不需要被送至客戶端。

SQL_CALC_FOUND_ROWS 和 FOUND_ROWS() 在當你希望限制一個問詢返回的行數時很有用,同時還能不需要再次運行問詢而確定全部結果集合中的行數。一個例子就是提供頁式顯示的Web腳本,該顯示包含顯示搜索結果其它部分的頁的連接。使用FOUND_ROWS() 使你確定剩下的結果需要多少其它的頁。

SQL_CALC_FOUND_ROWS 和 FOUND_ROWS() 的應用對于UNION 問詢比對于簡單SELECT 語句更為復雜,原因是在UNION 中,LIMIT 可能會出現在多個位置。它可能適用于UNION中的個人 SELECT語句,或是總體上 到UNION 結果的全程。

SQL_CALC_FOUND_ROWS對于 UNION的意向是它應該不需要全程LIMIT而返回應返回的行數。SQL_CALC_FOUND_ROWS 和UNION 一同使用的條件是:

SQL_CALC_FOUND_ROWS 關鍵詞必須出現在UNION的第一個 SELECT中。 FOUND_ROWS()的值只有在使用 UNION ALL時才是精確的。若使用不帶ALL的UNION,則會發生兩次刪除, 而 FOUND_ROWS() 的指只需近似的。 假若UNION 中沒有出現 LIMIT ,則SQL_CALC_FOUND_ROWS 被忽略,返回臨時表中的創建的用來處理UNION的行數。

  • LAST_INSERT_ID() LAST_INSERT_ID(expr) 自動返回最后一個INSERT或 UPDATE 問詢為 AUTO_INCREMENT列設置的第一個發生的值。 mysql> SELECT LAST_INSERT_ID();-> 195

產生的ID每次連接后保存在服務器中。這意味著函數向一個給定客戶端返回的值是該客戶端產生對影響AUTO_INCREMENT列的最新語句第一個 AUTO_INCREMENT值的。這個值不能被其它客戶端影響,即使它們產生它們自己的 AUTO_INCREMENT值。這個行為保證了你能夠找回自己的 ID 而不用擔心其它客戶端的活動,而且不需要加鎖或處理。

  • ROW_COUNT() ROW_COUNT()返回被前面語句升級的、插入的或刪除的行數。 這個行數和 mysql 客戶端顯示的行數及 mysql_affected_rows() C API 函數返回的值相同。

    mysql> SELECT ROW_COUNT();
  • SCHEMA() 這個函數和 DATABASE()具有相同的意義。

  • SESSION_USER() SESSION_USER()和 USER()具有相同的意義。

  • SYSTEM_USER() SYSTEM_USER()合 USER()具有相同的意義。

  • USER() 返回當前 MySQL用戶名和機主名

  • VERSION() 返回指示 MySQL 服務器版本的字符串。這個字符串使用 utf8 字符集。

    mysql> SELECT VERSION();

注意,假如你的版本字符串以-log結尾,這說明登錄已被激活。

8.4 其他函數

  • DEFAULT(col_name) 返回一個表列的默認值。若該列沒有默認值則會產生錯誤。
  • FORMAT(X,D) 將數字X 的格式寫為'#,###,###.##',以四舍五入的方式保留小數點后 D 位, 并將結果以字符串的形式返回。若 D 為 0, 則返回結果不帶有小數點,或不含小數部分。

    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) 設法使用字符串str 給定的名字得到一個鎖, 超時為timeout 秒。若成功得到鎖,則返回 1,若操作超時則返回0 (例如,由于另一個客戶端已提前封鎖了這個名字 ),若發生錯誤則返回NULL (諸如缺乏記憶或線程mysqladmin kill 被斷開 )。假如你有一個用GET_LOCK()得到的鎖,當你執行RELEASE_LOCK()或你的連接斷開(正常或非正常)時,這個鎖就會解除。 這個函數可用于執行應用程序鎖或模擬記錄鎖定。名稱被鎖定在服務器范圍內。假如一個名字已經被一個客戶端封鎖, GET_LOCK() 會封鎖來自另一個客戶端申請封鎖同一個名字的任何請求。這使對一個封鎖名達成協議的客戶端使用這個名字合作執行建議鎖。然而要知道它也允許不在一組合作客戶端中的一個客戶端封鎖名字,不論是服役的還是非故意的,這樣阻止任何合作中的客戶端封鎖這個名字。一個減少這種情況發生的辦法就是使用數據庫特定的或應用程序特定的封鎖名。例如, 使用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()調用返回 NULL ,原因是鎖'lock1' 杯第二個GET_LOCK()調用解開。

  • INET_ATON(expr) 給出一個作為字符串的網絡地址的點地址表示,返回一個代表該地址數值的整數。地址可以是4或8比特地址。 mysql> SELECT INET_ATON('209.207.224.40');-> 3520061480

產生的數字總是按照網絡字節順序。如上面的例子,數字按照 209×2563 + 207×2562 + 224×256 + 40 進行計算。

INET_ATON() 也能理解短格式 IP 地址:

mysql> SELECT INET_ATON('127.0.0.1'), INET_ATON('127.1'); -> 2130706433, 2130706433

注釋: 在存儲由INET_ATON() 產生的值時,推薦你使用 INT UNSIGNED 列。假如你使用 (帶符號) INT列, 則相應的第一個八位組大于127的IP 地址值會被截至 2147483647 (即, INET_ATON('127.255.255.255') 所返回的值)。

  • INET_NTOA(expr) 給定一個數字網絡地址 (4 或 8 比特),返回作為字符串的該地址的電地址表示。

    mysql> SELECT INET_NTOA(3520061480);-> '209.207.224.40'
  • IS_FREE_LOCK(str) 檢查名為str的鎖是否可以使用 (換言之,沒有被封鎖)。若鎖可以使用,則返回 1 (沒有人在用這個鎖), 若這個鎖正在被使用,則返回0 ,出現錯誤則返回 NULL (諸如不正確的參數 )。

  • IS_USED_LOCK(str) 檢查名為str的鎖是否正在被使用(換言之,被封鎖)。若被封鎖,則返回使用該鎖的客戶端的連接標識符。否則返回 NULL。

  • MASTER_POS_WAIT(log_name,log_pos[,timeout]) 該函數對于控制主從同步很有用處。它會持續封鎖,直到從設備閱讀和應用主機記錄中所有補充資料到指定的位置。返回值是其為到達指定位置而必須等待的記錄事件的數目。若從設備SQL線程沒有被啟動、從設備主機信息尚未初始化、參數不正確或出現任何錯誤,則該函數返回 NULL。若超時時間被超過,則返回-1。若在MASTER_POS_WAIT() 等待期間,從設備SQL線程中止,則該函數返回 NULL。若從設備由指定位置通過,則函數會立即返回結果。

假如已經指定了一個超時時間值,當 超時時間 秒數經過后MASTER_POS_WAIT()會停止等待。超時時間 必須大于 0;一個為零或為負值的 超時時間 表示沒有超時時間。

  • NAME_CONST(name,value) 返回給定值。 當用來產生一個結果集合列時, NAME_CONST()促使該列使用給定名稱。 mysql> SELECT NAME_CONST('myname', 14);

這個函數被添加進 MySQL 5.0.12。它只做內部使用。

  • RELEASE_LOCK(str) 解開被GET_LOCK()獲取的,用字符串str 所命名的鎖。若鎖被解開,則返回 1,若改線程尚未創建鎖,則返回0 (此時鎖沒有被解開 ), 若命名的鎖不存在,則返回 NULL。若該鎖從未被對GET_LOCK()的調用獲取,或鎖已經被提前解開,則該鎖不存在。

  • SLEEP(duration) 睡眠(暫停) 時間為duration 參數給定的秒數,然后返回 0。若 SLEEP() 被中斷,它會返回 1。 duration 或許或包括一個給定的以微秒為單位的分數部分。

  • UUID() 返回一個通用唯一標識符(UUID) ,其產生的根據是《DCE 1.1: 遠程過程調用》 (附錄A) CAE (公共應用軟件環境) 的說明,該作品于1997年10月由 The Open Group 出版 (文件編號 C706,?http://www.opengroup.org/public/pubs/catalog/c706.htm). UUID被設計成一個在時間和空間上都獨一無二的數字。2個對UUID() 的調用應產生2個不同的值,即使這些調用的執行是在兩個互不相連的單獨電腦上進行。 UUID 是一個由5位十六進制數的字符串表示的128比特數字 ,其格式為 aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee : 前3個數字從一個時間戳產生。 第4 個數字保持暫時唯一性,以防時間戳值失去單一性 (例如, 由于經濟時)。 第5個數字是一個 IEEE 802 節點號,它提供空間唯一性。若后者不可用,則用一個隨機數字替換。 (例如, 由于主機沒有以太網卡,或我們不知道怎樣在你的操作系統上找到界面的機器地址 )。假若這樣,空間唯一性就不能得到保證。盡管如此,一個沖突的發生機率還是非常低的。 目前,一個界面的 MAC 地址盡被FreeBSD 和 Linux考慮到。在其它操作系統中, MySQL使用隨機產生的 48比特數字。

    mysql> SELECT UUID();-> '6ccd780c-baba-1026-9564-0040f4311e29'

注意, UUID() 不支持復制功能。

  • VALUES(col_name) 在一個INSERT … ON DUPLICATE KEY UPDATE …語句中,你可以在UPDATE 子句中使用 VALUES(col_name)函數,用來訪問來自該語句的INSERT 部分的列值。換言之,UPDATE 子句中的 VALUES(col_name) 訪問需要被插入的col_name 的值,并不會發生重復鍵沖突。這個函數在多行插入中特別有用。 VALUES()函數只在INSERT ... UPDATE 語句中有意義,而在其它情況下只會返回 NULL。

轉載于:https://www.cnblogs.com/yangxiao99/p/4728459.html

總結

以上是生活随笔為你收集整理的(大数据工程师学习路径)第五步 MySQL参考手册中文版----MySQL函数和操作符的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。