定义变量

  1. -- 标准语法
  2. DECLARE 变量名 数据类型 [DEFAULT 默认值];
  3. -- 注意: DECLARE定义的是局部变量,只能用在BEGIN END范围之内
  4. -- 定义一个int类型变量、并赋默认值为10
  5. DELIMITER $
  6. CREATE PROCEDURE pro_test1()
  7. BEGIN
  8. DECLARE num INT DEFAULT 10; -- 定义变量
  9. SELECT num; -- 查询变量
  10. END$
  11. DELIMITER ;
  12. -- 调用pro_test1存储过程
  13. CALL pro_test1();
  14. +-----+
  15. | num |
  16. +-----+
  17. | 10 |
  18. +-----+
  19. 1 row in set

变量的赋值1

  1. -- 标准语法
  2. SET 变量名 = 变量值;
  3. -- 定义字符串类型变量,并赋值
  4. DELIMITER $
  5. CREATE PROCEDURE pro_test2()
  6. BEGIN
  7. DECLARE NAME VARCHAR(10); -- 定义变量
  8. SET NAME = '存储过程'; -- 为变量赋值
  9. SELECT NAME; -- 查询变量
  10. END$
  11. DELIMITER ;
  12. -- 调用pro_test2存储过程
  13. CALL pro_test2();
  14. +----------+
  15. | NAME |
  16. +----------+
  17. | 存储过程 |
  18. +----------+
  19. 1 row in set

变量的赋值2

  1. -- 标准语法
  2. SELECT 列名 INTO 变量名 FROM 表名 [WHERE 条件];
  3. -- 定义两个int变量,用于存储男女同学的总分数
  4. DELIMITER $
  5. CREATE PROCEDURE pro_test3()
  6. BEGIN
  7. DECLARE men,women INT; -- 定义变量
  8. SELECT SUM(score) INTO men FROM student WHERE gender='男'; -- 计算男同学总分数赋值给men
  9. SELECT SUM(score) INTO women FROM student WHERE gender='女'; -- 计算女同学总分数赋值给women
  10. SELECT men,women; -- 查询变量
  11. END$
  12. DELIMITER ;
  13. -- 调用pro_test3存储过程
  14. CALL pro_test3();

if语句的使用

  1. -- 标准语法
  2. IF 判断条件1 THEN 执行的sql语句1;
  3. [ELSEIF 判断条件2 THEN 执行的sql语句2;]
  4. ...
  5. [ELSE 执行的sql语句n;]
  6. END IF;
  7. /*
  8. 定义一个int变量,用于存储班级总成绩
  9. 定义一个varchar变量,用于存储分数描述
  10. 根据总成绩判断:
  11. 380分及以上 学习优秀
  12. 320 ~ 380 学习不错
  13. 320以下 学习一般
  14. */
  15. DELIMITER $
  16. CREATE PROCEDURE pro_test4()
  17. BEGIN
  18. -- 定义总分数变量
  19. DECLARE total INT;
  20. -- 定义分数描述变量
  21. DECLARE description VARCHAR(10);
  22. -- 为总分数变量赋值
  23. SELECT SUM(score) INTO total FROM student;
  24. -- 判断总分数
  25. IF total >= 380 THEN
  26. SET description = '学习优秀';
  27. ELSEIF total >= 320 AND total < 380 THEN
  28. SET description = '学习不错';
  29. ELSE
  30. SET description = '学习一般';
  31. END IF;
  32. -- 查询总成绩和描述信息
  33. SELECT total,description;
  34. END$
  35. DELIMITER ;
  36. -- 调用pro_test4存储过程
  37. CALL pro_test4();

参数的传递

  1. DELIMITER $
  2. -- 标准语法
  3. CREATE PROCEDURE 存储过程名称([IN|OUT|INOUT] 参数名 数据类型)
  4. BEGIN
  5. 执行的sql语句;
  6. END$
  7. /*
  8. IN:代表输入参数,需要由调用者传递实际数据。默认的
  9. OUT:代表输出参数,该参数可以作为返回值
  10. INOUT:代表既可以作为输入参数,也可以作为输出参数
  11. */
  12. DELIMITER ;

