1:字符串連接函數
代碼如下 復制代碼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是concat的變體:
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)。
這個函數和php的explode和implode、list、extract相似了。有興趣的可以看看php的手冊。
2:字符串剪接函數
INSERT(str,pos,len,newstr)
這個函數,mysql中文手冊翻譯得太爛了,還是偶自己來吧:
這個函數返回一個字符串:
A:str字符串從位置pos(從1開始計算)開始(含第pos位),之後的pos位被字符串newstr取代;
B:如果pos大於str的長度,則從str後面開始銜接;
C:如果因len超出余後的長度,則位置pos之後(含第pos位)全被取代;
D:如果pos為負數,返回str;
E:如果len為負數,則情同len超出余後的長度,這和php的substr之類的函數不一樣。
以下是代碼片段:
mysql> SELECT INSERT('Quadratic', 3, 4, 'What');
-> 'QuWhattic'
mysql> SELECT INSERT('Quadratic', -1, 4, 'What');
-> 'Quadratic'
mysql> SELECT INSERT('Quadratic', 3, 100, 'What');
-> 'QuWhat'
這個函數支持多字節字元。
3:進制轉換函數
CONV(N,from_base,to_base)
不同數基間轉換數字。返回值為數字的N字符串表示,由from_base基轉化為 to_base 基。如有任意一個參數為NULL,則返回值為 NULL。自變量 N 被理解為一個整數,但是可以被指定為一個整數或字符串。最小基數為 2 ,而最大基數則為 36。 If to_base 是一個負數,則 N 被看作一個帶符號數。否則, N 被看作無符號數。 CONV() 的運行精確度為 64比特。
以下是代碼片段:
請看PHP的:
base_convert — 在任意進制之間轉換數字
說明:
string base_convert ( string $number , int $frombase , int $tobase )
返回一字符串,包含 number 以 tobase 進制的表示。number 本身的進制由 frombase 指定。frombase 和 tobase 都只能在 2 和 36 之間(包括 2 和 36)。高於十進制的數字用字母 a-z 表示,例如 a 表示 10,b 表示 11 以及 z 表示 35。
MySQL的進制轉換函數還有一個,是一個為16進制而定義的函數:
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
4:字符查找定位函數
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'
看見上面這個函數,還以為主要起邏輯判斷用的,如:
以下是代碼片段:
但是一看下面的函數,才明白不僅僅如此:
FIELD(str,str1,str2,str3,...)
返回值為str1, str2, str3,……列表中的str 指數。在找不到str 的情況下,返回值為 0 。
如果所有對於FIELD() 的參數均為字符串,則所有參數均按照字符串進行比較。如果所有的參數均為數字,則按照數字進行比較。否則,參數按照雙倍進行比較。
如果str 為NULL,則返回值為0 ,原因是NULL不能同任何值進行同等比較。FIELD() 是ELT()的補數。
以下是代碼片段:
這個函數與php中的array_search和array_key_exists、in_array、isset還是有相似作用的。
再看一下下面這個,不禁拍案叫絕了,直接就是in子句了:
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
5:數字格式化函數
FORMAT(X,D)
將數字X 的格式寫為'#,###,###.##',以四捨五入的方式保留小數點後 D 位, 並將結果以字符串的形式返回。若 D 為 0, 則返回結果不帶有小數點,或不含小數部分。
以下是代碼片段:
字符串比較中有以下四個規則:
1:MySQL 會自動將數字轉化為字符串,反之亦然。
2:若想要將數字明確地轉化為字符串,可使用 CAST()或 CONCAT()函數。
3:若已經對一個字符串函數給定一個二進制字符串作為參數, 則所得到的結果字符串也是一個二進制字符串。
4:一般而言, 若字符串比較中任意一個表達式是區分大小寫的,則執行比較時也區分大小寫。
下面根據以上說的三類進行學習:
一:使用like子句
expr LIKE pat [ESCAPE 'escape-char']
模式匹配,使用SQL簡單正規表達式比較。返回1 (TRUE) 或 0 (FALSE)。 若 expr 或 pat 中任何一個為 NULL,則結果為 NULL。
模式不需要為文字字符串。例如,可以被指定為一個字符串表達式或表列。
在模式中可以同LIKE一起使用以下兩種通配符:
字符
說明
%
匹配任何數目的字符,甚至包括零字符
_
只能匹配一種字符
以下是代碼片段:
代碼如下 復制代碼mysql> SELECT 'David!' LIKE 'David_';
-> 1
mysql> SELECT 'David!' LIKE '%D%v%';
-> 1
若要對通配符的文字實例進行檢驗, 可將轉義字符放在該字符前面。如果沒有指定 ESCAPE字符, 則假設為‘’。這個和一般的編程語言是一樣的。
字符串
說明
%
匹配一個 ‘%’字符
_
匹配一個 ‘_’ 字符
以下是代碼片段:
mysql> SELECT 'David!' LIKE 'David_';
-> 0
mysql> SELECT 'David_' LIKE 'David_';
-> 1
也可以指定一個不同的轉義字符,需使用ESCAPE語句:
以下是代碼片段:
以下兩個語句舉例說明了字符串比較不區分大小寫,除非其中一個操作數為二進制字符串:
以下是代碼片段:
代碼如下 復制代碼mysql> SELECT 'abc' LIKE 'ABC';
-> 1
mysql> SELECT 'abc' LIKE BINARY 'ABC';
-> 0
在MySQL中, LIKE 允許出現在數字表達式中。 (這是標准SQL LIKE 的延伸)。
以下是代碼片段:
mysql> SELECT 10 LIKE '1%';
-> 1
注釋: 由於 MySQL在字符串中使用 C轉義語法(例如, 用‘n’代表一個換行字符),在LIKE字符串中,必須將用到的‘’雙寫。例如, 若要查找 ‘n’, 必須將其寫成 ‘\n’。而若要查找 ‘’, 則必須將其寫成 it as ‘\\’;原因是反斜線符號會被語法分析程序剝離一次,在進行模式匹配時,又會被剝離一次,最後會剩下一個反斜線符號接受匹配。
二:使用正則表達式的like子句
expr REGEXP pat expr RLIKE pat
執行字符串表達式 expr 和模式pat 的模式匹配。該模式可以被延伸為正則表達式。正則表達式的語法在附錄G:MySQL正則表達式中有詳細討論。若expr 匹配 pat,則返回 1; 否則返回0。若 expr 或 pat 任意一個為 NULL, 則結果為 NULL。 RLIKE 是REGEXP的同義詞, 作用是為mSQL 提供兼容性。
模式不需要為文字字符串。例如,可以被指定為一個字符串表達式或表列。
注釋:由於在字符串中, MySQL使用 C 轉義語法 (例如, 用‘n’來代表換行字符 ),在REGEXP字符串中必須將用到的‘’ 雙寫。
REGEXP 不區分大小寫, 除非將其同二進制字符串同時使用。
以下是代碼片段:
代碼如下 復制代碼mysql> SELECT 'Monty!' REGEXP 'm%y%%';
-> 0
mysql> SELECT 'Monty!' REGEXP '.*';
-> 1
mysql> SELECT 'new*n*line' REGEXP 'new\*.\*line';
-> 1
mysql> SELECT 'a' REGEXP 'A', 'a' REGEXP BINARY 'A';
-> 1 0
mysql> SELECT 'a' REGEXP '^[a-d]';
-> 1
在確定字符類型時,REGEXP 和 RLIKE 使用當前字符集 (默認為cp1252 Latin1 )。 警告:這些操作符不支持多字節字元。
三:使用函數:STRCMP
STRCMP(expr1,expr2)
若所有的字符串均相同,則返回0;若根據當前分類次序,第一個參數小於第二個,則返回 -1,其它情況返回 1 。
以下是代碼片段:
代碼如下 復制代碼mysql> SELECT STRCMP('text', 'text2');
-> -1
mysql> SELECT STRCMP('text2', 'text');
-> 1
mysql> SELECT STRCMP('text', 'text');
-> 0
在執行比較時,STRCMP() 使用當前字符集。這使得默認的比較區分大小寫,當操作數中的一個或兩個都是二進制字符串時除外。
說明:對於前兩個都有其反操作。見下
代碼如下 復制代碼expr NOT LIKE pat [ESCAPE 'escape-char']
這相當於 NOT (expr LIKE pat [ESCAPE 'escape-char'])。
expr NOT REGEXP pat expr NOT RLIKE pat
這相當於NOT (expr REGEXP pat)。