使用程序方式获取与处理MySQL表数据
8.1 执行多条语句获取 MySQL 表数据
8.1.1 MySQL 中的常量

8.1.2 MySQL 中的变量
1.用户变量
用户可以在表达式中使用自己定义的变量,这样的变量称为用户变量。
用户变量在使用前必须定义和初始化,如果使用没有初始化的变量,其值为 Null。
用户变量与当前连接有关,也就是说,一个客户端定义的变量不能被其他客户端使用。定义和初始化一个用户变量可以使用 Set 语句,其语法格式如下 :
Set @< 变量名称 1>=< 表达式 1> [ , @< 变量名称 2>=< 表达式 2> , … ] ;
定义和初始化用户变量的规则如下。

2.系统变量
MySQL 有一些特定的设置,当 MySQL 数据库服务器启动的时候,这些设置被读取来决定下一步骤,这些设置就是系统变量,系统变量在 MySQL 服务器启动时就被引入并初始化为默认值。
系统变量一般都以“@@”为前缀,例如 @@Version 返回 MySQL 的版本。但某些特定的系统变量可以省略“@@”符号,例如 Current_Date(系统日期)、Current_Time(系统时间)、Current_Timestamp(系统日期和时间)和 Current_User(当前用户名)。
系统变量可以分为全局系统变量和会话系统变量两种类型。

3.局部变量
局部变量是可以保存单个特定类型数据值的变量,其有效作用范围为存储过程和自定义函数的 Begin…End 语句块之内,在 Begin…End 语句块运行结束之后,局部变量就消失了,在其他语句块中不可以使用该局部变量,但 Begin…End 语句块内所有语句都可以使用。
MySQL 中局部变量必须先定义后使用。使用 Declare 语句声明局部变量,定义局部变量的语法格式如下 :

8.1.3 MySQL 中的运算符与表达式
1.运算符

2.表达式

3.运算符的优先级
当一个复杂的表达式有多个运算符时,运算符优先级决定执行运算的先后次序。执行的次序有时会影响所得到的运算结果。MySQL 运算符优先级如表 8-1 所示。

8.1.4 MySQL 中的控制语句
Begin…End 语句用于将多个 SQL 语句组合为一个语句块(语句块相当于一个单一语句),以达到一起执行的目的。

2.If…Then…Else 语句
If…Then…Else 语句用于进行条件判断,可用于实现程序的选择结构。根据是否满足条件,将执行不同的语句,其语法格式如下 :

If 语句的执行过程为 :如果条件表达式的值为 True,则执行对应的语句块 ;如果所有的条件表达式的值为 False,并且有 Else 子句,则执行 Else 子句对应的语句块。
3.Case 语句
Case 语句用于计算列表并返回多个可能结果表达式中的一个,可用于实现程序的多分支结构,虽然使用 If…Then…Else 语句也能够实现多分支结构,但是使用 Case 语句的程序可读性更强,一条 Case 语句经常可以充当一条 If…Then…Else 语句。

4.While 循环语句
While 循环语句用于实现循环结构,是有条件控制的循环语句,当满足某种条件时执行循环体内的语句。

While 循环语句的执行过程说明如下:首先判断逻辑表达式的值是否为 True,为 True 时则执行“语句块”中的语句,然后再次进行判断,为 True 则继续循环,为 False 则结束循环。
5.Repeat 循环语句
Repeat 循环语句是有条件控制的循环语句,当满足特定条件时,就会跳出循环语句。

Repeat 循环语句的执行过程说明如下:首先执行语句块中的语句,然后判断逻辑表达式的值是否为 True,为 True 则停止循环,为 False 则继续循环。Repeat 语句也可以被标注。
8.1.5 MySQL 中的注释符
MySQL 注释符有以下 3 种。

【任务 8-1】在命令行窗口中定义用户变量并执行多条 SQL 语句
【任务描述】
在命令行窗口中编辑与执行多条 SQL 语句,实现以下功能。
(1)为用户变量 name 赋值“人民邮电出版社”。
(2)从数据表“出版社”中查询“人民邮电出版社”的“出版社 ID”字段的值,并且将该值存储在用户变量 id 中。
(3)从数据表“图书信息”中查询“人民邮电出版社”的图书种类数量,并且将其存储在用户变量 num 中。
(4)显示用户变量 name、id 和 num 的值。
【任务实施】
在命令提示符后输入以下语句 :
Use MallDB ;
Set @name=" 人民邮电出版社 " ; -- 给变量 name 赋值
Set @id=( Select 出版社 ID From 出版社信息
Where 出版社名称 = " 人民邮电出版社 " ) ; -- 给变量 id 赋值
Set @num=( Select Count(*) From 图书信息 Where 出版社 =@id ) ;
Select @name , @id , @num ;

