数据库之九 流程控制、存储过程和函数
【零】数据准备
【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调用dll出现unsatisfiedLinkError以及JNA和JNI的区别
UnsatisfiedLinkError 在对接硬件设备中,我们会遇到使用 java 调用 dll文件 的情况,此时大概率出现UnsatisfiedLinkError链接错误,原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用,结果 dll 未实现 JNI 协…...
Leetcode 3577. Count the Number of Computer Unlocking Permutations
Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...
1.3 VSCode安装与环境配置
进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...
相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...
爬虫基础学习day2
# 爬虫设计领域 工商:企查查、天眼查短视频:抖音、快手、西瓜 ---> 飞瓜电商:京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空:抓取所有航空公司价格 ---> 去哪儿自媒体:采集自媒体数据进…...
CRMEB 中 PHP 短信扩展开发:涵盖一号通、阿里云、腾讯云、创蓝
目前已有一号通短信、阿里云短信、腾讯云短信扩展 扩展入口文件 文件目录 crmeb\services\sms\Sms.php 默认驱动类型为:一号通 namespace crmeb\services\sms;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use crmeb\services\sms\…...
tomcat入门
1 tomcat 是什么 apache开发的web服务器可以为java web程序提供运行环境tomcat是一款高效,稳定,易于使用的web服务器tomcathttp服务器Servlet服务器 2 tomcat 目录介绍 -bin #存放tomcat的脚本 -conf #存放tomcat的配置文件 ---catalina.policy #to…...
深度学习之模型压缩三驾马车:模型剪枝、模型量化、知识蒸馏
一、引言 在深度学习中,我们训练出的神经网络往往非常庞大(比如像 ResNet、YOLOv8、Vision Transformer),虽然精度很高,但“太重”了,运行起来很慢,占用内存大,不适合部署到手机、摄…...
Python训练营-Day26-函数专题1:函数定义与参数
题目1:计算圆的面积 任务: 编写一个名为 calculate_circle_area 的函数,该函数接收圆的半径 radius 作为参数,并返回圆的面积。圆的面积 π * radius (可以使用 math.pi 作为 π 的值)要求:函数接收一个位置参数 radi…...
如何通过git命令查看项目连接的仓库地址?
要通过 Git 命令查看项目连接的仓库地址,您可以使用以下几种方法: 1. 查看所有远程仓库地址 使用 git remote -v 命令,它会显示项目中配置的所有远程仓库及其对应的 URL: git remote -v输出示例: origin https://…...
