mysql存储过程(通俗易懂)

Posted 巧克力不假

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql存储过程(通俗易懂)相关的知识,希望对你有一定的参考价值。

文章目录

目录

文章目录

存储过程

   1,什么是存储过程?

   2,使用存储过程的好处

一、基本语法

一、创建

二、查询

三、调用

四、删除

 五、定义变量

六、给变量赋值

五、案例

二、参数和变量

  一、参数

    一、分类

     二、案例

  二、变量

一、分类:

二、定义变量

   1、用户变量

2、局部变量

三、控制语句

一、if

 语法

 案例

二、case

 语法

 案例

三、while

 语法

 案例

四、repeat

 语法

 案例

五、loop

 语法

 案例

四、存储函数

语法

案例

和存储过程的区别



存储过程

   1,什么是存储过程?

           事先经过编译存储在数据库中的一段sql语句集合。简单来说就是一组封装好的sql语句,类似与java的函数。

   2,使用存储过程的好处

          2.1、实现代码的封装和复用。

          2.2、减少网络交互,提高效率。 

一、基本语法

一、创建

create procudure 名称([参数])
begin
    sql代码
end;

二、查询

show create procedure 名称;

select * from information_schema.routines where routine_schema = 'dbName'; -- 查询数据库中所有存储过程和函数

三、调用

call 名称([参数]);

四、删除

drop procedure 名称;

 五、定义变量

declare 变量名 int [default 1];
default:代表给变量赋初值

六、给变量赋值

set 变量名 = 1;

五、案例

下面创建了一个名称为test的存储函数。

-- 创建

create procedure test()
begin
select * from emp ;
end;

-- 	查看
show create procedure test;

--  调用
call test();

-- 	删除
drop procedure test;

二、参数和变量

  一、参数

    一、分类

     *        in              含义:用户传入参数

     *       out             含义:用于传出值

     *      inout           含义:即传入值又传出值

     二、案例


-- test用于计算x,y的和,并将和赋值给sum
create procedure test(in x int,in y int,inout sum int) 
 sum = x + y;
end;

-- 定义用户变量
set @a=1;
set @b=1;
set @c=0;

-- 指定存储过程
call test(a,b,c);
查询c的值,发现c为2.
select c;

  二、变量

一、分类:

 系统变量:系统内置变量。

用户变量:在当前回话创建的变量叫做用户变量,仅在当前回话有效。

局部变量:在存储过程中创建的变量叫做局部变量,仅在存储过程中有效。

二、定义变量

   1、用户变量

   用户定义的,使用时不用提前声明,用的时候直接用 "@变量名" 即可,并且其作用域为当前会话,可以通过=和:=两种方式赋值

-- 设置变量value
set @名称 = value;
set @名称 := value;

-- 设置变量value
select @名称:=value;
select 字段 into @名称 from 表名;

案例:

set @a = 1;
set @b :=2;
select @c=3;
select id into @d form student;

2、局部变量

注意:使用局部变量需要定义,定义变量必须要在存储过程最前面。

declare 变量名 int [default 1];
default:代表给变量赋初值
set 名称 :=value;
select 字段 into 名称 from 表名;

 案例,定义a变量并赋值1;定义了b、c变量但是没有赋值,并通过两种不同的方法赋值。

create test 
begin
declare a int default 1;
declare b int;
declare c int ;
set b:=2;
select id into c from student;
end;

三、控制语句

一、if

 语法

if 条件 then 
 ...
elseif 条件 then
 ...
elseif 条件 then
 ...
else
 ...
end if;

 案例

 create procedure ifTest(in a int,out s varchar(20))
 begin
   if a < 1000 then set s='低薪';
	 elseif a<2000 then set s='中薪';
	 else set s = '高薪';
	 end if;
 end;
  set @sal = 1500;
	call ifTest(@sal,@salGrade);
	select @salGrade;

二、case

 语法

CASE 
WHEN 条件  THEN   满足
WHEN 条件  THEN   满足
WHEN 条件  THEN   满足
ELSE 其他
END CASE;

 案例

create procedure useOtherCase(in paramOne int,out result varchar(30))
BEGIN
    CASE 
          WHEN paramOne<0  THEN set result = '小于0';
          WHEN paramOne<10  THEN set result = '小于10';
          ELSE set result = '其他';
    END CASE;
END;

call useOtherCase(1,@result);
select @result;

三、while

 语法

while 条件 do
    ... 
end while;

 案例

create procedure whileTest(in x int,in y int,inout sum int) 
begin
declare a int default x;
declare b int default y;
while b>=a
do 
set sum = sum + a;
set a=a+1;
end while;
end;
set @a_b_sum = 1;
 call whileTest(2,8,@a_b_sum);
 select @a_b_sum;

四、repeat

和do while一样,循环必须会执行一次。

 语法

repeat
    ...
until 退出条件 
end repeat;

 案例

create procedure repeatTest(in x int ,in y int,inout sum int)
begin
declare a int default x;
declare b int default y;
repeat
set sum=sum*sum;
until sum>a*b
end repeat;
end;
set @sum = 2;
call repeatTest(4,5,@sum);
select @sum;