8.2 使用存储过程和游标获取与处理 MySQL 表数据
8.2.1 MySQL 的存储过程

在 MySQL 中使用存储过程主要有以下优点。

2.Delimiter 命令
Delimiter 命令用于更改 MySQL 语句的结束符,例如将默认结束符“;”更改为“$$”,避免与 SQL 语句的默认结束符冲突。其语法格式如下 :
Delimiter < 自定义的结束符 >
3.创建存储过程
创建存储过程的语法格式如下 :
Create Procedure < 存储过程名 >( [ < 参数列表 > ] )
[ < 存储过程的特征设置 > ]
< 存储过程体 >
4.查看存储过程
查看存储过程状态的语法格式如下 :
Show Procedure Status [ Like < 存储过程名的模式字符 > ] ;
5.调用存储过程
存储过程创建完成后,可以在程序、触发器或者其他存储过程中被调用,其语法格式如下:
Call < 存储过程名 >( [ < 参数列表 > ] ) ;
6.修改存储过程
可以使用 Alter Procedure 语句修改存储过程的某些特征,其语法格式如下 :

7.删除存储过程
在命令行窗口中删除存储过程的语法格式如下 :
Drop Procedure [ if exists ] < 存储过程名 > ;
8.2.2 MySQL 的游标


【任务 8-2】在命令行中创建存储过程查看指定出版社出版的图书种类
【任务描述】
在命令行窗口中创建存储过程 proc0501,其功能是从“图书信息”数据表中查看人民邮电出版社出版的图书种类。
【任务实施】
在命令行窗口中创建存储过程 proc0501
成功登录 MySQL 服务器后,在命令行提示符后输入以下语句 :
Delimiter $$
Use MallDB ;
Create Procedure proc0501()
Begin
Declare name varchar(16) ;
Declare id int ;
Declare num int ;
Set name=" 人民邮电出版社 " ; -- 给变量 name 赋值
Set id=(Select 出版社 ID From 出版社信息 Where 出版社名称 = name) ;
Select Count(*) Into num From 图书信息 Where 出版社 =id ;
Select name , id , num ;
End $$
Delimiter ;


【任务 8-3】在 Navicat for MySQL 中创建有输入参数的存储过程
【任务描述】
Navicat for MySQL 中创建包含输入参数的存储过程 proc0503,其功能是根据输入参数 strName 的值(存储“出版社名称”)从“图书信息”数据表中查看对应出版社出版的图书种类。
【任务实施】
查看数据库 MallDB 中已有的存储过程
启动 Navicat for MySQL,在窗口左侧双击打开连接 MallConn,再双击打开数据库MallDB,然后在工具栏中单击【函数】按钮,此时可以看到数据库 MallDB 中已有的存储过程,如图 8-8 所示。


在存储过程的定义窗口中输入如下所示的 SQL 语句 :
Begin
Declare id int ;
Declare num int ;
If (strName Is Not Null) Then
Set id=(Select 出版社 ID From 出版社信息 Where 出版社名称=strName) ;
Select Count(*) Into num From 图书信息 Where 出版社 =id ;
End If ;
Select strName , id , num ;
End
SQL 语句编辑完成后,单击工具栏中的【保存】按钮,对存储过程“proc0503”进行保存,存储过程保存完成后,完整的存储过程定义如图 8-13 所示。

图 8-13 完整的存储过程定义

8.3 使用函数获取与处理 MySQL 表数据
8.3.1 MySQL 的内置函数
MySQL 包含了 100 多个内置函数,从数学函数到比较函数等,系统定义的内置函数如表 8-2 所示。

8.3.2 MySQL 的自定义函数
1.自定义函数概述
MySQL 的自定义函数与存储过程相似,都是由 SQL 语句和过程式语句组成的代码片段,并且可以被应用程序调用。

