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;