函式(function)
和儲存過程很像, 提高程式碼重用性, 簡化操作, 較少編譯次數
區別在於
- 儲存過程的返回值,
可有可無, 可多可少
- 函式的返回值,
有且只有一個
建立函式
create function 函式名(引數列表) returns 返回型別
begin
函式體
end
複製程式碼
注意: 引數列表包含兩部分, 引數名和引數型別
函式呼叫
還記得, 如何檢視當前時間嗎?
select now();
所以呼叫函式需要使用select
select 函式名(引數列表);
複製程式碼
函式例項(無引數): 計算老師個數
測試資料
CREATE TABLE `teacher` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`salary` int(11) NOT NULL,
`sex` tinyint(1) NOT NULL COMMENT '1 for male, 2 for female',
`name` char(10) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
INSERT INTO `teacher`(`id`, `salary`, `sex`, `name`) VALUES (1, 1500, 1, '教師1');
INSERT INTO `teacher`(`id`, `salary`, `sex`, `name`) VALUES (2, 5500, 2, '教師2');
INSERT INTO `teacher`(`id`, `salary`, `sex`, `name`) VALUES (3, 6500, 2, '教師3');
INSERT INTO `teacher`(`id`, `salary`, `sex`, `name`) VALUES (4, 7500, 1, '教師4');
INSERT INTO `teacher`(`id`, `salary`, `sex`, `name`) VALUES (5, 8500, 2, '教師5');
複製程式碼
建立並呼叫函式
drop function if exists 老師個數;
create function 老師個數() returns int begin
DECLARE 個數 int default 0;
select count(*) into 個數 from teacher;
return 個數;
end;
select 老師個數();
複製程式碼
函式例項(有一個引數): 根據ID檢視對應工資
drop function if exists 檢視工資;
create function 檢視工資(tid int) returns int begin
declare 老師工資 int default 0;
select salary into 老師工資 from teacher where id = tid;
return 老師工資;
end;
select 檢視工資(2);
複製程式碼
函式例項(兩個引數), 數字求和
drop FUNCTION if exists 數字求和;
create function 數字求和(數字1 int, 數字2 int) returns int begin
declare 結果 int;
set 結果 = 數字1 + 數字2;
return 結果;
end;
select 數字求和(1,1);
複製程式碼
檢視函式
在mysql
資料庫的proc
表中, 儲存了所有的函式
也可以使用命令
搜尋函式(模糊查詢)
show function status like '老師%';
複製程式碼
show create function 函式名 # 注意函式名不要加引號
複製程式碼
刪除函式
drop function 函式名;
複製程式碼
比如刪除老師個數
函式
drop function 老師個數;
複製程式碼
留點小作業
- 建立一個累加的函式, 兩個引數, 從第一個引數累加到第二個引數
mysql> select accumulation(1,100);
+---------------------+
| accumulation(1,100) |
+---------------------+
| 5050 |
+---------------------+
1 row in set (0.02 sec)
mysql>
複製程式碼
- 建立一個函式叫動物園, 每次呼叫, 隨機返回不同的動物
mysql> select zoo();
+--------+
| zoo() |
+--------+
| 眼鏡蛇 |
+--------+
1 row in set (0.03 sec)
mysql> select zoo();
+--------+
| zoo() |
+--------+
| 白頭鷹 |
+--------+
1 row in set (0.04 sec)
mysql> select zoo();
+-------+
| zoo() |
+-------+
| 河馬 |
+-------+
1 row in set (0.06 sec)
mysql> select zoo();
+-------+
| zoo() |
+-------+
| 隼 |
+-------+
1 row in set (0.07 sec)
mysql> select zoo();
+--------+
| zoo() |
+--------+
| 白頭鷹 |
+--------+
1 row in set (0.09 sec)
mysql> select zoo();
+-------+
| zoo() |
+-------+
| 猩猩 |
+-------+
1 row in set (0.10 sec)
mysql> select zoo();
+-------+
| zoo() |
+-------+
| 鬣狗 |
+-------+
1 row in set (0.11 sec)
mysql>
複製程式碼