文章目錄
- 存儲過程
- 語法格式
- BEGIN...END語句塊
- DECLARE(聲明局部變量)
- 流控制語句
- if函數
- 批處理操作
- 測試2
- 測試3
- 存儲過程與函數的關系
存儲過程
MYSQL的存儲過程是一組預處理的SQL語句,可以像函數一樣在數據庫中進行存儲和調用。
它們允許在數據庫中定義一系列的操作,然后通過簡單的調用來執行這些操作。而不必每次重寫相同的SQL語句。
存儲過程通常用于實現復雜的業務邏輯,或執行繁雜的數據庫操作。
語法格式
BEGIN…END語句塊
存儲過程可以使用begin… end… 復合語句來包含多個語句,Statement_list 代表一個或者多個語句的列表,
Statement_list 之間每個語句都必須用分號(;)來結束
存儲過程的調用要Call procedure_name().
示例:
select * from user;-- 創建一個存儲過程
-- 將語句分隔符改為// 使用完后要再改回;
DELIMITER //
CREATE PROCEDURE GetUser(IN user_id INT)
BEGINselect * from user where id = user_id;
END //-- 將語句分隔符再修改回;
DELIMITER;-- 刪除一個存儲過程
DROP PROCEDURE GetUser;-- 調用一個存儲過程
CALL GetUser(1);
DECLARE(聲明局部變量)
DECLARE var_name[,...] type [DEFAULT value]不再需要@符號
這個語句被用來聲明局部變量
要給變量提供一個默認值,要包含一個default 語句
值可以被指定為一個表達式,不需要為一個常數
如果沒有default子句,初始值為NULL
局部變量的作用范圍在他被聲明的begin ... end語句塊內。給局部變量更新值,可以使用SET。
-- 在存儲過程內部可以定義局部變量
DELIMITER //
CREATE PROCEDURE test1() -- procedure
BEGIN DECLARE x INT; -- declare 聲明DECLARE y INT;set x = 1;set y = 2;SELECT x+y;
END //DELIMITER ;DROP PROCEDURE test1;call test1();mysql> DELIMITER //
mysql> CREATE PROCEDURE test1() -- procedure-> BEGIN -> DECLARE x INT;-- declare 聲明-> DECLARE y INT;-> set x = 1;-> set y = 2;-> SELECT x+y;-> END//
Query OK, 0 rows affected (0.00 sec)mysql> DELIMITER ;
mysql> call test1();
+------+
| x+y |
+------+
| 3 |
+------+
1 row in set (0.01 sec)Query OK, 0 rows affected (0.01 sec)
流控制語句
在MySQL中,流控制語句用于控制程序的執行流程,包括條件判斷、循環和跳轉。主要的流控制語句包括:
IF-THEN-ELSE語句:用于基于條件執行不同的代碼塊。
CASE語句:用于基于多個條件執行不同的代碼塊。
WHILE循環:當指定條件為真時,重復執行一組語句。
REPEAT循環:先執行一組語句,然后重復執行,直到指定條件為真。
LOOP循環:無限循環,直到遇到LEAVE語句跳出。
LEAVE語句:用于從循環中跳出。
if函數
IF函數是一個MySQL內置函數,它在條件為真時返回一個值,否則返回另一個值。其基本語法如下:
-- 測試if函數
SELECT if(1 < 5, 'ABC', 'abc');mysql> SELECT if(1 < 5, 'ABC', 'abc');
+-------------------------+
| if(1 < 5, 'ABC', 'abc') |
+-------------------------+
| ABC |
+-------------------------+
1 row in set (0.00 sec)-- 測試concat 字符串的拼接函數
SET @i:=10;
select concat(10, 'ABC', '4564');mysql> SET @i:=10;
Query OK, 0 rows affected (0.00 sec)mysql> select concat(10, 'ABC', '4564');
+---------------------------+
| concat(10, 'ABC', '4564') |
+---------------------------+
| 10ABC4564 |
+---------------------------+
1 row in set (0.00 sec)
批處理操作
DELIMITER //
CREATE PROCEDURE BathInsert(IN num INT)
BEGINDECLARE x INT;set x = 0;while x < num doinsert into user(name, passward) values(concat('name', x), concat('passwd', x));set x = x+1;end while;
END //
DELIMITER ;CAll BathINsert(10);mysql> DELIMITER //
mysql> CREATE PROCEDURE BathInsert(IN num INT)-> BEGIN-> DECLARE x INT;-> set x = 0;-> while x < num do->
Display all 779 possibilities? (y or n) -> insert into user(name, passward) values(concat('name', x), concat('passwd', x));->
Display all 779 possibilities? (y or n) -> set x = x+1;-> end while;-> END //
Query OK, 0 rows affected (0.01 sec)mysql> DELIMITER ;
mysql> select * from user;
+----+------+----------+
| id | name | passward |
+----+------+----------+
| 1 | tom | 12345 |
| 2 | bob | 123456 |
| 3 | jack | 8888 |
+----+------+----------+
3 rows in set (0.00 sec)mysql> CAll BathINsert(10);
Query OK, 1 row affected (0.05 sec)mysql> select * from user;
+----+-------+----------+
| id | name | passward |
+----+-------+----------+
| 1 | tom | 12345 |
| 2 | bob | 123456 |
| 3 | jack | 8888 |
| 4 | name0 | passwd0 |
| 5 | name1 | passwd1 |
| 6 | name2 | passwd2 |
| 7 | name3 | passwd3 |
| 8 | name4 | passwd4 |
| 9 | name5 | passwd5 |
| 10 | name6 | passwd6 |
| 11 | name7 | passwd7 |
| 12 | name8 | passwd8 |
| 13 | name9 | passwd9 |
+----+-------+----------+
13 rows in set (0.00 sec)
測試2
? 設置用戶變量的rownum為0,從score表中,顯示 s_id,s_score,rownum(如果@c_id 等于 c_id, @row_num = @row_num+1,否則 等于 1,因為 c_id沒有定義數值,所以第一次不會相同會賦值為1)別名為 rrank ,@c_id = c_id 別名為 c_id