MySQL提供的系統函數及運算子的清單如下列連結網頁:
http://dev.mysql.com/doc/refman/5.1/en/func-op-summary-ref.html
前兩天已討論過部分的系統函數, 今天繼續討論...
MySQL的函數大列9大類:
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字元集
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
位元運算函數: 例如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有關的函數, 放在另一篇了...續>>