一步一步學MySQL---18 MySQL常用函式(1)
18.1 字串函式
MySQL所支援的字串函式有:
函式 | 功能 |
---|---|
CANCAT(str1,str2,…strn) | 連線字串str1、str2、……、strn為一個完整字串 |
INSERT(str,x,y,instr) | 將字串str從第x位置開始,y個字元長的子串替換為字串instr |
LOWER(str) | 將字串str中所有字元變為小寫 |
UPPER(str) | 將字串str中所有字元變為大寫 |
LEFT(str,x) | 返回字串str最左邊的x個字元 |
RIGHT(str,x) | 返回字串str最右邊的x個字元 |
LPAD(str,n,pad) | 使用字串pad對字串str最左邊進行填充,直到長度為n個字元長度 |
RPAD(str,n,pad) | 使用字串pad對字串str最右邊進行填充,直到長度為n個字元長度 |
LTRIM(str) | 去掉字串str左邊的空格 |
RTRIM(str) | 去掉字串str右邊的空格 |
REPEAT(str,x) | 返回字串str重複z次的結果 |
REPLACE(str,a,b) | 使用字串b替換字串str中所有出現的字串a |
STRCMP(str1,str2) | 比較字串str1和str2 |
TRIM(str) | 去掉字串str行頭和行尾的空格 |
SUBSTRING(str,x,y) | 返回字串str中從x位置起y個字串長度的字串 |
18.1.1 合併字串函式CONCAT()和CONCAT_WS()
語法:
CONCAT(S1,S2,…,SN) 或者 CONCAT_WS(SEP,S1,S2,…,SN)
(1)mysql> select concat(“My”,”S”,”QL”) 合併後的字串;
(2)mysql> select concat(“My”,”S”,”QL”,NULL) 合併後的字串;
(3)mysql> select concat(curdate(),18.35) 合併後的字串;
(4)
mysql> select concat_ws(‘|’,curdate(),18.35) 合併後的字串;
mysql> select concat_ws(‘-‘,’0514’,88461234) 合併後的字串;
mysql> select concat_ws(NULL,’0514’,88461234) 合併後的字串;
mysql> select concat_ws(‘-‘,’0514’,NULL,88461234) 合併後的字串;
說明:
(1)當函式CONCAT()傳入的引數中有一個NULL時,返回的結果將為NULL。
(2)函式CONCAT()不僅可以接受字串引數,還可以接受其他型別的引數。
(3)函式CONCAT_WS()是函式CONCAT()的特殊形式,其形如CONCAT_WS(SEP,s1,s2,…,sn),與CONCAT()相比,多了一個表示分隔符的SEP引數,即不僅將傳入的引數連線起來,而且還會通過分隔符將各個字串隔開。
(4)函式CONCAT_WS()中分隔符可以是一個字串,也可以是其他引數。如果分隔符是NULL,則返回的結果將為NULL。
(5)函式CONCAT_WS()中當分隔符引數後的值存在NULL時,返回的結果將忽略NULL。
18.1.2 比較字串大小的函式STRCMP()
語法:
STRCMP(str1,str2)
說明:如果引數str1大於str2,則結果返回1;如果引數str1小於str2,則結果返回-1;如果引數str1等於str2,則結果返回0。
mysql> select strcmp(“abc”,”abd”),
-> strcmp(“abc”,”abc”),
-> strcmp(“abc”,”abb”);
18.1.3 獲取字串長度函式LENGTH()和字元數函式CHAR_LENGTH()
語法:
LENGTH(str) 或者 CHAR_LENGTH(str)
mysql> select “MySQL” 英文字串,
-> length(“MySQL”) 字串位元組長度,
-> char_length(“MySQL”) 字串字元數,
-> “上海浦東” 中文字串,
-> length(“上海浦東”) 字串位元組長度,
-> char_length(“上海浦東”) 字串字元數;
說明:MySQL中,英文字元佔1個位元組;對於漢字字元,如果用的字符集是GBK,則漢字字元佔2個位元組,如果用的字符集是UTF-8,則漢字字元佔3個位元組。由於本機使用的預設字符集是UTF-8
檢視MySQl預設字符集命令:
mysql> SHOW VARIABLES LIKE ‘character%’;
mysql> SHOW VARIABLES LIKE ‘collation_%’;
18.1.4 實現字母大小寫轉換函式UPPER()和LOWER()
MySQL中可以通過UPPER()和UCASE()函式實現將字串的所有字母轉換成大寫字母。
語法:
UPPER(s) 或者 UCASE(s)
mysql> select “mysql” 字串,
-> upper(‘mysql’) 轉換後字串,
-> ucase(“mysql”) 轉換後字串;
MySQL中可以通過LOWER()和LCASE()函式實現將字串的所有字母轉換成大寫字母。
語法:
LOWER(s) 或者 LCASE(s)
mysql> select ‘MYSQL’ 字串,
-> lower(“MYSQL”) 轉換後字串,
-> lcase(‘MYSQL’) 轉換後字串;
18.1.5 返回字串位置的函式FIND_IN_SET()
MySQL中通過函式FIND_IN_SET()來獲取相匹配字串的位置。
語法:
FIND_IN_SET(str1,str2)
說明:上述函式返回字串str2中與str1相匹配的字串位置,引數str2中將包含若干個用逗號隔開的字串。
mysql>select find_in_set(‘ShangHai’,’BeiJing,TianJin,NanJing,ShangHai’);
18.1.6 返回指定字串位置的函式FIELD()
MySQL中通過函式FIELD()來獲取相匹配字串的位置
語法:
FIELD(str,str1,str2,…)
說明:上述函式返回第一個與字串str相匹配的字串的位置
mysql> select field(‘ShangHai’,’BeiJing’,’TianJin’,’NanJing’,’ShangHai’);
18.1.7 返回字串相匹配的開始位置
MySQL中通過三個函式來獲取子字串相匹配的開始位置,分別是LOCATE()、POSITION()和INSTR()。
語法:
LOCATE(str1,str) //返回引數str中字串str1的開始位置
POSITION(str1 in str) //返回引數str中字串str1的開始位置
INSTR(str, str1) //返回引數str中字串str1的開始位置
mysql> select locate(‘SQL’, ‘MySQl’),
-> position(‘SQL’ in ‘MySQL’),
-> instr(‘MySQL’, ‘SQL’);
18.1.8 返回指定位置的字串ELT()函式
MySQL中通過函式ELT()來獲取指定位置的字串。
語法:
ELT(n,str1,str2…) //返回第n和字串
mysql> select elt(3,’ShangHai’,’BeiJing’,’TianJin’,’NanJing’,’HangZhou’);
18.1.9 選擇字串的MAKE_SET()函式
MySQL中通過函式MAKE_SET()來獲取字串。
語法:
MAKE_SET(num,str1,str2,..strn)
說明:上述函式首先將num轉換成二進位制數,然後按照二進位制數從引數str1,str2,…,strn中選擇相應的字串。在通過二進位制數來選擇字串時,按從右到左的順序讀取該值,如果值為1,則選擇該字串,否則不選該字串。
例如:
mysql> select bin(5) 二進位制數,make_set(5,’ShangHai’,’BeiJing’,’Tianjin’,’NanJing’,’HangZhou’),
-> bin(7) 二進位制數,make_set(7,’ShangHai’,’BeiJing’,’Tianjin’,’NanJing’,’HangZhou’);
說明:由於數值5的二進位制數為101,所以選擇第一個和第三個字串;數值7的二進位制數為111,所以選擇第一個、第二個和第三個字串
18.1.10 從現有字串中擷取子字串
(1)從左邊或右邊擷取子字串
語法:
LEFT(str,num) //返回字串str中的包含前num個字母(從左邊數)的字串
RIGHT(str,num) //返回字串str中的包含後num個字母(從右邊數)的字串
例如:
mysql> select “MySQL” 字串,
-> left(“MySQL”,2) 前2個字母的字串,
-> right(“MySQL”,3) 後3個字母的字串;
(2)擷取指定位置和長度的子字串
語法:
SUBSTRING(str,num,len) 和MID(str,num,len) //返回字串str中的第num個位置開始長度為len的子字串
例如:
mysql> select “oraclemysql” 字串,
-> substring(“oraclemysql”,7,5) 擷取的子字串,
-> mid(“oraclemysql”,7,5) 擷取的子字串;
18.1.11 去除字串首尾的空格
(1)去除字串開始處的空格
語法:
LTRIM(str) //返回去掉開始處空格的字串
例如:
執行SQl語句LTRIM()函式,去除掉字串“ MySQL ”左邊的空格。在具體處理時,操作的字串為“ MySQL ”,該字串的左右兩邊各有一個空格。因為空格顯示不太明顯,所以在該字串左右兩邊與字元“-”連線起來。
mysql> select concat(‘-‘,’ MySQL ‘,’-‘) 原來的字串,
-> char_length(concat(‘-‘,’ MySQL ‘,’-‘)) 原來的字串長度,
-> concat(‘-‘,ltrim(’ MySQL ‘),’-‘) 去除開始空格後的字串,
-> char_length(concat(‘-‘,ltrim(’ MySQL ‘),’-‘)) 去除開始空格後的字串長度
(2)去除字串結尾處的空格
語法:
RTRIM(str) //返回去掉結尾處空格的字串
例如:
執行SQl語句RTRIM()函式,去除掉字串“ MySQL ”左邊的空格。在具體處理時,操作的字串為“ MySQL ”,該字串的左右兩邊各有一個空格。因為空格顯示不太明顯,所以在該字串左右兩邊與字元“-”連線起來。
mysql> select concat(‘-‘,’ MySQL ‘,’-‘) 原來的字串,
-> char_length(concat(‘-‘,’ MySQL ‘,’-‘)) 原來的字串長度,
-> concat(‘-‘,rtrim(’ MySQL ‘),’-‘) 去除結尾空格後的字串,
-> char_length(concat(‘-‘,rtrim(’ MySQL ‘),’-‘)) 去除結尾空格後的字串長度;
(3)去除字串首尾處的空格
語法:
TRIM(str) //返回去掉結尾處空格的字串
例如:
執行SQl語句TRIM()函式,去除掉字串“ MySQL ”左邊的空格。在具體處理時,操作的字串為“ MySQL ”,該字串的左右兩邊各有一個空格。因為空格顯示不太明顯,所以在該字串左右兩邊與字元“-”連線起來。
mysql> select concat(‘-‘,’ MySQL ‘,’-‘) 原來的字串,
-> char_length(concat(‘-‘,’ MySQL ‘,’-‘)) 原來的字串長度,
-> concat(‘-‘,trim(’ MySQL ‘),’-‘) 去除首尾空格後的字串,
-> char_length(concat(‘-‘,trim(’ MySQL ‘),’-‘)) 去除首尾空格後的字串長度;
18.1.12 替換字串
(1)使用INSERT()函式
語法:
INSERT(str,pos,len,newstr) //將字串str中的pos位置開始的len長度的字串用newstr字串替換
注意:
- 如果引數pos的值超過str字串長度,則返回值為原始字串str;
- 如果len的長度大於原來字串str中所剩字串的長度,則從位置pos開始進行全部替換;
- 若任何一個引數為NULL,則返回值為NULL。
例如:
mysql> select “這裡是MySQl資料庫管理系統” 字串,
-> insert(“這裡是MySQl資料庫管理系統”,4,5,”Redis”) 轉換後的字串;
mysql> select “這裡是MySQl資料庫管理系統” 字串,
-> insert(“這裡是MySQl資料庫管理系統”,16,5,”Redis”) 轉換後的字串;
mysql> select “這裡是MySQl資料庫管理系統” 字串,
-> insert(“這裡是MySQl資料庫管理系統”,17,5,”Redis”) 轉換後的字串;
注意:我們看到字串“這裡是MySQL資料庫管理系統”一共有15個字元,為什麼我們從第16和第17位置處(均大於15)替換的結果不一樣?這是因為,MySQL中,字串的末尾有一個‘\0’字元,所以從第16位置處替換還沒有超出原來字串的長度,而從第17位置處替換就是超出了原來字串的長度了,所以後者返回原來的字串。
mysql> select “這裡是MySQl資料庫管理系統” 字串,
-> insert(“這裡是MySQl資料庫管理系統”,4,14,”Redis”) 轉換後的字串;
(2)使用REPLACE()函式
語法:
REPLACE(str,substr,newstr) //將str中的子字串substr用新字串newstr替換
例如:
mysql> select “這裡是MySQl資料庫管理系統” 字串,
-> replace(“這裡是MySQl資料庫管理系統”,”MySQl”,”Redis”) 替換後的字元;