文章目录
- 存储过程
- 语法格式
- 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