• MySQL——函数和流程控制


    2023.9.21

    函数

    含义:一组预先编译好的SQL语句的集合,理解成批处理语句。

    1. 提高代码的重用性
    2. 简化操作
    3. 减少了编译次数并且减少了和数据库服务器的连接次数,提高了效率

    与存储过程的区别:

    存储过程:可以有0个返回,也可以有多个返回,适合做批量插入、批量更新。
    函数:有且仅有1 个返回,适合做处理数据后返回一个结果。

    下面是函数相关学习笔记:

    1. #一、创建语法
    2. CREATE FUNCTION 函数名(参数列表) RETURNS 返回类型
    3. BEGIN
    4. 函数体
    5. END
    6. /*
    7. 注意:
    8. 1.参数列表 包含两部分:
    9. 参数名 参数类型
    10. 2.函数体:肯定会有return语句,如果没有会报错
    11. 如果return语句没有放在函数体的最后也不报错,但不建议
    12. return 值;
    13. 3.函数体中仅有一句话,则可以省略begin end
    14. 4.使用 delimiter语句设置结束标记
    15. */
    16. #二、调用语法
    17. SELECT 函数名(参数列表)
    18. #------------------------------案例演示----------------------------
    19. #1.无参有返回
    20. #案例:返回公司的员工个数
    21. CREATE FUNCTION myf1() RETURNS INT
    22. BEGIN
    23. DECLARE c INT DEFAULT 0;#定义局部变量
    24. SELECT COUNT(*) INTO c#赋值
    25. FROM employees;
    26. RETURN c;
    27. END $
    28. SELECT myf1()$
    29. #2.有参有返回
    30. #案例1:根据员工名,返回它的工资
    31. CREATE FUNCTION myf2(empName VARCHAR(20)) RETURNS DOUBLE
    32. BEGIN
    33. SET @sal=0;#定义用户变量
    34. SELECT salary INTO @sal #赋值
    35. FROM employees
    36. WHERE last_name = empName;
    37. RETURN @sal;
    38. END $
    39. SELECT myf2('k_ing') $
    40. #案例2:根据部门名,返回该部门的平均工资
    41. CREATE FUNCTION myf3(deptName VARCHAR(20)) RETURNS DOUBLE
    42. BEGIN
    43. DECLARE sal DOUBLE ;
    44. SELECT AVG(salary) INTO sal
    45. FROM employees e
    46. JOIN departments d ON e.department_id = d.department_id
    47. WHERE d.department_name=deptName;
    48. RETURN sal;
    49. END $
    50. SELECT myf3('IT')$
    51. #三、查看函数
    52. SHOW CREATE FUNCTION myf3;
    53. #四、删除函数
    54. DROP FUNCTION myf3;
    55. #案例
    56. #一、创建函数,实现传入两个float,返回二者之和
    57. CREATE FUNCTION test_fun1(num1 FLOAT,num2 FLOAT) RETURNS FLOAT
    58. BEGIN
    59. DECLARE SUM FLOAT DEFAULT 0;
    60. SET SUM=num1+num2;
    61. RETURN SUM;
    62. END $
    63. SELECT test_fun1(1,2)$

     流程控制

            流程控制分为顺序、分支、循环。

    下面为三种流程控制相关学习笔记:

    1. #一、分支结构
    2. #1.if函数
    3. /*
    4. 语法:if(条件,值1,值2)
    5. 功能:实现双分支
    6. 应用在begin end中或外面
    7. */
    8. #2.case结构
    9. /*
    10. 语法:
    11. 情况1:类似于switch
    12. case 变量或表达式
    13. when 值1 then 语句1;
    14. when 值2 then 语句2;
    15. ...
    16. else 语句n;
    17. end
    18. 情况2:
    19. case
    20. when 条件1 then 语句1;
    21. when 条件2 then 语句2;
    22. ...
    23. else 语句n;
    24. end
    25. 应用在begin end 中或外面
    26. */
    27. #3.if结构
    28. /*
    29. 语法:
    30. if 条件1 then 语句1;
    31. elseif 条件2 then 语句2;
    32. ....
    33. else 语句n;
    34. end if;
    35. 功能:类似于多重if
    36. 只能应用在begin end 中
    37. */
    38. #案例1:创建函数,实现传入成绩,如果成绩>90,返回A,如果成绩>80,返回B,如果成绩>60,返回C,否则返回D
    39. CREATE FUNCTION test_if(score FLOAT) RETURNS CHAR
    40. BEGIN
    41. DECLARE ch CHAR DEFAULT 'A';
    42. IF score>90 THEN SET ch='A';
    43. ELSEIF score>80 THEN SET ch='B';
    44. ELSEIF score>60 THEN SET ch='C';
    45. ELSE SET ch='D';
    46. END IF;
    47. RETURN ch;
    48. END $
    49. SELECT test_if(87)$
    50. #案例2:创建存储过程,如果工资<2000,则删除,如果5000>工资>2000,则涨工资1000,否则涨工资500
    51. CREATE PROCEDURE test_if_pro(IN sal DOUBLE)
    52. BEGIN
    53. IF sal<2000 THEN DELETE FROM employees WHERE employees.salary=sal;
    54. ELSEIF sal>=2000 AND sal<5000 THEN UPDATE employees SET salary=salary+1000 WHERE employees.`salary`=sal;
    55. ELSE UPDATE employees SET salary=salary+500 WHERE employees.`salary`=sal;
    56. END IF;
    57. END $
    58. CALL test_if_pro(2100)$
    59. #案例1:创建函数,实现传入成绩,如果成绩>90,返回A,如果成绩>80,返回B,如果成绩>60,返回C,否则返回D
    60. CREATE FUNCTION test_case(score FLOAT) RETURNS CHAR
    61. BEGIN
    62. DECLARE ch CHAR DEFAULT 'A';
    63. CASE
    64. WHEN score>90 THEN SET ch='A';
    65. WHEN score>80 THEN SET ch='B';
    66. WHEN score>60 THEN SET ch='C';
    67. ELSE SET ch='D';
    68. END CASE;
    69. RETURN ch;
    70. END $
    71. SELECT test_case(56)$
    72. #二、循环结构
    73. /*
    74. 分类:
    75. while、loop、repeat
    76. 循环控制:
    77. iterate类似于 continue,继续,结束本次循环,继续下一次
    78. leave 类似于 break,跳出,结束当前所在的循环
    79. */
    80. #1.while
    81. /*
    82. 语法:
    83. 【标签:】while 循环条件 do
    84. 循环体;
    85. end while【 标签】;
    86. 联想:
    87. while(循环条件){
    88. 循环体;
    89. }
    90. */
    91. #2.loop
    92. /*
    93. 语法:
    94. 【标签:】loop
    95. 循环体;
    96. end loop 【标签】;
    97. 可以用来模拟简单的死循环
    98. */
    99. #3.repeat
    100. /*
    101. 语法:
    102. 【标签:】repeat
    103. 循环体;
    104. until 结束循环的条件
    105. end repeat 【标签】;
    106. */
    107. #1.没有添加循环控制语句
    108. #案例:批量插入,根据次数插入到admin表中多条记录
    109. DROP PROCEDURE pro_while1$
    110. CREATE PROCEDURE pro_while1(IN insertCount INT)
    111. BEGIN
    112. DECLARE i INT DEFAULT 1;
    113. WHILE i<=insertCount DO
    114. INSERT INTO admin(username,`password`) VALUES(CONCAT('Rose',i),'666');
    115. SET i=i+1;
    116. END WHILE;
    117. END $
    118. CALL pro_while1(100)$
    119. /*
    120. int i=1;
    121. while(i<=insertcount){
    122. //插入
    123. i++;
    124. }
    125. */
    126. #2.添加leave语句
    127. #案例:批量插入,根据次数插入到admin表中多条记录,如果次数>20则停止
    128. TRUNCATE TABLE admin$
    129. DROP PROCEDURE test_while1$
    130. CREATE PROCEDURE test_while1(IN insertCount INT)
    131. BEGIN
    132. DECLARE i INT DEFAULT 1;
    133. a:WHILE i<=insertCount DO
    134. INSERT INTO admin(username,`password`) VALUES(CONCAT('xiaohua',i),'0000');
    135. IF i>=20 THEN LEAVE a;
    136. END IF;
    137. SET i=i+1;
    138. END WHILE a;
    139. END $
    140. CALL test_while1(100)$
    141. #3.添加iterate语句
    142. #案例:批量插入,根据次数插入到admin表中多条记录,只插入偶数次
    143. TRUNCATE TABLE admin$
    144. DROP PROCEDURE test_while1$
    145. CREATE PROCEDURE test_while1(IN insertCount INT)
    146. BEGIN
    147. DECLARE i INT DEFAULT 0;
    148. a:WHILE i<=insertCount DO
    149. SET i=i+1;
    150. IF MOD(i,2)!=0 THEN ITERATE a;
    151. END IF;
    152. INSERT INTO admin(username,`password`) VALUES(CONCAT('xiaohua',i),'0000');
    153. END WHILE a;
    154. END $
    155. CALL test_while1(100)$
    156. /*
    157. int i=0;
    158. while(i<=insertCount){
    159. i++;
    160. if(i%2==0){
    161. continue;
    162. }
    163. 插入
    164. }
    165. */

  • 相关阅读:
    python学习笔记
    【深度学习笔记】计算机视觉——FCN(全卷积网络
    JavaScript实现排序算法
    【并发编程】史上最详细的ReentrantReadWriteLock源码刨析
    2022CTF培训(五)字符串混淆进阶&代码自解密
    el-date-picker的使用,及解决切换type时面板样式错乱问题
    C++:详细的说明智能指针的使用以及底层实现,以及删除器和包装器的使用
    如何实现蓝牙配对方法混淆攻击
    pcl基于颜色的区域增长点云分割
    VoLTE端到端业务详解 | SIP协议
  • 原文地址:https://blog.csdn.net/m0_61028090/article/details/133149871