MySQL基礎篇(03):系統和自定義函數總結,觸發器使用詳解

本文源碼:GitHub·點這裏 || GitEE·點這裏html

1、系統封裝函數

MySQL 有不少內置的函數,能夠快速解決開發中的一些業務需求,大概包括流程控制函數,數值型函數、字符串型函數、日期時間函數、聚合函數等。如下列出了這些分類中經常使用的函數。mysql

一、控制流程函數

  • case...when

根據值判斷返回值,類比編程中的IF-ELSE判斷。git

-- 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。github

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。sql

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)

清空字符串空格。mybatis

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)  求累加和

2、自定義函數

一、概念簡介

函數存儲着一系列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是多線程環境,因此要保證函數也是線程安全 。

3、觸發器

一、觸發器簡介

觸發器是特殊的存儲過程,不一樣的是存儲過程要用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觸發器,就會報錯。

  • 執行效率

觸發器能夠減小應用端和數據庫的通訊次數和業務邏輯,可是基於行觸發的邏輯,若是數據集很是大,效率會下降。

  • 事務問題

觸發器執行和原表的執行語句是否在同一個事務中,取決於觸發表的存儲引擎是否支持事務。

4、源代碼地址

GitHub·地址
https://github.com/cicadasmile/mysql-data-base
GitEE·地址
https://gitee.com/cicadasmile/mysql-data-base

原文出處:https://www.cnblogs.com/cicada-smile/p/12122604.html

相關文章
相關標籤/搜索