使用程序方式获取与处理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 语句组合为一个语句块(语句块相当于一个单一语句),以达到一起执行的目的。

2If…Then…Else 语句

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

If 语句的执行过程为 :如果条件表达式的值为 True,则执行对应的语句块 ;如果所有的条件表达式的值为 False,并且有 Else 子句,则执行 Else 子句对应的语句块。

3Case 语句

Case 语句用于计算列表并返回多个可能结果表达式中的一个,可用于实现程序的多分支结构,虽然使用 If…Then…Else 语句也能够实现多分支结构,但是使用 Case 语句的程序可读性更强,一条 Case 语句经常可以充当一条 If…Then…Else 语句。

4While 循环语句

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

While 循环语句的执行过程说明如下:首先判断逻辑表达式的值是否为 True,为 True 时则执行“语句块”中的语句,然后再次进行判断,为 True 则继续循环,为 False 则结束循环。

5Repeat 循环语句

Repeat 循环语句是有条件控制的循环语句,当满足特定条件时,就会跳出循环语句。

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

8.1.5  MySQL 中的注释符

MySQL 注释符有以下 3 种。

任务 8-1】在命令行窗口中定义用户变量并执行多条 SQL 语句

任务描述

在命令行窗口中编辑与执行多条 SQL 语句,实现以下功能。

1)为用户变量 name 赋值“人民邮电出版社”。

2)从数据表“出版社”中查询“人民邮电出版社”的“出版社 ID”字段的值,并且将该值存储在用户变量 id 中。

3)从数据表“图书信息”中查询“人民邮电出版社”的图书种类数量,并且将其存储在用户变量 num 中。

4)显示用户变量 nameid 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 中使用存储过程主要有以下优点。

2Delimiter 命令

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 ;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值