欢迎访问 生活随笔!

凯发k8官方网

当前位置: 凯发k8官方网 > 运维知识 > 数据库 >内容正文

数据库

mysql变量,存储过程,函数,流程控制详解(小白都能懂哦) -凯发k8官方网

发布时间:2024/10/14 数据库 50 豆豆
凯发k8官方网 收集整理的这篇文章主要介绍了 mysql变量,存储过程,函数,流程控制详解(小白都能懂哦) 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

1.系统变量
2.自定义变量
3.存储过程
4.函数
5.流程控制结构

1.1系统变量的分类

系统变量:分为全局变量和会话变量

1.2系统变量的介绍

系统变量由系统提供,不是用户定义,属于服务器层面

1.3系统变量的相关操作

(1).查看所有的系统变量

show global(session) variables
global表示查看全局变量
session表示会话变量

(2)查看满足条件的部分系统变量

show global(session) variables like “...”

(3)查看指定某个系统变量的值

select @@global(@@session).变量名

(4)为某一个系统变量赋值

set global(session) 系统变量名=值
或者:
set @@global(session).系统变量=值

以上的各种指令可以不加global和session默认为session

2.1自定义变量的分类

用户变量和局部变量

2.2自定义变量的介绍

变量是用户自定义,不是由系统提供
用户变量:针对当前会话游有效,能声明初始化,赋值使用
局部变量:仅仅在定义它的begin end中有效,应用在begin,end中的第一句话

2.3自定义变量的相关操作

1.用户变量的声明并初始化的五种方式

set @用户变量名=值;
set @用户变量名:=值;
select @用户变量名:=值;
select @用户变量名:=值;
select 字段 into @变量名 from 表

2.用户变量的赋值

set @变量名=值;
不需要指定类型在赋值的时候自动匹配类型

3.用户变量求和案例

set @m=1;
set @n=2;
set @sum=@m @n;
select @sum;

4.局部变量的声明和声明初始化

declare 变量名 类型;
declare 变量名 类型 default 值;

5.局部变量的赋值

set 局部变量名=值;
set 局部变量名:=值;
select @局部变量名:=值;
select 字段 into @局部变量名 from 表

6.局部变量的求和例子:

declare m int default 1;
declare n int default 2;
set sum=m n;
select sum;
当然由于不在begin end中所以运行会报错但是语法没问题

2.4用户变量和局部变量的区别

二者不同在于用户变量作用域在当前会话,定义使用在会话中的任何一个位置,语法上必须加@符号,不用限定类型 局部变量作用域在begin,end中只能在这里边使用并且为第一句话,有时候在定义时不需要加@,需要限定类型

3.1存储过程概念

存储过程是一个预编译的sql语句,优点是允许模块化的设计,就是说只需要创建一次,以后在该程序中就可以调用多次。如果某次操作需要执行多次sql,使用存储过程比单纯sql语句执行要快。有点类似java里边的方法

3.2存储过程的好处:

1.提高代码重用性
2.简化操作
3.减少编译次数并且减少和数据库服务器的连接次数,提高效率
这里的减少编译次数指当我们第一次调用时系统会进行编译,第二次再调用的时候用第一遍编译好的代码 关于减少连接服务器次数。一般都是一条sql语句会和服务器有一次联系,存储过程中有多条sql语句在一起只与服务器建立一次联系,存储过程里边的sql语句是不能修改的

3.3存储过程使用流程

1.创建存储过程

create procedure 存储过程名(参数列表)
begin
end

2.存储过程的参数列表;

每个参数包含三部分:参数模式 参数名 参数类型,存储模式可以有多个参数

3.参数模式(等下例子详讲)

in:参数可以作为输入
out:参数作为输出
inout:既可以作为输入又可以作为输出

4.调用语法:

call 存储过程名(实参列表)

5.设置存储过程的结束标记语法:

delimiter 结束标记

6.使用存储过程注意点

1.存储过程必须设置结束标记
2.如果存储过程只有一句话那么begin,end可以省略
3.存储过程中每条独立的sql语句都要有分号

7.例子详解
博主之后的例子都会用到这个表

例子1(空参存储过程):在student表中加入两个新的同学

delimiter $ create procedure my1() begininsert into student() values(5,"大白","男",20),(6,"小白","女",21); end $ call my1();//这个是调用

运行完毕后,表中数据如图:

例子2(带in模式的存储过程):在student表中查找大白和小白两个新同学的信息,并且修改小白同学的性别为人妖

