[MySQL光速入門]024 聊聊函式

貓哥的技術部落格發表於2019-04-18

函式(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);
複製程式碼

image.png

函式例項(兩個引數), 數字求和

drop FUNCTION if exists 數字求和;
create function 數字求和(數字1 int, 數字2 int) returns int begin 
    declare 結果 int;
    set 結果 = 數字1 + 數字2;
    return 結果;
end;
select 數字求和(1,1);
複製程式碼

image.png

檢視函式

image.png

mysql資料庫的proc表中, 儲存了所有的函式

image.png

也可以使用命令

搜尋函式(模糊查詢)

show function status like '老師%';
複製程式碼

image.png

show create function 函式名 # 注意函式名不要加引號
複製程式碼

image.png

刪除函式

drop function 函式名;
複製程式碼

比如刪除老師個數函式

drop function 老師個數;
複製程式碼

留點小作業

  1. 建立一個累加的函式, 兩個引數, 從第一個引數累加到第二個引數
mysql> select accumulation(1,100);
+---------------------+
| accumulation(1,100) |
+---------------------+
|                5050 |
+---------------------+
1 row in set (0.02 sec)

mysql> 
複製程式碼
  1. 建立一個函式叫動物園, 每次呼叫, 隨機返回不同的動物
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> 
複製程式碼

快速跳轉

相關文章