Mysql数据库基础第七章:流程控制结构
Mysql数据库基础系列
软件下载地址
提取码:7v7u
数据下载地址
提取码:e6p9
mysql数据库基础第一章:(一)数据库基本概念
mysql数据库基础第一章:(二)mysql环境搭建
mysql数据库基础第二章:(一)基础查询
mysql数据库基础第二章:(二)条件查询
mysql数据库基础第二章:(三)排序查询
mysql数据库基础第二章:(四)常见函数
mysql数据库基础第二章:(五)分组查询
mysql数据库基础第二章:(六)连接查询
mysql数据库基础第二章:(七)子查询
mysql数据库基础第二章:(八)子查询经典案例
mysql数据库基础第二章:(九)分页查询
mysql数据库基础第二章:(十)连接查询
mysql数据库基础第三章:DML语言
mysql数据库基础第四章:DDL(数据定义语言):库表的管理、数据类型与约束条件
mysql数据库基础第五章:(一)事务
mysql数据库基础第五章:(二)视图
mysql数据库基础第六章:变量、存储过程与函数
mysql数据库基础第七章:流程控制结构
mysql数据库基础第八章:窗口函数和公用表达式(CTE)
文章目录
流程控制语句能够控制存储过程中sql语句的执行程序。主要分为三大类
顺序结构:程序依次运行分支结构:程序根据条件选择执行循环结构:程序满足某条件时,重复执行
注意:只能运用于存储过程
1 分支结构
1.1 if函数
- 实现简单的双分支
- if (表达式1,表达式2,表达式3)
如果表达式1成立,则返回表达式2,否则返回表达式3
1.2 case结构
基本语法:
情况1:
CASE 表达式
WHEN 值1 THEN 结果1或语句1(如果是语句,需要加分号)
WHEN 值2 THEN 结果2或语句2(如果是语句,需要加分号)
...
ELSE 结果n或语句n(如果是语句,需要加分号)
END [case](如果是放在begin end中需要加上case,如果放在select后面不需要)
情况2:
CASE
WHEN 条件1 THEN 结果1或语句1(如果是语句,需要加分号)
WHEN 条件2 THEN 结果2或语句2(如果是语句,需要加分号)
...
ELSE 结果n或语句n(如果是语句,需要加分号)
END [case](如果是放在begin end中需要加上case,如果放在select后面不需要)
作为独立的语句时,要在结尾加分号,并且只能用在begin-end中
1.2.1 案例
1.创建一个存储过程,输入score,如果大于90分,返回A;80-90,返回B;60-80,返回C;其他,返回D
DELIMITER $
CREATE PROCEDURE test_case1(IN score INT)
BEGIN
CASE
WHEN score >= 90 THEN SELECT 'A';
WHEN score >= 80 THEN SELECT 'B';
WHEN score >= 60 THEN SELECT 'c';
ELSE SELECT 'D';
END CASE;
END $
DELIMITER ;
CALL test_case1(95);
2.输入员工编号,判断该员工薪资如果低于9000元,就更新薪资为9000元;薪资大于等于9000元且低于10000的,但是奖金比例为NULL的,就更新奖金比例为0.01;其他的涨薪100元。
DELIMITER $
CREATE PROCEDURE test_case2( IN emp_id INT)
BEGIN
DECLARE emp_sal DOUBLE;
DECLARE bonus DOUBLE ;
SELECT salary INTO emp_sal FROM employees WHERE employee_id = emp_id;
SELECT commission_pct INTO bonus FROM employees WHERE employee_id = emp_id;
CASE
WHEN emp_sal<9000
THEN UPDATE employees SET salary=9000 WHERE employee_id = emp_id;
WHEN emp_sal<10000 AND bonus IS NULL
THEN UPDATE employees SET commission_pct=0.01 WHERE employee_id = emp_id;
ELSE
UPDATE employees SET salary=salary+100 WHERE employee_id = emp_id;
END CASE;
END $
DELIMITER ;
CALL test_case2(200);
SELECT * FROM employees WHERE employee_id = 200;
3.输入员工编号,判断该员工的入职年限,如果是0年,薪资涨50;如果是1年,薪资涨100;如果是2年,薪资涨200;如果是3年,薪资涨300;如果是4年,薪资涨400;其他的涨薪500
DELIMITER $
CREATE PROCEDURE test_case3( IN emp_id INT)
BEGIN
DECLARE work_time INT ;
SELECT YEAR(NOW())- YEAR(hiredate) INTO work_time FROM employees WHERE employee_id = emp_id;
CASE
WHEN work_time = 0
THEN UPDATE employees SET salary=salary + 50 WHERE employee_id = emp_id;
WHEN work_time = 1
THEN UPDATE employees SET salary=salary + 100 WHERE employee_id = emp_id;
WHEN work_time = 2
THEN UPDATE employees SET salary=salary + 200 WHERE employee_id = emp_id;
WHEN work_time = 3
THEN UPDATE employees SET salary=salary + 300 WHERE employee_id = emp_id;
WHEN work_time = 4
THEN UPDATE employees SET salary=salary + 400 WHERE employee_id = emp_id;
ELSE
UPDATE employees SET salary=salary + 500 WHERE employee_id = emp_id;
END CASE;
END $
DELIMITER ;
CALL test_case3(200);
1.3 if 结构
实现多重分支
if 条件1 then 语句1;
elseif 条件2 then 语句2;
else
end if
只能用于begin-end
1.3.1案例
1.创建一个存储过程,输入score,如果大于90分,返回A;80-90,返回B;60-80,返回C;其他,返回D
DELIMITER $
CREATE PROCEDURE test_if1(IN score INT)
BEGIN
if score > 90 THEN SELECT 'A';
elseif score > 80 THEN SELECT 'B';
elseif score > 60 THEN SELECT 'c';
ELSE SELECT 'D';
END if;
END $
DELIMITER ;
call test_if(85);
2.声明存储过程定义IN参数emp_id,输入员工编号。判断该员工
薪资如果低于8000元并且入职时间超过5年,就涨薪500元;否则就不变。
DELIMITER $
CREATE PROCEDURE test_if2( IN emp_id INT)
BEGIN
declare emp_sal int;
DECLARE work_time INT ;
SELECT YEAR(NOW())- YEAR(hiredate) INTO work_time FROM employees WHERE employee_id = emp_id;
select salary into emp_sal from employees where employee_id = emp_id;
if emp_sal < 8000 and work_time > 5
then update employees set salary = salary + 500;
END if;
END $
DELIMITER ;
select * from employees where employee_id = 178;
CALL test_if2(178);
三种方法比较,当是简单的二分支时,使用if函数,当是等值判断时,使用case结构,当是多重分支时,用if结构。
2. 循环结构
2.1 while结构
while:先判断后执行,如果条件满足,则运行循环内语句,否则退出循环
语法:
label: while condition
do
end while label
2.1.1 案例
1.市场环境不好时,公司为了渡过难关,决定暂时降低大家的薪资。声明存储过程声明OUT参数num,输出循环次数。存储过程中实现循环给大家降薪,薪资降为原来的90%。直到全公司的平均薪资达到4000结束。并统计循环次数。
DROP PROCEDURE test_while1;
DELIMITER $
CREATE PROCEDURE test_while1(OUT num INT)
BEGIN
DECLARE avg_sal DOUBLE;
DECLARE i INT DEFAULT 0; # 定义降薪次数
SELECT AVG(salary) INTO avg_sal FROM employees;
WHILE avg_sal > 4000 DO
UPDATE employees SET salary = salary * 0.9;
SET i = i+1;
SELECT AVG(salary) INTO avg_sal FROM employees;
END WHILE ;
SET num = i;
END $
CALL test_while1(@sum);
SELECT @sum;
2.2 repeat结构
repeat语句创建一个带条件判断的循环过程。与WHILE循环不同的是,repeat循环首先会执行一次循环,然后在unile中进行表达式的判断,如果满足条件就退出,即end repeat;如果条件不满足,则会就继续执行循环,直到满足退出条件为止。
repeat:先执行后判断
label: repeat
循环列表
until 结束条件
end repeat
2.2.1 案例
DELIMITER $
CREATE PROCEDURE test_repeat1()
BEGIN
DECLARE i INT DEFAULT 0;
REPEAT
SET i = i + 1;
UNTIL i >= 10
END REPEAT;
SELECT i;
END $
DELIMITER ;
2.2 loop:死循环
LOOP循环语句用来重复执行某些语句。LOOP内的语句一直重复执行直到循环被退出(使用LEAVE子句),跳出循环过程。
label: loop
循环体
end loop label
2.3 循环控制
循环控制结构有以下两种:
iterate:类似于continue,跳出此次循环,直接进入下一次循环
leave:类似于break结束循环
使用循环控制时需要在定义循环时加标签
2.3.1 leave语句
LEAVE语句:可以用在循环语句内,或者以 BEGIN 和 END 包裹起来的程序体内,表示跳出循环或者跳出程序体的操作。可以LEAVE 理解为 break。
案例
批量插入,根据次数插入到admin表中多条记录,如果次数>20则停止
TRUNCATE TABLE admin$
DROP PROCEDURE test_while1$
CREATE PROCEDURE test_while1(IN insertCount INT)
BEGIN
DECLARE i INT DEFAULT 1;
a:WHILE i<=insertCount DO
INSERT INTO admin(username,`password`) VALUES(CONCAT('xiaohua',i),'0000');
IF i>=20 THEN LEAVE a;
END IF;
SET i=i+1;
END WHILE a;
END $
CALL test_while1(100)$
2.3.2 iterate语句
ITERATE语句:只能用在循环语句(LOOP、REPEAT和WHILE语句)内,表示重新开始循环,将执行顺序转到语句段开头处。类似于python中的 continue。
批量插入,根据次数插入到admin表中多条记录,只插入偶数次
TRUNCATE TABLE admin$
DROP PROCEDURE test_while1$
CREATE PROCEDURE test_while1(IN insertCount INT)
BEGIN
DECLARE i INT DEFAULT 0;
a:WHILE i<=insertCount DO
SET i=i+1;
IF MOD(i,2)!=0 THEN ITERATE a;
END IF;
INSERT INTO admin(username,`password`) VALUES(CONCAT('xiaohua',i),'0000');
END WHILE a;
END $
CALL test_while1(100)$
Mysql数据库基础第七章:流程控制结构的更多相关文章
- Mysql数据库基础操作
Mysql数据库基础操作 在mysql数据库中开启使用tab键补全功能 1)修改主配置文件/etc/mysql/my.cnf(mysql和mariadb目录有些不同) vim /etc/mysql/m ...
- php面试专题---15、MySQL数据库基础考察点
php面试专题---15.MySQL数据库基础考察点 一.总结 一句话总结: 注意:只写精品 1.mysql定义int(3),那么我存1234就错了么? 不是:无影响:只会影响显示字符的个数:可以为整 ...
- MySQL数据库基础知识及优化
MySQL数据库基础知识及优化必会的知识点,你掌握了多少? 推荐阅读: 这些必会的计算机网络知识点你都掌握了吗 关于数据库事务和锁的必会知识点,你掌握了多少? 关于数据库索引,必须掌握的知识点 目录 ...
- 26.MySQL数据库基础
MySQL数据库基础 目录 MySQL数据库基础 数据库的概念 数据 表 数据库 数据库的管理系(DBMS) 数据库系统 访问数据库的流程 数据库系统发展史 当今主流数据库介绍 关系数据库 关系数据库 ...
- mysql数据库基础的简单操作指南
最近在学习mysql,本文是做的关于mysql学习的笔记,跟大家分享一下,希望对大家学习mysql知识有所助益.mysql现在几乎已经成了网站建设的主流数据库,很多php网站系统都采用了mysql数据 ...
- MySQL数据库基础
MySQL数据库基础 本文的所有操作是基于CMD环境,MySQL通过在命令行中输入SQL语句对数据库进行操作.配置问题可参考<打通MySQL的操作权限>中的内容,该文算是针对前期的环境配置 ...
- Mysql数据库基础学习笔记
Mysql数据库基础学习笔记 1.mysql查看当前登录的账户名以及数据库 一.单表查询 1.创建数据库yuzly,创建表fruits 创建表 ) ) ,) NOT NULL,PRIMARY KEY( ...
- mysql数据库基础-2019-9-10(随堂笔记)
mysql数据库基础 在cmd情况下启动mysql数据库:(配置path环境变量后可忽略) 运行mysql1. 进入mysql路径2. 执行:mysql -uroot -p,安装时的密码 1.数据库& ...
- PHP面试 MySQL数据库基础
MySQL数据库基础 MySQL数据类型 整数类型:TINYINT SMALLINT MEDIUMINT INT BIGINT 属性:UNSIGNED 长度:可以为整数类型指定宽度,列 ...
- MySQL数据库--基础简述
MySQL数据库--基础简述 1.15.1 MySQL简介 Mysql是最流行的RDBMS(Relational Database Management System:关系数据库管理系统),特别是在W ...
随机推荐
- [python] 基于Gradio可视化部署机器学习应用
Gradio是一个开源的Python库,用于构建机器学习和数据科学演示应用.有了Gradio,你可以围绕你的机器学习模型或数据科学工作流程快速创建一个简单漂亮的用户界面.Gradio适用于以下情况: ...
- [python] Python数据序列化模块pickle使用笔记
pickle是一个Python的内置模块,用于在Python中实现对象结构序列化和反序列化.Python序列化是一个将Python对象层次结构转换为可以本地存储或者网络传输的字节流的过程,反序列化则是 ...
- Java程序员用代码,计算最大公约数和最小公倍数
作者:小傅哥 博客:https://bugstack.cn 源码:https://github.com/fuzhengwei/java-algorithms 沉淀.分享.成长,让自己和他人都能有所收获 ...
- 二十一、B树的定义、查找、插入和删除
一.B树的定义 一棵m阶的B树,或为空树,或为满足下列特性的m叉树: (1)树中每个结点至多有m棵子树:(2)B树是所有结点的平衡因子均等于0的多路平衡查找树:(3)若根结点不是叶子结点,则至少有两棵 ...
- 超详细手把手教你cordova开发使用指南+自定义插件,jsbridge
Cordova是什么 使用前端技术 开发跨平台web App的工具 底层原理:HTML+CSS搭建页面, JS和原生交互 交互原理:Cordova插件 环境配置 安卓开发基础环境搭建的文章可以参考一下 ...
- 假如你想在VUE的main.js里根据条件按需引入注册组件以及样式,那就这样子写,附赠自己写的vue一个框架配置多系统按需加载系统路由以及组件办法
假如你想在VUE的main.js里根据条件按需引入注册组件以及样式,那就这样子写 举例来说我想要引入大屏的一些组件,但是原来框架已经集成了多个项目,路由也是按需加载的,想要实现组件按需加载 先在mai ...
- Google Cloud Platform | 使用 Terraform 的分层防火墙策略自动化
[本文由Cloud Ace整理发布,更多内容请访问Cloud Ace 官网] 防火墙规则是 Google Cloud 中网络安全的重要组成部分.Google Cloud 中的防火墙大致可分为两种类型: ...
- 为啥要对jvm做优化?
摘要:在jvm中有很多的参数可以进行设置,这样可以让jvm在各种环境中都能够高效的运行.绝大部分的参数保持默认即可. 本文分享自华为云社区<为什么需要对jvm进行优化,jvm运行参数之标准参数& ...
- 程序员大杀器?带你玩转ChatGPT
作者:京东零售 栗鸿宇 ChatGPT简介 ChatGPT是一款基于AI技术的机器人对话软件,它能够与用户进行智能化的聊天对话,帮助用户解决日常生活中的问题,为用户提供丰富的信息和服务.它集成了海量知 ...
- drf-day4——序列化类常用字段和字段参数、序列化类source用法、序列化类定制字段返回内容的两种方式、序列化类的多表关联反序列化保存、反序列化字段校验、ModelSerializer的使用
目录 一.序列化类常用字段和字段参数(了解) 1.1 常用字段类 1.2 常用字段参数 选项参数: 通用参数: 重点 二.序列化高级用法之source(了解) 2.1 序列化定制字段名字 三.序列化高 ...