输入参数

  1. DELIMITER $
  2. -- 标准语法
  3. CREATE PROCEDURE 存储过程名称(IN 参数名 数据类型)
  4. BEGIN
  5. 执行的sql语句;
  6. END$
  7. DELIMITER ;
  8. DELIMITER $
  9. CREATE PROCEDURE pro_test5(IN total INT)
  10. BEGIN
  11. -- 定义分数描述变量
  12. DECLARE description VARCHAR(10);
  13. -- 判断总分数
  14. IF total >= 380 THEN
  15. SET description = '学习优秀';
  16. ELSEIF total >= 320 AND total < 380 THEN
  17. SET description = '学习不错';
  18. ELSE
  19. SET description = '学习一般';
  20. END IF;
  21. -- 查询总成绩和描述信息
  22. SELECT total,description;
  23. END$
  24. DELIMITER ;
  25. -- 调用pro_test5存储过程
  26. -- 直接输入变量,用这个total参数进行后续的判断
  27. CALL pro_test5(390);
  28. -- 通过查询值进行判断
  29. CALL pro_test5((SELECT SUM(score) FROM student));
  30. Query OK, 0 rows affected
  31. +-------+-------------+
  32. | total | description |
  33. +-------+-------------+
  34. | 390 | 学习优秀 |
  35. +-------+-------------+
  36. 1 row in set
  37. Query OK, 0 rows affected
  38. +-------+-------------+
  39. | total | description |
  40. +-------+-------------+
  41. | 383 | 学习优秀 |
  42. +-------+-------------+
  43. 1 row in set

输出参数

  1. DELIMITER $
  2. -- 标准语法
  3. CREATE PROCEDURE 存储过程名称(OUT 参数名 数据类型)
  4. BEGIN
  5. 执行的sql语句;
  6. END$
  7. DELIMITER ;
  8. /*
  9. 输入总成绩变量,代表学生总成绩
  10. 输出分数描述变量,代表学生总成绩的描述
  11. 根据总成绩判断:
  12. 380分及以上 学习优秀
  13. 320 ~ 380 学习不错
  14. 320以下 学习一般
  15. */
  16. DELIMITER $
  17. CREATE PROCEDURE pro_test6(IN total INT,OUT description VARCHAR(10))
  18. BEGIN
  19. -- 判断总分数
  20. IF total >= 380 THEN
  21. SET description = '学习优秀';
  22. ELSEIF total >= 320 AND total < 380 THEN
  23. SET description = '学习不错';
  24. ELSE
  25. SET description = '学习一般';
  26. END IF;
  27. END$
  28. DELIMITER ;
  29. -- 调用pro_test6存储过程
  30. CALL pro_test6(310,@description);
  31. -- 查询总成绩描述
  32. SELECT @description;
  33. +--------------+
  34. | @description |
  35. +--------------+
  36. | 学习一般 |
  37. +--------------+
  38. 1 row in set

case语句的使用

  1. -- 标准语法
  2. CASE 表达式
  3. WHEN 1 THEN 执行sql语句1;
  4. [WHEN 2 THEN 执行sql语句2;]
  5. ...
  6. [ELSE 执行sql语句n;]
  7. END CASE;
  8. -- 标准语法
  9. CASE
  10. WHEN 判断条件1 THEN 执行sql语句1;
  11. [WHEN 判断条件2 THEN 执行sql语句2;]
  12. ...
  13. [ELSE 执行sql语句n;]
  14. END CASE;
  15. /*
  16. 输入总成绩变量,代表学生总成绩
  17. 定义一个varchar变量,用于存储分数描述
  18. 根据总成绩判断:
  19. 380分及以上 学习优秀
  20. 320 ~ 380 学习不错
  21. 320以下 学习一般
  22. */
  23. DELIMITER $
  24. CREATE PROCEDURE pro_test7(IN total INT)
  25. BEGIN
  26. -- 定义变量
  27. DECLARE description VARCHAR(10);
  28. -- 使用case判断
  29. CASE
  30. WHEN total >= 380 THEN
  31. SET description = '学习优秀';
  32. WHEN total >= 320 AND total < 380 THEN
  33. SET description = '学习不错';
  34. ELSE
  35. SET description = '学习一般';
  36. END CASE;
  37. -- 查询分数描述信息
  38. SELECT description;
  39. END$
  40. DELIMITER ;
  41. -- 调用pro_test7存储过程
  42. CALL pro_test7(390);
  43. CALL pro_test7((SELECT SUM(score) FROM student));

while循环

  1. -- 标准语法
  2. 初始化语句;
  3. WHILE 条件判断语句 DO
  4. 循环体语句;
  5. 条件控制语句;
  6. END WHILE;
  7. /*
  8. 计算1~100之间的偶数和
  9. */
  10. DELIMITER $
  11. CREATE PROCEDURE pro_test8()
  12. BEGIN
  13. -- 定义求和变量
  14. DECLARE result INT DEFAULT 0;
  15. -- 定义初始化变量
  16. DECLARE num INT DEFAULT 1;
  17. -- while循环
  18. WHILE num <= 100 DO
  19. -- 偶数判断
  20. IF num%2=0 THEN
  21. SET result = result + num; -- 累加
  22. END IF;
  23. -- num+1
  24. SET num = num + 1;
  25. END WHILE;
  26. -- 查询求和结果
  27. SELECT result;
  28. END$
  29. DELIMITER ;
  30. -- 调用pro_test8存储过程
  31. CALL pro_test8();

