因為以前沒有寫blog的習慣,之前的mysql知識也就沒記錄,正好現(xiàn)在又用到mysql的函數(shù),所以就立即記錄下吧!
區(qū)別
觸發(fā)器 是在insert update之后執(zhí)行sql命令,不需要任何參數(shù)和返回值
函數(shù)和存儲過程類似,
區(qū)別:
- 一般來說函數(shù)都是返回一個值或者表對象,返回多個值最好用存儲過程
- 存儲過程一般是作為一個獨立的部分來執(zhí)行( EXECUTE 語句執(zhí)行),而函數(shù)可以作為查詢語句的一個部分來調(diào)用(SELECT調(diào)用),由于函數(shù)可以返回一個表對象,因此它可以在查詢語句中位于FROM關鍵字的后面。 SQL語句中不可用存儲過程,而可以使用函數(shù)。
- 一般來說,存儲過程實現(xiàn)的功能要復雜一點,而函數(shù)的實現(xiàn)的功能針對性比較強。存儲過程,功能強大,可以執(zhí)行包括修改表等一系列數(shù)據(jù)庫操作;用戶定義函數(shù)不能用于執(zhí)行一組修改全局數(shù)據(jù)庫狀態(tài)的操作。
查看數(shù)據(jù)庫中的存儲過程和函數(shù)
show procedure status; //存儲過程
show function status; //函數(shù)
查看存儲過程或函數(shù)的創(chuàng)建代碼
show create procedure proc_name;
show create function func_name;
查看視圖
SELECT * from information_schema.VIEWS //視圖
SELECT * from information_schema.TABLES //表
刪除自定義方法
drop function isRead
isRead是方法名
自己寫的一個demo
目的是查詢我的房間在某年某個月份是否已經(jīng)交過電費,返回結果0/1,
寫法有點類似js的function
delimiter $$
CREATE FUNCTION isRead(in_meterTime INT,in_year Varchar(255),in_roomId INT) RETURNS int(1)
BEGIN
DECLARE i INT ;
select count(1) INTO i from (
select distinct id from t_room where id in (select room_table_id from t_electric_meter where dfsjd_code = in_meterTime and year = in_year and deleted = 0 )
)t where id = in_roomId;
RETURN i;
END$$
說明
“DELIMITER $$”語句的作用是將MYSQL的結束符設置為$$,因為MYSQL默認的語句結束符為分號;所以這樣設置才不會沖突
- 1、定義變量
DECLARE var_name[,varname]...date_type[DEFAULT VALUE];
var_name為局部變量的名稱
。DEFAULT VALUE子句給變量提供一個默認值。值除了可以被聲明為一個常數(shù)外,還可以被指定為一個表達式。
如果沒有DEFAULT子句,初始值為NULL
DECLARE MYPARAM INT DEFAULT 100;
- 2、為變量賦值
定義變量之后,為變量賦值可以改變變量的默認值,MYSQL中使用SET語句為變量賦值
SET var_name=expr[,var_name=expr]...
聲明3個變量,分別為var1,var2和var3
DECLARE var1,var2,var3 INT;
SET var1=10,var2=20;
SET var3=var1+var2;
MYSQL中還可以通過SELECT...INTO為一個或多個變量賦值(我的例子中就是用的這個)
eg:
DECLARE NAME CHAR(50);
DECLARE id DECIMAL(8,2);
SELECT id,NAME INTO id ,NAME FROM t3 WHERE id=2;