使用程序方式获取与处理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.投简…...

【Axure高保真原型】引导弹窗
今天和大家中分享引导弹窗的原型模板,载入页面后,会显示引导弹窗,适用于引导用户使用页面,点击完成后,会显示下一个引导弹窗,直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...

Spark 之 入门讲解详细版(1)
1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目,8个月后成为Apache顶级项目,速度之快足见过人之处&…...

基于当前项目通过npm包形式暴露公共组件
1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹,并新增内容 3.创建package文件夹...

Python实现prophet 理论及参数优化
文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候,写过一篇简单实现,后期随着对该模型的深入研究,本次记录涉及到prophet 的公式以及参数调优,从公式可以更直观…...
【Java学习笔记】BigInteger 和 BigDecimal 类
BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点:传参类型必须是类对象 一、BigInteger 1. 作用:适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...

基于SpringBoot在线拍卖系统的设计和实现
摘 要 随着社会的发展,社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统,主要的模块包括管理员;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...

c++第七天 继承与派生2
这一篇文章主要内容是 派生类构造函数与析构函数 在派生类中重写基类成员 以及多继承 第一部分:派生类构造函数与析构函数 当创建一个派生类对象时,基类成员是如何初始化的? 1.当派生类对象创建的时候,基类成员的初始化顺序 …...

【LeetCode】算法详解#6 ---除自身以外数组的乘积
1.题目介绍 给定一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O…...

【UE5 C++】通过文件对话框获取选择文件的路径
目录 效果 步骤 源码 效果 步骤 1. 在“xxx.Build.cs”中添加需要使用的模块 ,这里主要使用“DesktopPlatform”模块 2. 添加后闭UE编辑器,右键点击 .uproject 文件,选择 "Generate Visual Studio project files",重…...

macOS 终端智能代理检测
🧠 终端智能代理检测:自动判断是否需要设置代理访问 GitHub 在开发中,使用 GitHub 是非常常见的需求。但有时候我们会发现某些命令失败、插件无法更新,例如: fatal: unable to access https://github.com/ohmyzsh/oh…...