mysql存储过程(通俗易懂)
Posted 巧克力不假
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql存储过程(通俗易懂)相关的知识,希望对你有一定的参考价值。
文章目录
目录
存储过程
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存储过程(通俗易懂)的主要内容,如果未能解决你的问题,请参考以下文章
通俗易懂!navicate如何导入MySQL数据库的.sql文件?