自定義函數
函數:是一系列sql語句的集合,他的注重點主要是返回值,可以作爲查詢語句的一個部分來調用,針對性強
優點:提供sql語句的重用性,共享性,可移植性,執行速度快
缺點:只能返回一個值,功能複雜,寫起來更復雜,查看起來也困難
語法:
create function 函數名([參數列表]) returns 數據類型 #注意returns 要加s
begin
sql語句; #也可以寫邏輯語句
return 值;
end;
直接演示帶參函數
mysql> delimiter $
mysql> create function stu_fun(name varchar(20)) returns int
-> begin
-> declare id int; #定義變量,局部變量
-> select id from stu where name=name into id; #可以說用select into賦值變量,或者set c=1,或者set @c=1 一般set不用做select查詢賦值設
-> return id;
-> end;
-> $
函數調用
mysql> select stu_fun('lyf');
+----------------+
| stu_fun('lyf') |
+----------------+
| 1 |
+----------------+
mysql> select * from stu where id=stu_fun("lyf");
+----+------+------+------+
| id | name | age | sex |
+----+------+------+------+
| 1 | lyf | 18 | 男 |
+----+------+------+------+
查看函數
mysql> show create function stu_fun(函數名);
查看所有函數
mysql> show function status; #這裏會顯示所有函數包含系統的一般配合like做模糊查詢
刪除函數
mysql> drop function stu_fun(函數名);
注意:函數只返回一個值,如果查詢到多條值賦給id就會報錯
ERROR 1172 (42000): Result consisted of more than one row
存儲過程
存儲過程:一系列sql語句的集合,與函數不同的是他沒有返回值。可以作爲一個獨立的部分來執行, 他比函數更強大,他可以修改一系列表。能批量操作
優點:可重用性,對開發者透明,減少sql冗餘,也可以安全封裝,只顯示應該顯示的
缺點:開發、維護、調試是困難,複雜業務難以構造,過多的存儲過程會加大內存
語法;
create procedure 存儲過程名([參數列表]) #參數中in表示輸入、out表示輸出、inout表示可以輸入可以輸出
begin
sql語句或者邏輯語句
end;
例子,一次性舉例三種參數傳遞
mysql> create procedure stu_proce(in name varchar(20),out ages int,inout sex varchar(2))
-> begin
-> select * from stu where name=name and sex=sex;
-> select age into ages from stu where name=name and sex=sex;
-> end;
-> $
Query OK, 0 rows affected (0.00 sec)
使用存儲過程並設置參數:
mysql> delimiter ;
mysql> set @sex='男'; #一個@表示用戶變量,兩個@表示系統會話變量(最後會說明),inout需要先設置值之後在傳參
Query OK, 0 rows affected (0.00 sec)
#out輸出變量也需要用用戶變量傳出來
mysql> call stu_proce('lyf',@ages,@sex);
+----+------+------+------+
| id | name | age | sex |
+----+------+------+------+
| 1 | lyf | 18 | 男 |
+----+------+------+------+
1 row in set (0.00 sec)
Query OK, 1 row affected (0.01 sec)
#這裏輸出了那條select查詢語句
mysql> select @ages,@sex;
+------+------+
| @ages| @sex |
+------+------+
| 18 | 男 |
+------+------+
1 row in set (0.00 sec)
#注意這裏要用ages不能age是因爲如果用age就會同名,輸出結果會是Null,
#多個賦值可以用select age,name into ages,names from stu where id=1;
查看存儲過程
mysql> show create procedure stu_proce(存儲過程名);
查看所有存儲過程
mysql> show procedure status; #這裏會顯示所有函數包含系統的一般配合like做模糊查詢
刪除存儲過程
mysql> drop procedure stu_proce;
對於in、out、inout作用範圍:
mysql> delimiter $
mysql> create procedure proce(in p_in int,out p_out int,inout p_inout int)
-> begin
-> select p_in,p_out,p_inout;
-> set p_in=2,p_out=2,p_inout=2;
-> select p_in,p_out,p_inout;
-> end;
-> $
Query OK, 0 rows affected (0.00 sec)
mysql> delimiter ;
mysql> set @p_in=1,@p_out=1,@p_inout=1;
Query OK, 0 rows affected (0.00 sec)
mysql> call proce(@p_in,@p_out,@p_inout);
+------+-------+---------+
| p_in | p_out | p_inout |
+------+-------+---------+
| 1 | NULL | 1 |
+------+-------+---------+
1 row in set (0.00 sec)
+------+-------+---------+
| p_in | p_out | p_inout |
+------+-------+---------+
| 2 | 2 | 2 |
+------+-------+---------+
1 row in set (0.01 sec)
Query OK, 0 rows affected (0.01 sec)
mysql> select @p_in,@p_out,@p_inout;
+-------+-------+----------+
| @p_in | @p_out| @p_inout |
+-------+-------+----------+
| 1 | 2 | 2 |
+-------+-------+----------+
1 row in set (0.00 sec)
p_in 在存儲過程中被修改,但並不影響 @p_id 的值
p_out爲null因爲out是向調用者輸出參數,不接收輸入的參數。調用後,輸出參數,改變了p_out變量的值
p_inout,在調用了存儲過程後,接受了輸入的參數,也輸出參數,改變了變量
這一部分開始我也不懂,我看了下w3的文檔然後實踐操作了一下
mysql中的變量定義
用戶自定義變量:
declare id int default 局部變量定義在begin ... end中
set @id=1 用戶變量 只要寫上@id(寫id不算)他在這個窗口都有效,都可以使用(包括在函數、觸發器中)
系統變量:用於改變系統參數的
set @@id=1 會話變量 #這個修改只會改變這個窗口,其他窗口會改變
set globe @@id=1 全局變量 #這個則只改變這次服務的開啓,重啓服務後又會重置
永久改變系統參數配置,需要修改配置文件
查詢全局變量:show global variables;
查詢會話變量:show session variables;或show variables;