您好,登錄后才能下訂單哦!
這篇文章主要講解了“MySQL系統和自定義函數、觸發器的使用方法是什么”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“MySQL系統和自定義函數、觸發器的使用方法是什么”吧!
MySQL 有很多內置的函數,可以快速解決開發中的一些業務需求,大概包括流程控制函數,數值型函數、字符串型函數、日期時間函數、聚合函數等。以下列出了這些分類中常用的函數。
case…when
根據值判斷返回值,類比編程中的IF-ELSE判斷。
-- DEMO 01 SELECT CASE DATE_FORMAT(NOW(),'%Y-%m-%d') WHEN '2019-12-29' THEN 'today' WHEN '2019-12-28' THEN 'yesterday' WHEN '2019-12-30' THEN 'tommor' ELSE 'Unknow' END; -- DEMO 02 SELECT (CASE WHEN 1>0 THEN 'true' ELSE 'false' END) AS result;
if(expr1,expr2,expr3)
如果表達式 expr1 是TRUE,則 IF()的返回值為expr2; 否則返回值則為 expr3。
SELECT IF(1>2,'1>2','1<2') AS result ; SELECT IF(1<2,'yes ','no') AS result ; SELECT IF(STRCMP('test','test'),'no','yes');
ifnull(expr1,expr2)
如果表達式 expr1不為NULL,則返回值為expr1;否則返回值為 expr2。
SELECT IFNULL(NULL,'cicada'); SELECT IFNULL(1/1,'no');
CHAR_LENGTH()
返回值為字符串的長度 。
SELECT CHAR_LENGTH(' c i c ') ;-- 包含空格 SELECT LENGTH(' S q l ') ;
CONCAT(str1…)
拼接串聯字符串。
SELECT CONCAT('My', 'S', 'ql'); SELECT CONCAT('My', NULL, 'QL'); -- 包含Null 則返回Null SELECT CONCAT("%", "Java", "%"); -- mybatis中拼接模糊查詢
ELT(N,str1,str2,…)
若N = 1,則返回值為 str1 ,若N = 2,則返回值為 str2 ,以此類推,可以用來轉換返回頁面的狀態。
SELECT ELT(1,'提交','審核中','規則通過') ; SELECT ELT(2,'提交','審核中','規則通過') ;
FORMAT(X,D)
格式化數字類型。
SELECT FORMAT(3.1455,2) ; -- 四舍五入保留兩位 SELECT TRUNCATE(3.1455,2) ; -- 直接截取兩位
TRIM(str)
清空字符串空格。
SELECT LTRIM(' hel l o ') ;-- 清空左邊 SELECT RTRIM(' hel l o ') ;-- 清空右邊 SELECT TRIM(' hel l o ') ; -- 清空兩邊 SELECT REPLACE('M y S Q L',' ','') ; -- 替換掉全部空格
FLOOR(X)
返回不大于X的最大整數值 。
SELECT FLOOR(1.23); -- 1 SELECT FLOOR(-1.23); -- -2
MOD(N,M)
模操作。返回N 被 M除后的余數。
SELECT MOD(29,9); -- 2 SELECT 29 MOD 9; -- 2
RAND() RAND(N)
返回一個隨機浮點值,范圍在0到1之間。若已指定一個整數參數 N ,則它被用作種子值,用來產生重復序列。
SELECT RAND(); -- 0.923 SELECT RAND(20) = RAND(20) ; -- TRUE
ADDDATE(date,INTERVAL expr type)
給指定日期,以指定類型進行運算。
SELECT DATE_ADD('2019-12-29', INTERVAL 3 DAY); -- 2020-01-01
CURDATE()
將當前日期按照’YYYY-MM-DD’ 或YYYYMMDD 格式的值返回,具體格式根據函數用在字符串或是數字語境中而定。
SELECT CURDATE(); -- '2019-12-29' 字符串 SELECT CURDATE() + 0; -- 20180725 數字
DATE(expr)
提取日期或時間日期表達式expr中的日期部分。
SELECT DATE('2019-12-31 01:02:03'); -- '2019-12-31' SELECT DATE('2019-12-31 01:02:03')+0; -- 20191231
DATE_FORMAT(date,format)
根據format 字符串進行 date 值的格式化。
SELECT DATE_FORMAT(NOW(), '%Y-%m-%d'); -- 2019-12-29 SELECT DATE_FORMAT(NOW(), '%Y年%m月%d日'); -- 2019年12月29日
AVG([distinct] expr) 求平均值 COUNT({*|[distinct] } expr) 統計行的數量 MAX([distinct] expr) 求最大值 MIN([distinct] expr) 求最小值 SUM([distinct] expr) 求累加和
函數存儲著一系列sql語句,調用函數就是一次性執行這些語句。所以函數可以降低語句重復。函數注重返回值,而觸發器注重執行過程,所以一些語句無法執行。所以函數并不是單純的sql語句集合。
create function 函數名([參數列表]) returns 數據類型 begin sql語句; return 值; end;
參數列表的格式是: 變量名 數據類型。
無參案例
CREATE FUNCTION mysum1 () RETURNS INT RETURN (2+3)*2; SELECT mysum1 () ;
有參函數
表結構
CREATE TABLE t01_user ( id int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT '主鍵ID', user_name varchar(20) DEFAULT NULL COMMENT '用戶名稱' ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT '用戶表';
函數用法
create function get_name(p_id INT) returns VARCHAR(20) begin declare userName varchar(20); select user_name from t01_user where id=p_id into userName; return userName; end; SELECT get_name(1) ;
show create function get_name ;
drop function get_name ;
函數是事先經過編譯,才能在服務器環境調用,所以MySQL集群環境需要同步編譯;MySQL是多線程環境,所以要保證函數也是線程安全 。
觸發器是特殊的存儲過程,不同的是存儲過程要用CALL來調用,而觸發器不需要使用CALL。也不需要手工啟動,只要當一個預定義的事件發生的時候,就會被MYSQL自動觸發調用。
觸發器語法
CREATE TRIGGER trigger_name trigger_time trigger_event ON tbl_name FOR EACH ROW trigger_stmt
trigger_name:觸發器命名 ;
trigger_time: 觸發動作的時間 ;
trigger_event: 激活觸發器的語句類型 ;
tbl_name: 觸發器作用的表明,非臨時表 ;
trigger_stmt:觸發程序執行的語句 ;
表數據同步
當向用戶表
t01_user
寫入數據時,同時向
t02_back
表寫入一份備份數據。
-- 用戶備份表 CREATE TABLE t02_back ( id int(11) NOT NULL PRIMARY KEY COMMENT '主鍵ID', user_name varchar(20) DEFAULT NULL COMMENT '用戶名稱' ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT '用戶備份'; -- 觸發器程序 DROP TRIGGER IF EXISTS user_back_trigger ; CREATE TRIGGER user_back_trigger AFTER INSERT ON t01_user FOR EACH ROW BEGIN INSERT INTO t02_back (id,user_name) VALUES (new.id,new.user_name); END ; -- 測試案例 INSERT INTO t01_user (user_name) VALUES ('smile'),('mysql') ; SELECT * FROM t02_back ;
查看觸發器是指數據庫中已存在的觸發器的定義、狀態、語法信息等。可以在TRIGGERS表中查看觸發器信息。
SELECT * FROM `information_schema`.`TRIGGERS` WHERE `TRIGGER_NAME`='user_back_trigger';
DROP TRIGGER語句可以刪除MYSQL中已經定義的觸發器,刪除觸發器的基本語法。
DROP TRIGGER [schema_name.]trigger_name
觸發事件
對于相同的表,相同的事件只能創建一個觸發器,比如對表t01_user創建兩次AFTER INSERT觸發器,就會報錯。
執行效率
觸發器可以減少應用端和數據庫的通信次數和業務邏輯,但是基于行觸發的邏輯,如果數據集非常大,效率會降低。
事務問題
觸發器執行和原表的執行語句是否在同一個事務中,取決于觸發表的存儲引擎是否支持事務。
感謝各位的閱讀,以上就是“MySQL系統和自定義函數、觸發器的使用方法是什么”的內容了,經過本文的學習后,相信大家對MySQL系統和自定義函數、觸發器的使用方法是什么這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。