iT邦幫忙

DAY 30
8

只談MySQL系列 第 30

只談MySQL (第30天) 系統函數(上)

MySQL提供的系統函數及運算子的清單如下列連結網頁:
http://dev.mysql.com/doc/refman/5.1/en/func-op-summary-ref.html昨天已討論過運算子, 今天我們來分享和系統函數有關的討論, 為系統函數相當多, 所以分成上中下三集來分享...(咦! 鐵人賽不到到今天為止? 我還沒把MySQL談完, 欲罷不能, 只好繼續..)
MySQL的函數大列9大類:

  1. 流程控制函數

  2. 字串函數

  3. 數值函數

  4. 日期時間函數

  5. 全文檢索函數

  6. 型別轉換函數

  7. XML函數

  8. 其他函數

  9. 用在Group By場合下的函數
    受限於字數, 今天先介紹前兩類....

  10. 流程控制函數

    • CASE: 是用來做多重判斷與選擇
      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
    • 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'
    • IFNULL(): 有兩個參數, 若第一個參數值不為NULL, 回傳第一個參數, 否則回傳第二個參數
      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'
    • NULLIF(): 有兩個參數, 若兩個參數值相等, 回傳NULL, 若不等則回傳第一個參數值
      mysql> SELECT NULLIF(1,1);
      -> NULL
      mysql> SELECT NULLIF(1,2);
      -> 1
  11. 字串函數(實在好多, 太特殊的才提供範例了)

    • ASCII(): 回傳參數字串最左一個字元的ASCII數值
    • BIN(): 回傳參數的二進位表示字串
    • BIT_LENGTH(): 回傳參數的值佔有多少個Bits, 例如:
      mysql> SELECT BIT_LENGTH('text');
      -> 32
    • CHAR_LENGTH(), CHARACTER_LENGTH(): 回傳參數的字數, 例如CHAR_LENGTH('鐵人賽');回傳3, 雖然是雙位元字, 但CHAR_LENGTH()函數仍然回傳只有三個中文字
    • CHAR(): 回傳十進位整數參數值所代表的ASCII字元
    • CONCAT_WS(): 第一個參數是分隔字元, 其他參數串連時, 以這個分隔字元來分隔各字串值, 例如:
      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(): 合併兩個參數字串
    • ELT(): 回傳第一個參數所指的字串, 如下例,
      mysql> SELECT ELT(1, 'ej', 'Heja', 'hej', 'foo');
      -> 'ej'
      mysql> SELECT ELT(4, 'ej', 'Heja', 'hej', 'foo');
      -> 'foo'
      mysql> SELECT ELT(0, 'ej', 'Heja', 'hej', 'foo');
      -> NULL
      mysql> SELECT ELT(6, 'ej', 'Heja', 'hej', 'foo');
      -> NULL
      如果第一個參數小於1, 或大於總字串數, 則回傳NULL
    • EXPORT_SET():
      有五個參數, 第一個參數是要轉換為二進位位元的數值, 第二個參數是對應於位元值為1, 第三個參數對應於位元值0, 第四個參數是分隔字元, 預設值為',', 第五個參數是字串長度, 預設值為64
      第四、五個參數可以省略而以預設值帶入, 這函數做什麼用途? 我們以例子說明:
      mysql> SELECT EXPORT_SET(5,'Y','N',',',4);
      -> 'Y,N,Y,N'
      第一個參數值為5, 換算成二進位是'101', 由右到左來看, 第一個位元是1, 所以顯示Y, 第二個位元是0, 顯示N, 第三個位元是1, 顯示Y, 第五個參數是4, 需要第4個字元, 帶進N, 所以得到字串'Y,N,Y,N'
      mysql> SELECT EXPORT_SET(6,'1','0',',',10);
      -> '0,1,1,0,0,0,0,0,0,0'
      第一個參數值為6, 換算成二進位為'110', 由右到左來看, 第一個位元是0, 所以顯示0, 第二個位元是1, 顯示1, 第三個位元是1, 顯示1, 第五個參數是10, 需要補其他七個字元, 帶進0, 所以得到字串'0,1,1,0,0,0,0,0,0,0'
    • FIELD(): 第一個參數是要查詢的字串一第二個開始的字串是被查詢字串, FIELD()函數傳回第一個參數在其他參數中能找到的第一個位置, 例如:
      mysql> SELECT FIELD('ej', 'Hej', 'ej', 'Heja', 'hej', 'foo');
      -> 2 雖然'Hej'包含'ej', 但不被視為相同
      mysql> SELECT FIELD('fo', 'Hej', 'ej', 'Heja', 'hej', 'foo');
      -> 0 找不到時, 回傳0
    • FIND_IN_SET(): 回傳第一個參數在第二個參數中的位置, 例如FIND_IN_SET('b', 'a,b,c')回傳2, FIND_IN_SET('b', 'abcd')回傳0
    • FORMAT(): 舉例來說明比較容易瞭解
      mysql> SELECT FORMAT(12332.123456, 4);
      -> '12,332.1235'
      mysql> SELECT FORMAT(12332.1,4);
      -> '12,332.1000'
    • HEX(): 回傳參數的十六進位表示字串
    • INSERT(): 舉例說明,
      mysql> SELECT INSERT('Quadratic', 3, 4, 'What');
      -> 'QuWhattic' 由第一個參數的第三個字元開始數起的四個元換成'What'
      mysql> SELECT INSERT('Quadratic', -1, 4, 'What');
      -> 'Quadratic' -1..所以都沒換
      mysql> SELECT INSERT('Quadratic', 3, 100, 'What');
      -> 'QuWhat' 100超出可換的字數, 所以全部換成'What'
    • INSTR(): 回傳第二個參數字串在第一個參數字串中的位置
    • LCASE(): 回傳小寫字母字串
    • LEFT(): 回傳第一個參數中左邊第一位數起到第二個參數值指定的長度的字串
    • LENGTH(): 回傳參數字串長度
    • LOAD_FILE(): 看例子
      mysql> UPDATE t
      SET blob_col=LOAD_FILE('/tmp/picture')
      WHERE id=1;
      把/tmp/picture檔案內容讀入再寫到資料表t的blob_col欄位中
    • LOCATE(): 回傳第一個參數字串在第二個參數字串中的位置, 和INSTR()函數的作用一樣, 但參數位置相反
    • LOWER(): 回傳小寫字母字串, 同LCASE()
    • LPAD(): 看例子吧
      mysql> SELECT LPAD('hi',4,'??');
      -> '??hi' 在字串前補足指定字元
    • LTRIM(): 移除字串開頭空白
    • MAKE_SET(): 不太懂這個函數的用法, 搞懂再來分享
    • MID(): 回傳第一個參數字串中, 由第二個參數所指的位置開始第三個參數值長度的字串, 例如: MID('Return a substring.', 3, 4)傳回'turn'
    • OCTET_LENGTH(): 相當於LENGTH()函數功能
    • ORD(): 傳回字元在ASCII表中的順序值, 例如ORD('2')傳回50, 與ASCII()數作用相同
    • POSITION(): 作用同LOCATE()函數
    • QUOTE(): 舉例來說明
      mysql> SELECT 'Don't!';
      -> Don't!
      mysql> SELECT Quote('Don't!');
      -> 'Don't!' |
    • REPEAT(): 將第一個參數的字串重覆第二個字串所指定的次數
    • REPLACE(): 將第一個參數中, 第二個參數所指的字串, 以第三個參數來取代
    • REVERSE(): 將參數字串反轉顯示, 例如REVERSE('ABC'), 傳回'CBA'
    • RIGHT(): 回傳第一個參數字串中由右邊數起的第二個參數所指定的長度的字串
    • RPAD(): 舉例來說明
      mysql> SELECT RPAD('hi',5,'?');
      -> 'hi???' 在右邊補足字元
    • RTRIM(): 移除參數字串中右邊的空白字元
    • SOUNDEX(): 不太懂這個函數, 搞懂再分享
    • SPACE(): 傳回參數所指定的長度的空白字元字串
    • STRCMP(): 比較兩個字串, 參見"運算子"的分享中說明
    • SUBSTRING_INDEX(): 看例子
      mysql> SELECT SUBSTRING_INDEX('www.mysql.com', '.', 2);
      -> 'www.mysql' 由第一個字元數到第二個句點出現之前, 第一個參數字串是要取值的字串, 第二個參數是要找的字元, 第三個參數是找第幾個
      mysql> SELECT SUBSTRING_INDEX('www.mysql.com', '.', -2);
      -> 'mysql.com' 用了負數, 所以是由右邊開始找
    • SUBSTR(), SUBSTRING(): 回傳指定的子字串, 同MID()函數用法
    • TRIM(): 刪去字串開始與尾巴的空白字元
    • UCASE(): 傳回大寫英文字母字串, 同UPPER()
    • UNHEX()(v4.1.2): 將十六進位字串轉換為所代表的文字
    • UPPER(): 傳回大寫英文字母字串

其他7類函數及MySQL還沒談完的技術, 我會繼續分享下去...


上一篇
只談MySQL (第29天) MySQL的運算子
系列文
只談MySQL30

1 則留言

0

加油啊!今天您就多po幾篇吧!
恭喜您變成鐵賽大啦!(放炮、放樂,賀~!)

我要留言

立即登入留言