五、loop

 语法

 -- leave 相当于break; iterate 相当于continue

label: LOOP
    ....
    IF exit_condition THEN
        LEAVE label;   --  break;
    ELSE 
        ITERATE label; -- continue
    END IF; 

END LOOP label;

 案例

 create procedure loopTest(in min int,in max int ,inout result int)
 begin
 declare i int default min;
 xx: LOOP
 
	IF i>max THEN
		LEAVE xx; 
	elseif i%2=0 then
	  set  result=result+i;
		set i=i+2;
	else
	  set i=i+1;
	END IF; 
	
END LOOP xx;
end;
-- 如果给result设置初始值,记得参数要用inout。 
 set @result = 0;
 call loopTest(2,17,@result);
 select @result;
 

四、存储函数

和存储过程一样,不过需要要有返回值

语法

CREATE FUNCTION 存储函数名称 ([参数列表 ])
RETURNS type [characteristic ...]
begin
  N条SQL语句
  return ...
end;

案例

-- 调用函数返回员工数量
create function myCount(deptnoParam int )
returns INTEGER DETERMINISTIC
BEGIN
  declare xx int;
    select count(*) into xx from emp where deptno = deptnoParam;
    return xx;
END;

-- 调用
select myCount(10) from dual;

和存储过程的区别

  • 需要声明返回类型

  • 必须要有return

  • 参数只能是in,(可以省略)

java面试题-通俗易懂的解释mysql相关问题

一、MYSQL存储引擎MYISAM与InnoDB区别
1、MYISAM需要的存储空间小;InnoDB需要更多的内存和存储空间。
2、MYISAM不支持事务;InnoDB支持事务。
3、MYISAM在select查询更快,内部有计数器,可直接调取;InnoDB没有。
4、MYISAM支持表级锁定;InnoDB不仅支持表级锁定,而且支持行级锁定,所以也支持高并发。

二、什么是索引,为什么要建立索引
索引好比书中的目录,通过目录查找数据里面的具体内容,在数据表里面作为指针存在;
优点加快检索的速度,提高系统性能,缺点索引需要占用磁盘物理空间,对表进行维护,在表中进行添加、修改、删除操作时,索引需要动态的维护,所以会降低执行效率。

三、MYSQL索引有哪几种类型
主键索引:每个表只有一个主键索引,表示数据列不能重复。
唯一索引:数据列不允许有重复,但可以为NULL值。
普通索引:就是一般索引,没有任何限制。
全文索引:主要用来查找文本中关键字,相当于搜索引擎。

四、索引的原理,创建索引的原则
就是把无序的记录变成有序的查询结果。
原则:
1、经常更新的字段,不适合做索引
2、查询字段频繁的操作,适合建立索引
3、组合索引,按左查询匹配原则
4、有外键的列一定要建立索引
5、对于字段text、image内容涉及比较多的,不适合做索引

五、数据库事务的四大特性有哪些
1、原子性:事务执行的最小单位,代表执行要不全部完成,要不都没完成。
2、一致性:执行事务后,数据保持一致。
3、隔离性:数据在并发执行下,事务间的访问是独立存在的。
4、持久性:事务提交后,数据的改变是持久不变的,不因外界因素改变,比如断电、数据库发生故障等。

六、什么是脏读、幻读
脏读:某个事务已进行了更新,但读到的数据还是以前的数据。
幻读:某个事务执行查询操作后,出现前后查询不一致的数据。

七、什么是行级锁、表级锁、页级锁
行级锁:是锁粒级别最细的锁,但加锁的开销最大,针对表中的行进行加锁。
表级锁:是锁粒级别最大的锁,针对整张表进行加锁,实现简单,资源消耗少。
页级锁:是介于行级锁、表级锁之间的锁,用来锁定相邻的一组记录。

八、MySQL锁的类别有哪些
共享锁:又称读锁,对用户进行数据读操作时,同时加上共享锁。
排他锁:又称写锁,当用户对数据进行写操作,此时加上排他锁,不允许其它用户再次操作。

九、数据库产生死锁怎么解决
死锁是两个以上事务抢夺资源,并请求对方锁定资源,从而导致恶性循环,形成的死锁现象。
解决方式:
1、在同一事务中,尽量做到一次锁定所有需要资源,减少死锁概率。
2、提升锁的级别,由以前表级锁或页级锁,升级到行级锁。
3、业务比较多的,可以采用分布式事务锁或者乐观锁

十、什么是乐观锁和悲观锁
乐观锁:在并发条件下,通过在数据库设置version版本号方式进行数据锁定。
悲观锁:在并发条件下,使用数据库的锁机制,屏蔽可能违反数据的完整性操作。

以上是关于mysql存储过程(通俗易懂)的主要内容,如果未能解决你的问题,请参考以下文章

Windows安装mysql详细步骤(通俗易懂,简单上手)

MySQL最新教程通俗易懂

通俗易懂!navicate如何导入MySQL数据库的.sql文件?

通俗易懂!navicate如何导入MySQL数据库的.sql文件?

这篇 MySQL 索引和 B+Tree 讲的太通俗易懂!

狂神说JavaMySQL最新教程通俗易懂--笔记