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

IV转换放大器原理图及PCB设计分析
【前言】 今天给大家分享一下关于IV转换放大器的相关电路设计心得。IV转换使用的场合非常之多,尤其是电流型输出的传感器,比如光敏二极管、硅光电池等等,这些传感器输出的电流信号非常微弱,我们如果需要检测它们,首先得…...

【数学建模经验贴】一个研赛数模老手的经验
我(非C君,是一个朋友)参加了3次“深圳杯”数模,1次全国大学生数模,以及1次全国研究生数模,2016年参加了全国研究生数模的交流会,但没有参加过美赛,应该算是一个江湖老手了吧。下面内…...

vivo手机已删除的短信还能恢复吗?
虽然现在我们很少使用vivo手机的短信功能,但是我们偶尔还会通过vivo手机短信功能接收一些重要的信息。如果我们在清理垃圾短信的时候误删了vivo手机重要短信,该怎么恢复呢? 方法一:通过vivo云服务恢复 1、确保您已开启vivo云服务…...

[网络][CISCO]CISCO IOS升级
CISCO IOS升级-(转)2008-06-27 15:35IOS 升级 在介绍CISCO路由器IOS升级方法前,有必要对Cisco路由器的存储器的相关知识作以简单介绍。路由器与计算机相似,它也有内存和操作系统。在Cisco路由器中,其操作系统叫做互连…...

通过python提取PDF文件指定页的图片
整体思路 要从 PDF 文件中提取指定页和指定位置的图片,可以分几个步骤来实现: 1.1 准备所需工具与库 在 Python 中处理 PDF 和图像时,需要使用几个库: PyMuPDF (fitz):用于读取和处理 PDF 文件,可以精确…...

Leetcode Hot 100刷题记录 -Day12(轮转数组)
轮转数组 问题描述: 给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。 示例 1: 输入: nums [1,2,3,4,5,6,7], k 3 输出: [5,6,7,1,2,3,4]解释: 向右轮转 1 步: [7,1,2,3,4,5,6] 向右轮转 2 步: [6,7,1,2,3,4,5] 向…...

GitHub每日最火火火项目(9.13)
以下是对这些项目的详细介绍: fishaudio 的 fish-speech: 基本信息:这是一种全新的语音技术解决方案,属于文本到语音(Text-to-Speech,TTS)技术范畴。技术特点: 多语言支持ÿ…...

力扣--649.Dota2参议院
Dota2 的世界里有两个阵营:Radiant(天辉)和 Dire(夜魇) Dota2 参议院由来自两派的参议员组成。现在参议院希望对一个 Dota2 游戏里的改变作出决定。他们以一个基于轮为过程的投票进行。在每一轮中,每一位参…...

vim 安装与配置教程(详细教程)
vim就是一个功能非常强大的文本编辑器,可以自己DIY的那种 ,不但可以写代码 ,还可编译 ,可以让你手不离键盘的完成鼠标的所有操作。 如果想要了解vim的的发展历史和详细解说,可以自行上网搜索,我主要是记录一…...

【WPF】Popup的使用
WPF(Windows Presentation Foundation)中的Popup控件用于创建弹出窗口,如工具提示、上下文菜单等。Popup控件本身并不直接显示任何内容,它需要一个子元素来显示实际的内容。 以下是一个简单的XAML示例,展示如何创建一…...