repeat循环

  1. -- 标准语法
  2. 初始化语句;
  3. [循环名称:] LOOP
  4. 条件判断语句
  5. [LEAVE 循环名称;]
  6. 循环体语句;
  7. 条件控制语句;
  8. END LOOP 循环名称;
  9. -- 注意:loop可以实现简单的循环,但是退出循环需要使用其他的语句来定义。我们可以使用leave语句完成!
  10. -- 如果不加退出循环的语句,那么就变成了死循环。
  11. /*
  12. 计算1~10之间的和
  13. */
  14. DELIMITER $
  15. CREATE PROCEDURE pro_test10()
  16. BEGIN
  17. -- 定义求和变量
  18. DECLARE result INT DEFAULT 0;
  19. -- 定义初始化变量
  20. DECLARE num INT DEFAULT 1;
  21. -- loop循环
  22. l:LOOP
  23. -- 条件成立,停止循环
  24. IF num > 10 THEN
  25. LEAVE l;
  26. END IF;
  27. -- 累加
  28. SET result = result + num;
  29. -- num+1
  30. SET num = num + 1;
  31. END LOOP l;
  32. -- 查询求和结果
  33. SELECT result;
  34. END$
  35. DELIMITER ;
  36. -- 调用pro_test10存储过程
  37. CALL pro_test10();

loop循环

  1. -- 标准语法
  2. 初始化语句;
  3. [循环名称:] LOOP
  4. 条件判断语句
  5. [LEAVE 循环名称;]
  6. 循环体语句;
  7. 条件控制语句;
  8. END LOOP 循环名称;
  9. -- 注意:loop可以实现简单的循环,但是退出循环需要使用其他的语句来定义。我们可以使用leave语句完成!
  10. -- 如果不加退出循环的语句,那么就变成了死循环。
  11. /*
  12. 计算1~10之间的和
  13. */
  14. DELIMITER $
  15. CREATE PROCEDURE pro_test10()
  16. BEGIN
  17. -- 定义求和变量
  18. DECLARE result INT DEFAULT 0;
  19. -- 定义初始化变量
  20. DECLARE num INT DEFAULT 1;
  21. -- loop循环
  22. l:LOOP
  23. -- 条件成立,停止循环
  24. IF num > 10 THEN
  25. LEAVE l;
  26. END IF;
  27. -- 累加
  28. SET result = result + num;
  29. -- num+1
  30. SET num = num + 1;
  31. END LOOP l;
  32. -- 查询求和结果
  33. SELECT result;
  34. END$
  35. DELIMITER ;
  36. -- 调用pro_test10存储过程
  37. CALL pro_test10();

游标

游标的概念

  • 游标可以遍历返回的多行结果,每次拿到一整行数据
  • 在存储过程和函数中可以使用游标对结果集进行循环的处理
  • 简单来说游标就类似于集合的迭代器遍历
  • MySQL中的游标只能用在存储过程和函数中
    ```sql — 创建游标 DECLARE 游标名称 CURSOR FOR 查询sql语句;

— 打开游标 OPEN 游标名称;

— 使用游标获取数据 FETCH 游标名称 INTO 变量名1,变量名2,…;

— 关闭游标 CLOSE 游标名称;

/ 当游标结束后,会触发游标结束事件。我们可以通过这一特性来完成循环操作 加标记思想: 1.定义一个变量,默认值为0(意味着有数据) 2.当游标结束后,将变量值改为1(意味着没有数据了) / — 1.定义一个变量,默认值为0(意味着有数据) DECLARE flag INT DEFAULT 0; — 2.当游标结束后,将变量值改为1(意味着没有数据了) DECLARE EXIT HANDLER FOR NOT FOUND SET flag = 1;

/ 将student表中所有的成绩保存到stu_score表中 / DELIMITER $

CREATE PROCEDURE pro_test12() BEGIN — 定义成绩变量 DECLARE s_score INT; — 定义标记变量 DECLARE flag INT DEFAULT 0; — 创建游标,查询所有学生成绩数据 DECLARE stu_result CURSOR FOR SELECT score FROM student; — 游标结束后,将标记变量改为1 DECLARE EXIT HANDLER FOR NOT FOUND SET flag = 1;

  1. -- 开启游标
  2. OPEN stu_result;
  3. -- 循环使用游标
  4. REPEAT
  5. -- 使用游标,遍历结果,拿到数据
  6. FETCH stu_result INTO s_score;
  7. -- 将数据保存到stu_score表中
  8. INSERT INTO stu_score VALUES (NULL,s_score);
  9. UNTIL flag=1
  10. END REPEAT;
  11. -- 关闭游标
  12. CLOSE stu_result;

END$

DELIMITER ;

— 调用pro_test12存储过程 CALL pro_test12();

— 查询stu_score表 SELECT * FROM stu_score; ```