分支语句
注:未经过本文作者同意,严禁转载
在 MySQL 中有两种类型的分支语句:
- if-then-else
- case
-- 单分支 if-then
DELIMITER $$
CREATE PROCEDURE procedure_test7(IN num INT)
BEGIN
-- 如果 num 等于 1 则进入执行对应的 SQL 语句
-- 如果不满足 则不进入,也就是不执行 SQL 语句
IF num=1 THEN
-- SQL执行
END IF;
END $$
-- 双分支 if-then-else
DELIMITER $$
CREATE PROCEDURE procedure_test7(IN num INT)
BEGIN
-- 如果满足 num 等于 1 则进入执行对应的 SQL1 语句,否则执行 SQL2 语句
IF num=1 THEN
-- SQL 1 执行
ELSE
-- SQL 2 执行
END IF;
END $$
-- case
DELIMITER $$
CREATE PROCEDURE procedure_test9(IN num INT)
BEGIN
CASE num
WHEN 1 THEN
-- SQL 1 如果 num 的值为 1,则执行 SQL 1
WHEN 2 THEN
-- SQL 2 如果 num 的值为 2,则执行 SQL 2
ELSE
-- 如果 num 的值都不匹配,则执行 SQL
-- SQL(如果变量的值和所有 when 的值都不匹配,则执行 else 中的 SQL)
-- else 可以省略不写,你写了,就需要在里面加入对应的 SQL 语句
END CASE;
END $$
例子1 单分支演示:
/*
创建一个存储过程:
如果参数输入的是 1 则添加一条员工信息
如果参数输入的不是 1 则不添加员工信息
*/
DELIMITER $$
CREATE PROCEDURE procedure_test7(IN num INT)
BEGIN
-- 如果 num 等于 1 则进入执行对应的 SQL 语句
-- 如果不满足 则不进入,也就是不执行 SQL 语句
IF num=1 THEN
INSERT INTO employees(`name`,`call`)
VALUES('王五','123123');
END IF;
END $$
先来看一下表里的信息
调用一下存储过程
CALL procedure_test7(1)
好,没问题;再来看一下数据有没有添加进去
例子2 双分支演示:
/*
创建一个存储过程:
如果参数输入的是 1 则添加一条员工信息,否则添加一条用户信息
*/
DELIMITER $$
CREATE PROCEDURE procedure_test8(IN num INT)
BEGIN
-- 如果满足 num 等于 1 则进入执行对应的 SQL1 语句,否则执行 SQL2 语句
IF num=1 THEN
-- SQL 1 执行
INSERT INTO employees(`name`,`call`)
VALUES('赵六','234321');
ELSE
-- SQL 2 执行
INSERT INTO users(`name`,`pwd`)
VALUES('用户2','123');
END IF;
END $$
创建没问题,接下来,看一下 users 表和 employees 表的数据
调用存储过程,测试一下
CALL procedure_test8(3)
再看一下是否在 users 表中插入了数据
例子3 case 分支演示:
*
创建一个存储过程:
参数输入的是 1 则添加一条员工信息
参数输入的是 2 则添加一条用户信息
*/
DELIMITER $$
CREATE PROCEDURE procedure_test9(IN num INT)
BEGIN
CASE num
WHEN 1 THEN
-- SQL 1
INSERT INTO employees(`name`,`call`)
VALUES('阿七','3306123');
WHEN 2 THEN
-- SQL 2
INSERT INTO users(`name`,`pwd`)
VALUES('用户3','123');
ELSE
-- SQL(如果变量的值和所有 when 的值都不匹配,则执行 else 中的 SQL)
-- else 可以不写
UPDATE users SET pwd='321' WHERE `name`='用户2';
END CASE;
END $$
也是没问题的,现在我把 else 加上,由于刚才创建存储过程成功,现在删除一下重新创建
DROP PROCEDURE procedure_test9
来测试一下
CALL procedure_test9(3)
好,没问题,来看一下,users 表是不是有被修改
循环语句
在 MySQL 中有三种循环语句
- while
- repeat
- loop
-- while 写法1
DELIMITER $$
CREATE PROCEDURE procedure_test10(IN num INT)
BEGIN
DECLARE i INT DEFAULT 0;
WHILE i<=num DO
-- 编写需要重复执行的 SQL
SET i=i+1;
END WHILE;
END $$
-- while 写法2
DELIMITER $$
CREATE PROCEDURE procedure_test10(IN num INT)
BEGIN
DECLARE i INT;
SET i=0;
WHILE i<=num DO
-- 编写需要重复执行的 SQL
SET i=i+1;
END WHILE;
END $$
-- repeat
DELIMITER $$
CREATE PROCEDURE procedure_test11(IN num INT)
BEGIN
DECLARE i INT DEFAULT 0;
REPEAT
-- 编写需要重复执行的 SQL
SET i=i+1;
UNTIL i>=num END REPEAT;
END $$
-- loop
DELIMITER $$
CREATE PROCEDURE procedure_test12(IN num INT)
BEGIN
DECLARE i INT DEFAULT 0;
myloop:LOOP
-- 编写需要重复执行的 SQL
SET i=i+1;
-- 如果 i 的值等于 num,进入执行
IF i=num THEN
-- leave 离开,离开谁,离开myloop
LEAVE myloop;
END IF;
END LOOP;
END $$
例子1 while 循环演示:
-- 创建一个存储过程:使用 while 循环对 users 表进行数据插入
DELIMITER $$
CREATE PROCEDURE procedure_test10(IN num INT)
BEGIN
DECLARE i INT DEFAULT 0;
WHILE i<=num DO
-- 编写需要重复执行的 SQL
-- CONCAT()函数作用是用来拼接的
-- RAND()随机数函数
INSERT INTO users(`name`,`pwd`)
VALUES(CONCAT('用户',i),CONCAT(RAND()*(RAND(999-100)+100)));
SET i=i+1;
END WHILE;
END $$
创建没有问题,接下来,调用存储过程看一下是否可以重复插入数据
CALL procedure_test10(5)
SELECT `name`,`pwd` FROM users
例子2 repeat 循环演示:
-- 创建一个存储过程:使用 repeat 循环对 users 表进行数据插入
DELIMITER $$
CREATE PROCEDURE procedure_test11(IN num INT)
BEGIN
DECLARE i INT DEFAULT 0;
REPEAT
INSERT INTO users(`name`,`pwd`)
VALUES(CONCAT('repeat用户',i),CONCAT(RAND()*(RAND(999-100)+100)));
SET i=i+1;
UNTIL i>=num END REPEAT;
END $$
创建,没问题,接下来调用一下存储过程测试一下数据是否有添加成功
CALL procedure_test11(3)
SELECT `name`,`pwd` FROM users
例子3 loop 循环演示:
-- 创建一个存储过程:使用 loop 循环对 users 表进行数据插入
DELIMITER $$
CREATE PROCEDURE procedure_test12(IN num INT)
BEGIN
DECLARE i INT DEFAULT 0;
myloop:LOOP
-- SQL
INSERT INTO users(`name`,`pwd`)
VALUES(CONCAT('loop用户',i),CONCAT(RAND()*(RAND(999-100)+100)));
SET i=i+1;
IF i=num THEN
LEAVE myloop;
END IF;
END LOOP;
END $$
创建,没问题,接下来调用测试一下
CALL procedure_test12(3)
SELECT `name`,`pwd` FROM users