数据库之九 流程控制、存储过程和函数
【零】数据准备
【1】创建用户信息表
(1)创建表
- id:编号
- name:用户名
- sex:性别,默认男
- balance:余额
- register_time:注册时间
drop table if exists user;
create table user(
id int auto_increment primary key,
name varchar(20),
sex enum('female', 'male') default 'male',
balance float(8, 2),
register_time datetime);
(2)插入数据
truncate user;
insert user(name, sex, balance, register_time)
values('bruce', 'male', 1642.79, '2022-07-01 10:21:31'),
('alice', 'female', 2546.55, '2022-07-02 12:45:20'),
('john', 'male', 125.74, '2022-08-03 08:15:47'),
('emma', 'female', 2651.23, '2022-08-04 16:30:12'),
('mike', 'male', 852.90, '2022-09-05 09:54:38');
【一】流程控制
- 需要在存储过程或函数中使用
【1】什么是流程控制
(1)说明
-
流程控制是编程中一种用于控制程序执行流程的机制,通常涉及条件判断、循环和分支等结构。
-
在数据库中的存储过程、触发器、以及一些脚本语言中,流程控制结构用于根据不同条件执行不同的代码块,从而实现更为复杂和灵活的逻辑。
-
在数据库中,流程控制结构的主要目的是在 SQL 语句的基础上提供更强大的编程能力,使得可以实现更复杂的业务逻辑。
【2】变量
- 在 MySQL 中,有多种类型的变量,包括系统变量、用户定义变量和存储过程中的局部变量。
(1)系统变量
-
系统变量是 MySQL 服务器上的全局配置参数,它们影响着 MySQL 的整体行为。
-
可以使用
SHOW VARIABLES;
查询当前服务器上的所有系统变量。 -
例如:
- max_connections:这是系统允许的最大连接数量
show variables like 'max_connections';
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| max_connections | 200 |
+-----------------+-------+
(2)自定义变量
- 用户定义变量是在会话中由用户创建和使用的变量。
- 这些变量的名字以
@
符号为前缀。 - 用户定义变量的值在连接会话期间保持有效,连接结束后失效。
- 例如:
- 定义并查看变量name
set @name = 'bruce';
select @name;
(3)局部变量
-
在存储过程中,可以声明局部变量,这些变量仅在存储过程的执行期间存在,超出存储过程的范围后被销毁。
-
语法:
declare 变量名 类型
【3】条件判断
(1)if else
- 根据条件判断是否执行某个操作。
if 条件 then-- 执行内容
elseif 条件 then-- 执行内容
else-- 执行内容
end if;
【4】多分支体条件判断
- 在满足条件的情况下反复执行一组语句
(1)case
casewhen 条件1 then -- 执行内容when 条件2 then -- 执行内容......else-- 执行内容
end case;
【5】循环结构
- 在满足条件的情况下反复执行一组语句
(1)while
while 条件 do-- 执行内容
end while;
(2)repeat until
repeat-- 执行内容
until 条件;
(3)loop
loop-- 执行内容
end loop;
(4)for
for 变量 in 多内容 do-- 执行内容
end for;
【5】退出循环结构
- 循环中满足某个条件退出
(1)leave
while 条件 do-- 执行内容if 条件 thenleave;end if;
end while;
【二】存储过程
【1】说明
(1)什么是存储过程
- 存储过程是在数据库中预先定义的一组SQL语句,可以接收参数并返回结果。
- 它们在数据库服务器中保存,可以通过应用程序调用,执行特定的数据库操作。
- 存储过程的使用有助于提高数据库的可维护性、安全性,并可以提高性能,因为它们可以在数据库服务器上直接执行,减少了与应用程序之间的通信开销。
- 理解为自定义函数
(2)特点
- 预编译: 存储过程在创建时进行编译和优化,执行时无需重复编译,提高数据库执行效率。
- 数据库端执行: 存储过程在数据库服务器端执行,减少了与应用程序之间的网络传输开销,提高了数据访问性能。
- 代码重用: 存储过程可被多个应用程序共享和重用,避免了重复编写相同的SQL语句,提高了开发效率。
- 安全性: 通过存储过程,可以限制对数据库的访问权限,提高数据的安全性。
- 事务支持: 存储过程可以包含事务处理逻辑,确保数据库操作的一致性和完整性。
- 简化复杂操作: 存储过程能执行复杂的数据操作和计算,简化了应用程序的开发和维护过程。
【2】存储过程的开发模式
-
命令式开发模式(Imperative Development Model)
-
存储过程以类似编程语言的方式编写,包括条件语句、循环结构和异常处理等。
-
逻辑较为灵活,但容易导致存储过程复杂难懂,维护困难。
-
-
声明式开发模式(Declarative Development Model)
-
存储过程的逻辑更关注数据操作语句,如查询、插入、更新和删除等。
-
通过声明数据操作的目标和条件来实现,逻辑简洁明了,更易于理解和维护。
-
-
触发器开发模式(Trigger Development Model)
-
触发器是一种特殊的存储过程,与数据库表相关联,在预定义的事件发生时自动触发执行。
-
用于实现数据一致性、数据验证、日志记录等功能。
-
开发模式与其他存储过程略有不同,执行时机和上下文由数据库事件触发,而不是外部调用。
-
【3】使用
(1)创建存储过程
- 创建存储过程模板
- in是传入参数
- out是返回参数
delimiter $$
create procedure 存储器名(in 形参 类型, in 形参 类型, out 形参 类型)
begin--执行语句
end $$
delimiter ;
- 创建一个存储过程
- 通过输入用户的名字和金额
- 对用户进行充值
delimiter $$
create procedure my_func_recharge(in n varchar(20), in m float(8, 2), out res varchar(20))
begindeclare name_exists int;select count(*) into name_existsfrom user where name = n;if name_exists > 0 thenupdate userset balance = balance + mwhere name = n;set res = '充值成功';elseset res = '充值失败,名字不存在';end if;
end $$
delimiter ;
(2)查看存储过程创建信息
- 语法
show create procedure 存储过程名字 \G;
show create procedure my_func_recharge \G;
mysql> show create procedure my_func_recharge \G;
*************************** 1. row ***************************Procedure: my_func_rechargesql_mode: ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,PAD_CHAR_TO_FULL_LENGTHCreate Procedure: CREATE DEFINER=`root`@`localhost` PROCEDURE `my_func_recharge`(in n varchar(20), in m float(8, 2), out res varchar(20))
begindeclare name_exists int;select count(*) into name_existsfrom user where name = n;if name_exists > 0 thenupdate userset balance = balance + mwhere name = n;set res = '充值成功';elseset res = '充值失败,名字不存在';end if;
end
character_set_client: utf8mb4
collation_connection: utf8mb4_general_ciDatabase Collation: utf8mb4_general_ci
1 row in set (0.00 sec)ERROR:
No query specified
(3)查看所有存储过程(过多)
- 语法
show procedure status;
(4)调用存储过程
- 语法
call 存储过程名字(参数);
- 测试
- 成功
# 查看原来的金额
select balance from user where name = 'bruce';
+---------+
| balance |
+---------+
| 1642.79 |
+---------+
# 充值测试
set @res = ''
call my_func_recharge('bruce', 100.5, @res);
# 查看标志位
select @res;
+--------------+
| @res |
+--------------+
| 充值成功 |
+--------------+
# 查看金额
+---------+
| balance |
+---------+
| 1743.29 |
+---------+
# 名字错误测试
call my_func_recharge('bbruce', 100.5, @res);
select @res;
+--------------------------------+
| @res |
+--------------------------------+
| 充值失败,名字不存在 |
+--------------------------------+
(5)删除存储过程
- 语法
drop procedure if exists 存储过程名称;
drop procedure if exists my_func_recharge;
【三】函数
- 前面的存储过程就相当于自定义函数
- 这里的函数就相当于内置函数
【1】字符串函数
(1)concat
CONCAT
: 将多个字符串拼接在一起。
select concat(id, "-", name) as id_name
from user limit 2;
+---------+
| id_name |
+---------+
| 1-bruce |
| 2-alice |
+---------+
(2)substring
SUBSTRING
: 截取字符串的子串。
select substring('python', 3, 2) as res;
+------+
| res |
+------+
| th |
+------+
(3)char_length
CHAR_LENGTH
: 返回字符串的字符数。
select name, char_length(name) as name_length
from user limit 3;
+-------+-------------+
| name | name_length |
+-------+-------------+
| bruce | 5 |
| alice | 5 |
| john | 4 |
+-------+-------------+
(4)upper/lower
- lower():全小写
- upper():全大写
select upper(name) as name
from user limit 3;
+-------+
| name |
+-------+
| BRUCE |
| ALICE |
| JOHN |
+-------+
【2】数值函数
(1)round
ROUND(num, decimals)
: 对数值进行四舍五入。
select balance as old, round(balance) as new
from user limit 3;
+---------+------+
| old | new |
+---------+------+
| 1743.29 | 1743 |
| 2546.55 | 2547 |
| 125.74 | 126 |
+---------+------+
(2)floor
FLOOR(num)
: 返回不大于给定数值的最大整数。
select balance as old, floor(balance) as new
from user limit 3;
+---------+------+
| old | new |
+---------+------+
| 1743.29 | 1743 |
| 2546.55 | 2546 |
| 125.74 | 125 |
+---------+------+
(3)ceiling
CEILING(num)
: 返回不小于给定数值的最小整数。
select balance as old, ceiling(balance) as new
from user limit 3;
+---------+------+
| old | new |
+---------+------+
| 1743.29 | 1744 |
| 2546.55 | 2547 |
| 125.74 | 126 |
+---------+------+
(4)abs
ABS(num)
: 返回给定数值的绝对值。
【3】日期和时间函数
(1)now
NOW()
: 返回当前日期和时间。
select now() as time;
+---------------------+
| time |
+---------------------+
| 2024-01-30 21:07:15 |
+---------------------+
(2)curdate
CURDATE()
: 返回当前日期。
select curdate() as today;
+------------+
| today |
+------------+
| 2024-01-30 |
+------------+
(3)curtime
CURTIME()
: 返回当前时间。
select curtime() as time;
+----------+
| time |
+----------+
| 21:09:56 |
+----------+
(4)date_formate
DATE_FORMAT(date, format)
: 格式化日期。
select date_format(register_time, '%Y-%m') as date, count(*)
from user
group by date_format(register_time, '%Y-%m');
+---------+----------+
| date | count(*) |
+---------+----------+
| 2022-07 | 2 |
| 2022-08 | 2 |
| 2022-09 | 1 |
+---------+----------+
select * from user where date(register_time) = '2022-08-03';
+----+------+------+---------+---------------------+
| id | name | sex | balance | register_time |
+----+------+------+---------+---------------------+
| 3 | john | male | 125.74 | 2022-08-03 08:15:47 |
+----+------+------+---------+---------------------+
select * from user year
where month(register_time) = '07';
+----+-------+--------+---------+---------------------+
| id | name | sex | balance | register_time |
+----+-------+--------+---------+---------------------+
| 1 | bruce | male | 1642.79 | 2022-07-01 10:21:31 |
| 2 | alice | female | 2546.55 | 2022-07-02 12:45:20 |
+----+-------+--------+---------+---------------------+
【4】聚合函数
-
详细信息查看筛选条件的
group by
- 数据库之五 筛选条件-CSDN博客
-
COUNT(column)
: 计算符合条件的行数。 -
SUM(column)
: 对指定列的值求和。 -
AVG(column)
: 计算指定列的平均值。 -
MIN(column)
: 找到指定列的最小值。 -
MAX(column)
: 找到指定列的最大值。 -
GROUP_CONCAT
:拼接字段值或字符串。
【5】条件函数
(1)if
- 语法
IF(condition, value_if_true, value_if_false): 如果条件成立,则返回value_if_true,否则返回value_if_false。
- 示例
select name, if(balance > 2000, "rich", "poor") as money_con
from user;
+-------+-----------+
| name | money_con |
+-------+-----------+
| bruce | poor |
| alice | rich |
| john | poor |
| emma | rich |
| mike | poor |
+-------+-----------+
(2)case
- 语法
CASE WHEN condition THEN value END: 根据满足的条件返回相应的值。
- 示例
select name,case when balance > 2500 then 'very rich'when balance > 2000 then 'rich'else'poor'end as money_con
from user;
+-------+-----------+
| name | money_con |
+-------+-----------+
| bruce | poor |
| alice | very rich |
| john | poor |
| emma | very rich |
| mike | poor |
+-------+-----------+
相关文章:
数据库之九 流程控制、存储过程和函数
【零】数据准备 【1】创建用户信息表 (1)创建表 id:编号name:用户名sex:性别,默认男balance:余额register_time:注册时间 drop table if exists user; create table user( id in…...

DolphinDB学习(2):增删改查数据表(分布式表的基本操作)
文章目录 创建数据表1. 创建数据表全流程2. 核心:创建table3. 在已有的数据表中追加新的数据 数据表自身的操作1. 查询有哪些数据表2. 删除某张数据表3. 修改数据表的名称 博客里只介绍最常见的分区表(createPartitionedTable)的创建方法&…...

100天精通Python(实用脚本篇)——第114天:基于smtplib与email模块实现收发邮件(附上多个案例代码)
文章目录 专栏导读案例说明一、smtplib模块是什么?1.1 模块介绍1.2 SMTP参数说明1.3 SMTP常用方法 二、email模块是什么?1.1 模块介绍1.2 常用类说明 三、案例实战3.1 获取授权码3.2 代码步骤3.3 发送文本格式邮件3.4 发送图片格式邮件3.5 发送指定文件夹…...

redisTemplate.opsForValue()
redisTemplate 在Spring Data Redis中,redisTemplate 是一个非常重要的组件,它为开发者提供了各种操作 Redis 的方法。对于 opsForValue() 方法,它是用来获取一个操作字符串值的操作对象。这意味着你可以使用它来执行各种字符串相关的操作…...

多线程事务如何回滚?
背景介绍 1,最近有一个大数据量插入的操作入库的业务场景,需要先做一些其他修改操作,然后在执行插入操作,由于插入数据可能会很多,用到多线程去拆分数据并行处理来提高响应时间,如果有一个线程执行失败&am…...

医院如何筛选安全合规的内外网文件交换系统?
医院内外网文件交换系统是专为医疗机构设计的,用于在内部网络(内网)和外部网络(外网)之间安全、高效地传输敏感医疗数据和文件的解决方案。这种系统对于保护患者隐私、遵守医疗数据保护法规以及确保医疗服务的连续性和…...

C51 单片机学习(一):基础外设
参考 51单片机入门教程 1. 单片机简介 1.1 定义 单片机(Micro Controller Unit,简称 MCU) 内部集成了 CPU、RAM、ROM、定时器、中断系统、通讯接口等一系列电脑的常用硬件功能单片机的任务是信息采集(依靠传感器)、处…...

Docker容器引擎镜像创建
目录 一、镜像的创建 (一)基于现有镜像创建 1.启动一个镜像,在容器里做修改 2.将修改后的容器提交为新的镜像 (二)基于本地模板创建 (三)基于Dockerfile 创建 1.联合文件系统(…...

布尔逻辑与逻辑门
计算机为什么使用二进制: 计算机的元器件晶体管只有 2 种状态,通电(1)& 断电(0),用二进制可直接根据元器件的状态来设计计算机。而且,数学中的“布尔代数”分支,可以…...

opencv-python计算视频光流
光流基本概念 光流表示的是相邻两帧图像中每个像素的运动速度和运动方向。具体:光流是空间运动物体在观察成像平面上的像素运动的瞬时速度,是利用图像序列中像素在时间域上的变化以及相邻帧之间的相关性来找到上一帧跟当前帧之间存在的对应关系…...

Spring 中获取 Bean 对象的三种方式
目录 1、根据名称获取Bean 2、根据Bean类型获取Bean 3、根据 Bean 名称 Bean 类型来获取 Bean(好的解决方法) 假设 Bean 对象是 User,并存储到 Spring 中,注册到 xml 文件中 public class User {public String sayHi(){retur…...

centos系统安装Ward服务器监控工具
简介 Ward是一个简约美观多系统支持的服务器监控面板 安装 1.首先安装jdk yum install java-1.8.0-openjdk-devel.x86_64 2.下载jar wget 3.启动 java -jar ward-1.8.8.jar 体验 浏览器输入 http://192.168.168.110:4000/ 设置服务名设置为:myserver 端口号:5000 点击…...

计算机网络-数据交换方式(电路交换 报文交换 分组交换及其两种方式 )
文章目录 为什么要数据交换?总览电路交换电路交换的各个阶段建立连接数据传输释放连接 电路交换的特点电路交换的优缺点 报文交换报文交换流程报文交换的优缺点 分组交换分组交换流程分组交换的优缺点 数据交换方式的选择分组交换的两种方式数据报方式数据报方式的特…...

【C++入门到精通】特殊类的设计 | 单例模式 [ C++入门 ]
阅读导航 引言一、设计模式概念(了解)二、单例模式1. 饿汉模式(1)概念(2)模拟实现(3)优缺点(4)适用场景 2. 懒汉模式(1)概念ÿ…...

【创建vue项目的两种方式】
Vue环境搭建 NodeJs安装包安装淘宝镜像 环境搭建webpack安装全局安装vue/cli查看模板创建项目1.webpack2. vue-cli NodeJs安装包 下载链接:官网链接 下载下来后,直接傻瓜式的安装即可。 通过在cmd控制台输入以下命令查看是否安装成功 node -v因为适配某…...

2. HarmonyOS应用开发DevEcoStudio准备-1
2. HarmonyOS应用开发DevEcoStudio准备-1 下载 DevEco Studio 进入HUAWEI DevEco Studio产品页产品页。 单击下载列表右侧的按钮,下载 DevEco Studio。 安装 DevEco Studio 下载完成后,双击下载的 deveco-studio-xxxx.exe,进入 DevEco St…...

《二叉树》——3(层序遍历)
目录 前言: 层序遍历: 解析: 前言: 本文主讲链式二叉树的层序遍历,在前面的张篇blog我们初步实现了链式二叉树递归部分的内容,对于递归算法的学习和思维方式我们仍然需要不断加强,所以将对链式二叉树进行…...

HarmonyOS应用开发者基础认证考试答案
HarmonyOS应用开发者基础认证考试答案 一、判断题 1.Ability是系统调度应用的最小单元,是能够完成一个独立功能的组件。一个应用可以包含一个或多个Ability。 正确(True) 2.所有使用Component修饰的自定义组件都支持onPageShow,onBackPress和onPageHide…...

【前端素材】bootstrap3 实现地产置业公司source网页设计
一、需求分析 地产置业公司的网页通常是该公司的官方网站,旨在向访问者提供相关信息和服务。这些网页通常具有以下功能: 公司介绍:网页通常包含有关公司背景、历史、核心价值观和使命等方面的信息。此部分帮助访问者了解公司的身份和目标。 …...

C++ 数论相关题目 博弈论 Nim游戏
给定 n 堆石子,两位玩家轮流操作,每次操作可以从任意一堆石子中拿走任意数量的石子(可以拿完,但不能不拿),最后无法进行操作的人视为失败。 问如果两人都采用最优策略,先手是否必胜。 输入格式…...
Java 语言特性(面试系列2)
一、SQL 基础 1. 复杂查询 (1)连接查询(JOIN) 内连接(INNER JOIN):返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查
在对接支付宝API的时候,遇到了一些问题,记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...

23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂
蛋白质结合剂(如抗体、抑制肽)在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上,高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术,但这类方法普遍面临资源消耗巨大、研发周期冗长…...
可靠性+灵活性:电力载波技术在楼宇自控中的核心价值
可靠性灵活性:电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中,电力载波技术(PLC)凭借其独特的优势,正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据,无需额外布…...

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1
每日一言 生活的美好,总是藏在那些你咬牙坚持的日子里。 硬件:OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写,"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...
根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:
根据万维钢精英日课6的内容,使用AI(2025)可以参考以下方法: 四个洞见 模型已经比人聪明:以ChatGPT o3为代表的AI非常强大,能运用高级理论解释道理、引用最新学术论文,生成对顶尖科学家都有用的…...
Leetcode33( 搜索旋转排序数组)
题目表述 整数数组 nums 按升序排列,数组中的值 互不相同 。 在传递给函数之前,nums 在预先未知的某个下标 k(0 < k < nums.length)上进行了 旋转,使数组变为 [nums[k], nums[k1], …, nums[n-1], nums[0], nu…...

ZYNQ学习记录FPGA(一)ZYNQ简介
一、知识准备 1.一些术语,缩写和概念: 1)ZYNQ全称:ZYNQ7000 All Pgrammable SoC 2)SoC:system on chips(片上系统),对比集成电路的SoB(system on board) 3)ARM:处理器…...