2.自定义函数的定义
创建自定义函数的语法格式如下所示 :
Create Function < 函数名称 >( [< 输入参数名 > < 参数类型 > [ , … ] )
Returns < 函数返回值类型 >
[ < 函数的特征设置 > ]
< 函数体 >
3.查看自定义函数
Show Function Status [ Like < 函数名的模式字符 > ] ;
4.修改自定义函数
修改函数是指修改已定义好的自定义函数,其语法格式如下 :
Alter Function < 自定义函数名称 > [ < 函数的特征设置 > ] ;
5.删除自定义函数
删除自定义函数的语法格式如下 :
Drop Function [ if exists ] < 自定义函数名称 > ;
【任务 8-4】在命令行窗口中创建自定义函数 getTypeName()
【任务描述】
在命令行窗口中创建一个自定义函数 getTypeName(),该函数的功能是从“商品类型”数据表中根据指定的“类型编号”获取“类型名称”。
【任务实施】
在命令行窗口中创建自定义函数 getTypeName()
在命令提示符后输入以下语句 :
Delimiter $$
Create Function getTypeName( strTypeNumber varchar(9) )
Returns Varchar(10)
Deterministic Begin
Declare strTypeName varchar(10) ;
If ( strTypeNumber Is Not Null) Then
Select 类型名称 Into strTypeName From 商品类型
Where 类型编号 = strTypeNumber ;
End If ;
Return strTypeName ;
End $$
Delimiter ;

8.4 使用触发器获取与处理 MySQL 表数据
1.触发器概述
触发器是一种特殊的存储过程,它与数据表紧密相连,可以看作数据表定义的一部分,用于对数据表实施完整性约束。
存储过程可以使用 Call 命令调用,触发器的调用和存储过程不一样,触发器只能由数据库的特定事件来触发,并且不能接收参数。当满足触发器的触发条件时,数据库系统就会执行触发器中定义的程序语句。
2.创建触发器
MySQL 中创建触发器的语法格式如下:
Create Trigger < 触发器名称 > Before | After < 触发事件 >
On < 数据表名称 >
For Each Row
< 执行语句 > ;

3.查看触发器
查看触发器是指查看数据库中已存在的触发器的定义、状态和语法信息等,可以使用SQL 语句来查看已经创建的触发器。

Select * From Information_Schema.Triggers Where Trigger_Name=< 触发器名 > ;
4.删除触发器
删除触发器的语法格式如下 :
Drop Trigger [ < 数据库名 >.]< 触发器名 >
【任务 8-5】创建 Insert 触发器
【任务描述】
创建一个名为“order_insert”的触发器,当向“订单信息”数据表插入一条订单记录时,将用户变量 strInfo 的值设置为“在订单信息表中成功插入一条记录”。
【任务实施】
在命令行窗口中创建触发器 order_insert
在命令提示符后输入以下语句 :
Delimiter $$
Create Trigger order_insert After Insert On 订单信息 For Each Row
Begin
Set @strInfo= " 在订单信息表中成功插入一条记录 " ;
End $$
Delimiter ;

在 Triggers 数据表中查看触发器信息
在命令提示符后输入以下 Select 语句查看触发器信息 :
Select Trigger_Name,Event_Manipulation,Event_Object_Schema , Event_Object_Table
From Information_Schema.Triggers Where Trigger_Name="order_insert" ;
使用 Select 语句查看触发器信息的结果如图 8-19 所示。

应用触发器 order_insert
在命令提示符后直接输入以下语句查看用户变量 strInfo 的值,此时该变量的初始值为“0x”:
Select @strInfo ;
接下来,向“订单信息”数据表中插入一条记录,测试触发器 order_insert 是否会被触发。对应的语句如下 :
Insert Into 订单信息 ( 订单编号 , 提交订单时间 , 订单完成时间 , 送货方式 , 客户 ,
收货人 , 付款方式 , 商品总额 , 运费 , 优惠金额 , 应付总额 , 订单状态 )
Values("132577616584", "2020-10-25 11:13:08", "2020-10-28 15:31:12", " 京东快递 ", 2, " 陈芳 ", " 货到付款 ", 268.80, 0.00, 10.00, 258.80, " 已完成 ") ;

【任务 8-6】创建 Delete 触发器
【任务描述】
创建一个名为“commodityType_delete”的触发器,该触发器用于实现以下功能 :限制用户删除“商品类型”数据表中的记录,当用户删除记录时抛出禁止删除记录的错误提示信息。
【任务实施】
在命令行窗口中创建触发器 commodityType_delete
在命令提示符后输入以下语句 :
Delimiter $$
Create Trigger commodityType_delete Before Delete
On 商品类型 For Each Row
Begin
Set @strDeleteInfo=" 商品类型数据表中的记录不允许删除 " ;
Delete From 商品类型 ;
End $$
Delimiter ;


相关文章:
使用程序方式获取与处理MySQL表数据
8.1 执行多条语句获取 MySQL 表数据 8.1.1 MySQL 中的常量 8.1.2 MySQL 中的变量 1.用户变量 用户可以在表达式中使用自己定义的变量,这样的变量称为用户变量。 用户变量在使用前必须定义和初始化,如果使用没有初始化的变量&#x…...
计算机网络(五) —— 自定义协议简单网络程序
目录 一,关于“协议” 1.1 结构化数据 1.2 序列化和反序列化 二,网络版计算器实现准备 2.1 套用旧头文件 2.2 封装sock API 三,自定义协议 3.1 关于自定义协议 3.2 实现序列化和反序列化 3.3 测试 三,服务器实现 3.1…...
开源模型应用落地-qwen2-7b-instruct-LoRA微调-unsloth(让微调起飞)-单机单卡-V100(十七)
一、前言 本篇文章将在v100单卡服务器上,使用unsloth去高效微调QWen2系列模型,通过阅读本文,您将能够更好地掌握这些关键技术,理解其中的关键技术要点,并应用于自己的项目中。 使用unsloth能够使模型的微调速度提高 2 - 5 倍。在处理大规模数据或对时间要求较高的场景下,…...
[数据集][目标检测]车油口挡板开关闭合检测数据集VOC+YOLO格式138张2类别
数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):138 标注数量(xml文件个数):138 标注数量(txt文件个数):138 标注类别…...
Delphi 的 RSA 库 LockBox
LockBox 是用于 Delphi 的一套加密/解密控件 最早是一套商业控件,后来开源了。再后来,又有一个新版本的 LockBox,和旧版本完全不同。 旧版本的 LockBox 叫 LockBox 2;新版本的叫 LockBox 3。 这两个控件,都可以通过…...
element UI学习使用(1)
https://element.eleme.cn/2.6/#/zh-CN/component/container vue模块库,可复制直接使用 1、搜索框、下拉搜索框 <el-form :inline"true" class"demo-form-inline"><el-form-item label"结果搜索"><el-inputplaceho…...
如何搞定日语翻译?试试这四款工具
写一篇字数800-1000字的软文,用翻译新手的角度分享福昕翻译在线、福昕翻译客户端、海鲸AI翻译以及彩云翻译在翻译日语时候的表现,要求口语化表达。 最近对于一些轻小说突然感兴趣了,所以我开始尝试各种翻译工具来帮助我搞定日语翻译。今天&am…...
【STM32】独立看门狗(IWDG)原理详解及编程实践(上)
本篇文章是对STM32单片机“独立看门狗(IWDG)”的原理进行讲解。希望我的分享对你有所帮助! 目录 一、什么是独立看门狗 (一)简介 (二)、独立看门狗的原理 (三)、具体操…...
前端框架大观:探索现代Web开发的基石
目录 引言 一、前端框架概述 二、主流前端框架介绍 2.1 React 2.1.1 简介 2.1.2 特点 2.1.3 代码示例 2.2 Vue.js 2.2.1 简介 2.2.2 特点 2.2.3 代码示例 2.3 Angular 2.3.1 简介 2.3.2 特点 2.3.3 代码示例 三、其他前端框架与库 四、前端框架的选择 五、结…...
16 训练自己语言模型
在很多场景下下,可能微调模型并不能带来一个较好的效果。因为特定领域场景下,通用话模型过于通用,出现多而不精。样样通样样松;本章主要介绍如何在特定的数据上对模型进行预训练; 训练自己的语言模型(从头开…...
udp网络通信 socket
套接字是实现进程间通信的编程。IP可以标定主机在全网的唯一性,端口可以标定进程在主机的唯一性,那么socket通过IP端口号就可以让两个在全网唯一标定的进程进行通信。 套接字有三种: 域间套接字:实现主机内部的进程通信的编程 …...
LG AI研究开源EXAONE 3.0:一个7.8B双语语言模型,擅长英语和韩语,在实际应用和复杂推理中表现出色
EXAONE 3.0介绍:愿景与目标 EXAONE 3.0是LG AI研究所在语言模型发展中的一个重要里程碑,特别是在专家级AI领域。 “EXAONE”这个名称源自于“ EX pert A I for Every ONE”,反映了LG AI研究所致力于将专家级别的人工智能能力普及化的承诺。这…...
【mysql】mysql之主从部署以及介绍
本站以分享各种运维经验和运维所需要的技能为主 《python零基础入门》:python零基础入门学习 《python运维脚本》: python运维脚本实践 《shell》:shell学习 《terraform》持续更新中:terraform_Aws学习零基础入门到最佳实战 《k8…...
Invoke-Maldaptive:一款针对LDAP SearchFilter的安全分析工具
关于Invoke-Maldaptive MaLDAPtive 是一款针对LDAP SearchFilter的安全分析工具,旨在用于对LDAP SearchFilter 执行安全解析、混淆、反混淆和安全检测。 其基础是 100% 定制的 C# LDAP 解析器,该解析器处理标记化和语法树解析以及众多自定义属性&#x…...
QT 读取Excel表
一、QAxObject 读取excel表的内容,其仅在windows下生效,当然还有其他跨平台的方案。 config qaxcontainer #include <QAxObject>QStringList GetSheets(const QString& strPath) {QAxObject* excel new QAxObject("Excel.Application&…...
深入理解 Vue 组件样式管理:Scoped、Deep 和 !important 的使用20240909
深入理解 Vue 组件样式管理:Scoped、Deep 和 !important 的使用 在前端开发中,样式的管理与组件化开发之间的平衡一直是一个难题。Vue.js 提供了一些强大的工具来帮助开发者在开发复杂的应用时管理样式。这篇文章将详细介绍 Vue 中的 scoped、:deep() 和…...
C语言内存函数(21)
文章目录 前言一、memcpy的使用和模拟实现二、memmove的使用和模拟实现三、memset函数的使用四、memcmp函数的使用总结 前言 正文开始,发车! 一、memcpy的使用和模拟实现 函数模型:void* memcpy(void* destination, const void* source, size…...
三高基本概念之-并发和并行
并行和并发是计算机科学中两个重要但容易混淆的概念,它们之间的主要区别可以从以下几个方面进行阐述: 一、定义与含义 并行(Parallel):并行是指两个或多个事件在同一时刻发生,即这些事件在微观和宏观上都…...
宝塔面板FTP连接时“服务器发回了不可路由的地址。使用服务器地址代替。”
参考 https://blog.csdn.net/neizhiwang/article/details/106628899 错误描述 我得服务器是腾讯,然后使用宝塔建了个HTML网站,寻思用ftp上传,结果报错: 状态: 连接建立,等待欢迎消息... 状态: 初始化 TLS 中... 状…...
面试的一些小小经验
无论何时,找到合适的满意的工作(距离住处的地理位置,薪资,工作氛围)并不是一件容易的事情。个人能力与职位的适配性永远是有误差的客观存在。 十全十美难得,满足个人的个体化优先级才是客观的存在。 1.投简…...
Spark 之 入门讲解详细版(1)
1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目,8个月后成为Apache顶级项目,速度之快足见过人之处&…...
脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)
一、数据处理与分析实战 (一)实时滤波与参数调整 基础滤波操作 60Hz 工频滤波:勾选界面右侧 “60Hz” 复选框,可有效抑制电网干扰(适用于北美地区,欧洲用户可调整为 50Hz)。 平滑处理&…...
《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)
CSI-2 协议详细解析 (一) 1. CSI-2层定义(CSI-2 Layer Definitions) 分层结构 :CSI-2协议分为6层: 物理层(PHY Layer) : 定义电气特性、时钟机制和传输介质(导线&#…...
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…...
人机融合智能 | “人智交互”跨学科新领域
本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...
人工智能 - 在Dify、Coze、n8n、FastGPT和RAGFlow之间做出技术选型
在Dify、Coze、n8n、FastGPT和RAGFlow之间做出技术选型。这些平台各有侧重,适用场景差异显著。下面我将从核心功能定位、典型应用场景、真实体验痛点、选型决策关键点进行拆解,并提供具体场景下的推荐方案。 一、核心功能定位速览 平台核心定位技术栈亮…...
解析两阶段提交与三阶段提交的核心差异及MySQL实现方案
引言 在分布式系统的事务处理中,如何保障跨节点数据操作的一致性始终是核心挑战。经典的两阶段提交协议(2PC)通过准备阶段与提交阶段的协调机制,以同步决策模式确保事务原子性。其改进版本三阶段提交协议(3PC…...
python基础语法Ⅰ
python基础语法Ⅰ 常量和表达式变量是什么变量的语法1.定义变量使用变量 变量的类型1.整数2.浮点数(小数)3.字符串4.布尔5.其他 动态类型特征注释注释是什么注释的语法1.行注释2.文档字符串 注释的规范 常量和表达式 我们可以把python当作一个计算器,来进行一些算术…...
Qt Quick Controls模块功能及架构
Qt Quick Controls是Qt Quick的一个附加模块,提供了一套用于构建完整用户界面的UI控件。在Qt 6.0中,这个模块经历了重大重构和改进。 一、主要功能和特点 1. 架构重构 完全重写了底层架构,与Qt Quick更紧密集成 移除了对Qt Widgets的依赖&…...
当下AI智能硬件方案浅谈
背景: 现在大模型出来以后,打破了常规的机械式的对话,人机对话变得更聪明一点。 对话用到的技术主要是实时音视频,简称为RTC。下游硬件厂商一般都不会去自己开发音视频技术,开发自己的大模型。商用方案多见为字节、百…...