delimiter $ create procedure my2(in name1 varchar(4),in name2 varchar(4)) begin select * from student where sname=name1 or sname=name2;update student set ssex="人妖" where sname=name1; end $call my2("小白","大白") ;

例子3(带out模式的存储过程):我们查找小白同学的性别并且返回出来

delimiter $ create procedure my3(out sexx varchar(4)) begin select ssex into sexx from student where sname="小白"; end $ call my3(@ssex);

ssex和sexx相当于值传递
ssex into sexx:相当于把查询的结果赋值给这个可以输出的局部变量

inout就是传入和传出都用这一个inout定义的参数
如果我们不在变量的前面添加参数的模式

3.3删除和查看存储过程

1.删除存储过程

drop procedure 存储过程名

注意:这里只能单独删除

2.查看存储过程

show create procedure 存储过程名

3.3存储过程的优缺点

优点

1)存储过程是预编译过的,执行效率高。
2)存储过程的代码直接存放于数据库中,通过存储过程名直接调用,减少网络通讯。
3)安全性高,执行存储过程需要有一定权限的用户。
4)存储过程可以重复使用,减少数据库开发人员的工作量。

缺点

1)调试麻烦,但是用 pl/sql developer 调试很方便!弥补这个缺点。
2)移植问题,数据库端代码当然是与数据库相关的。但是如果是做工程型项目,基本不存在移植问题。
3)重新编译问题,因为后端代码是运行前编译的,如果带有引用关系的对象发生改变时,受影响的存储过程、包将需要重新编译(不过也可以设置成运行时刻自动编译)。
4)如果在一个程序系统中大量的使用存储过程,到程序交付使用的时候随着用户需求的增加会导致数据结构的变化,接着就是系统的相关问题了,最后如果用户想维护该系统可以说是很难很难、而且代价是空前的,维护起来更麻烦。

4.1函数简介

1.可以参照存储过程,两者概念一样
2.函数在mysql中的好处和存储过程类似

4.2函数的基础语法(例子会和流程控制结构一起讲):

1.创建函数:

create function 函数名(参数列表) returns 返回类型
begin
函数体
end
这里的每一个参数包含参数名和参数类型,函数体肯定有return语句

2.函数的调用

select 函数名(参数列表)
参数列表是先参数名再参数类型

3.查看函数

show create function 函数名

4.删除函数

drop function 函数名

4.3函数和存储过程的区别:

1.存储过程可以有0或多个返回(就是out类型的数据),适合批量的插入和更新
2.有且仅有一个返回值,适合做处理数据后返回一个结果

5.1流程控制结构分类

顺序结构,分支结构,循环结构

5.2分支结构

1.if结构:

if 条件1 then 语句1 elseif 条件2 then 语句2else 语句n end if;

应用范围:begin end中

例子:

delimiter // create function a1(score int) returns char beginif score>=90 and score<=100 then return 'a';elseif score>=80 then return 'b';elseif score>=60 then return 'c';else return 'd';end if; end // select a1(88)

if函数

if(表达式1,表达式2,表达式3) 执行顺序:如果表达式1成立则返回表达式2的值,否则返回表达式3的值

例子:

select if (1=2,1, 2)

运行结果:

2.case结构:
语法:
case结构:作为独立的语句

case结构:作为表达式

两种case结构作为表达式使用,可以嵌套在其他语句种使用,可以放在任何地方,begin end里边或外边
作为独立的语句使用只能放在begin end里
例子(作为独立的语句):

delimiter // create procedure a2(in score int) begincasewhen score>=90 and score<=100 then select 'a';when score>=80 then select 'b';when score>=60 then select 'c';else select 'd'; end case; end // call a2(88) //
5.3循环结构

1.while循环

【标签】while循环条件 do 循环体 end while【标签】

想用循环控制就要用标签

当然也可以不用标签:
例子:

delimiter // create procedure a3(in score int) begindeclare i int default 4;while i<=score doinsert into sanguo values(i,"赵云","女");set i=i1;end while; end // call a3(10) //

我们用标签:

delimiter // create procedure a8(in score int) begindeclare i int default 40;a:while i<=score doif i=50 or i=60 then insert into sanguo values(i,"赵云","女");end if;set i=i1;end while a; end // call a8(70) //

2.loop循环

【标签】loop 循环体 end loop 【标签】

3.repeat循环

【标签】repeat 循环体 until 结束循环条件 end repeat 【标签】

总结

以上是凯发k8官方网为你收集整理的mysql变量,存储过程,函数,流程控制详解(小白都能懂哦)的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得凯发k8官方网网站内容还不错,欢迎将凯发k8官方网推荐给好友。

网站地图