iT邦幫忙

4

只談MySQL (第32天) 系統函數(下一)

MySQL提供的系統函數及運算子的清單如下列連結網頁:
http://dev.mysql.com/doc/refman/5.1/en/func-op-summary-ref.html
前兩天已討論過部分的系統函數, 今天繼續討論...
MySQL的函數大列9大類:

  1. 流程控制函數
  2. 字串函數
  3. 數值函數
  4. 日期時間函數
  5. 全文檢索函數
  6. 型別轉換函數
  7. XML函數
  8. 其他函數
  9. 用在Group By場合下的函數
    今天介紹6. 型別轉換函數, 7. XML函數, 8. 其他函數, 9. 用在Group By場合下的函數
  10. 型別轉換函數
  • BINARY: 將字串參數轉換為二進位制的字串
    這不是說會回傳二進位制字串, 因為BINARY不是函數運作方式, 而是"修飾詞"...我們用例子來討論

    mysql> SELECT 'a' = 'A';
    -> 1 <-- 在MySQL大小寫不分, 所以"'a' = 'A'"條件句的結果是真(True, 也可以1表示)
    mysql> SELECT BINARY 'a' = 'A';
    -> 0 <-- 用了Binary來"修飾", 'a'的二進位值和'A'的二進位值不同, 所以得到0(False)
    mysql> SELECT 'a' = 'a ';
    -> 1
    mysql> SELECT BINARY 'a' = 'a ';
    -> 0

  • CAST(), Convert(): 將第一個參數的值, 以第二個參數指定的資料型態來表示
    可用於指定轉換的資料型態有: BINARY[(N)], CHAR[(N)], DATE, DATETIME, DECIMAL[(M[,D])], SIGNED [INTEGER], TIME, UNSIGNED [INTEGER]
    CAST('2009-11-13' AS DATE)和CONVERT('2009-11-13', DATE)都是一樣的用法, CONVERT還有另外一種用法是搭配USING做字元集轉換, 例如CONVERT('XYZ' USING utf8);將字串'XYZ'轉換為utf8字元集

  1. XML函數
    現在的資料庫多半支援XML的應用, MySQL也不例外, 在MySQL中與XMP有關的只有兩個
  • ExtractValue()(v5.1.5):以XPath標記找到XML字串中的某一欄值, 我們來看看例子

    mysql> SET @xml = 'XY';
    Query OK, 0 rows affected (0.00 sec)

    mysql> SET @i =1, @j = 2;
    Query OK, 0 rows affected (0.00 sec)

    mysql> SELECT @i, ExtractValue(@xml, '//b[$@i]'); <-- '//b[$@i]'相當於'//b[1]', 這就是XPath標記, 找出第一個..的值
    +------+--------------------------------+
    | @i | ExtractValue(@xml, '//b[$@i]') |
    +------+--------------------------------+
    | 1 | X |
    +------+--------------------------------+
    1 row in set (0.00 sec)

    mysql> SELECT @j, ExtractValue(@xml, '//b[$@j]');
    +------+--------------------------------+
    | @j | ExtractValue(@xml, '//b[$@j]') |
    +------+--------------------------------+
    | 2 | Y |
    +------+--------------------------------+
    1 row in set (0.00 sec)

    mysql> SELECT @k, ExtractValue(@xml, '//b[$@k]');
    +------+--------------------------------+
    | @k | ExtractValue(@xml, '//b[$@k]') |
    +------+--------------------------------+
    | NULL | |
    +------+--------------------------------+
    1 row in set (0.00 sec)

  • UpdateXML()(v5.1.5): 傳回被更新的XML片斷

    mysql> SELECT
    -> UpdateXML('ccc', '/a', 'fff') AS val1,
    -> UpdateXML('ccc', '/b', 'fff') AS val2,
    -> UpdateXML('ccc', '//b', 'fff') AS val3,
    -> UpdateXML('ccc', '/a/d', 'fff') AS val4,
    -> UpdateXML('ccc', '/a/d', 'fff') AS val5
    -> \G

    val1: fff
    val2: ccc
    val3: fff
    val4: cccfff
    val5: ccc

  1. 其他函數
    MySQL還提供一些其他系統不常見的函數, 諸如

位元運算函數: 例如BIT_COUNT
壓密和壓縮函數: 例如PASSWORD()、ENCODE()、DECODE()等等, PASSWORD()是用來產生加密密碼的函數
MySQL資料庫系統訊息函數: 像是SCHEMA()、ROW_COUNT()、VERSION()、USER()等等函數
其他雜項函數: 如SLEEP()函數
由於這些函數的用途相當廣泛, 我只說明部份與MySQL資料庫系訊息有關的函數, 其他的部份就留待有興趣的網友自行研究MySQL文件了. 幾個與資料庫系統訊息相關的函數如下列:

  • BENCHMARK(): 重覆執行第二個參數的SQL指令, 共執行第一個參數指定的次數, 例如

    mysql> SELECT BENCHMARK(1000000, (SELECT user FROM USER));
    +---------------------------------------------+
    | BENCHMARK(1000000, (SELECT user FROM USER)) | <-- 要注意的是, SELECT必須只有一個欄位, 多了就不能執行
    +---------------------------------------------+
    | 0 |
    +---------------------------------------------+
    1 row in set (0.06 sec)

    mysql> SELECT BENCHMARK(100000000, (SELECT user FROM USER));
    +-----------------------------------------------+
    | BENCHMARK(100000000, (SELECT user FROM USER)) | <-- 增加執行次數, 看看會花多久時間
    +-----------------------------------------------+
    | 0 |
    +-----------------------------------------------+
    1 row in set (2.91 sec)

  • CHARSET()(v4.1.0): 傳回參數的所屬字元集, 例如CHARSET(CONVERT('XYZ' USING utf8))傳回'utf8'

  • CONNECTION_ID(): 回傳SESSION的資料庫連線ID

  • CURRENT_USER(), CURRENT_USER: 回傳SESSION的資料庫連線帳號名稱和主機名稱, 例如'root@localhost'

  • DATABASE(), SCHEMA()(v5.0.2): 傳回SESSION正在使用的資料庫名稱

  • FOUND_ROWS(): 回傳SELECT指令找到的資料錄數目, 使用上有些限制, 必需要在需要提供資料錄數的SELECT指令中加入SQL_CALC_FOUND_ROWS修飾詞, 例如

    mysql> SELECT SQL_CALC_FOUND_ROWS user FROM USER;
    +-------+
    | user |
    +-------+
    | simon |
    | root |
    +-------+
    2 rows in set (0.00 sec)

    mysql> SELECT FOUND_ROWS();
    +--------------+
    | FOUND_ROWS() |
    +--------------+
    | 2 |
    +--------------+
    1 row in set (0.00 sec)

  • LAST_INSERT_ID(): 有時候, 我們會在資料表中用一些自動增加序號的欄位, 這個函數就是用來查詢最近使用的最大序號為何的函數.

  • ROW_COUNT()(v5.0.1): 回傳最近一次INSERT、UPDATE、DELETE指令所處理的資料錄的數目

  • USER(), SESSION_USER(), SYSTEM_USER(): 由Client端連線到資料庫的Session使用的帳號與主機名稱

  • VERSION(): 回傳正在使用的MySQL資料庫的版本編號

<<還有最後一個與GROUP BY有關的函數, 放在另一篇了...續>>


尚未有邦友留言

立即登入留言