1. 程式人生 > 實用技巧 >MySQL - 函式(FUNCTION)

MySQL - 函式(FUNCTION)

about

MySQL提供了豐富的內建函式自定義函式。

而我們也對這些函式有所瞭解,比如聚合函式。

本篇再來了解一些內建函式和自定義函式的編寫。

寫在前面的話:預設情況下,函式名稱和其後的括號之間必須沒有空格。這有助於MySQL解析器區分函式呼叫和對與函式名稱相同的表或列的引用。但是,函式引數周圍可以有空格。

內建函式

字串相關

SELECT CONCAT('root','@','127.0.0.1');
SELECT CONCAT(USER,'@',HOST) FROM mysql.user;      -- 在合適的位置新增分隔符,較為靈活
SELECT CONCAT_WS('@',USER
,HOST) FROM mysql.user; -- 第一個引數為分隔符 SELECT USER,GROUP_CONCAT(HOST) FROM mysql.user GROUP BY USER; -- 適用於分組,行轉列 SELECT CHAR_LENGTH('ABCD'); -- 返回字串的長度 SELECT CHARACTER_LENGTH('ABCD'); -- 和 CHAR_LENGTH 的同義詞 SELECT LOWER('ABCD'); -- 以小寫形式返回字串 SELECT UPPER('abcd'); -- 以大寫形式返回字串, UPPER 是 UCASE 的同義詞
SELECT TRIM(' ABCD '); -- 去除字串兩邊的空格 SELECT BIN(12); -- 返回十進位制數字的二進位制表示 SELECT OCT(12); -- 返回十進位制數字的八進位制表示 SELECT HEX(12), HEX('ABCD'); -- 返回十進位制數字或者字串的十六進位制的表示形式 SELECT UNHEX(HEX('ABCD')); -- 返回被轉化為十六進位制表示的原始數字或字串

數值相關

SELECT ABS(123);    -- 返回數值的絕對值
SELECT 5 / 2,5 DIV 2;   -- 向下整除
SELECT TRUNCATE
(1.1234,2),TRUNCATE(-1.1234,2); -- 包括指定位數小數,數值可為負數 SELECT PI(); -- 返回6為小數的 Π 值 SELECT SQRT(2); -- 返回引數的平方根

自定義函式

除了內建函式,MySQL還支援自定義函式。

建立

-- 建立一個函式,返回兩個整數之和
DELIMITER //
CREATE FUNCTION f1(
    n1 INT,
    n2 INT)   -- 建立函式 f1 引數可以是MySQL支援的那些型別
RETURNS INT  -- 該函式的返回值也是 int 型別
BEGIN    -- 標識函式體開始
    DECLARE num INT;    -- 定義一個int型別的變數
    SET num = n1 + n2;
    RETURN(num);

END //    -- 標識函式體結束
DELIMITER ;

另外,函式中不能有SELECT語句

執行

SELECT f1(1,1);

-- 在查詢中使用
CREATE TABLE t3(
n1 INT NOT NULL DEFAULT 0,
n2 INT NOT NULL DEFAULT 0
)ENGINE=INNODB CHARSET=utf8mb4;

INSERT INTO t3(n1,n2) VALUES(2,3),(3,4);

SELECT n1,n2,f1(n1,n2) AS '兩數相加' FROM t3;
+----+----+--------------+
| n1 | n2 | 兩數相加     |
+----+----+--------------+
|  2 |  3 |            5 |
|  3 |  4 |            7 |
+----+----+--------------+
2 rows in set (0.01 sec)

修改

ALTER FUNCTION 函式名 選項;

函式的修改只能修改一些如COMMENT的選項,不能修改內部的SQL語句和引數列表,所以直接刪了重建就完了。

檢視

SHOW FUNCTION STATUS;   -- 返回所有自定義函式
SHOW FUNCTION STATUS LIKE 'f%'  -- 過濾
SHOW CREATE FUNCTION f1;  -- 返回自定義函式的建立資訊
SHOW CREATE FUNCTION tt.f1;   -- 指定資料庫下的自定義函式

刪除

DROP FUNCTION f1;