Mysql视图、存储过程、函数、触发器

视图

视图概述

视图是一种虚拟的表。视图并不在数据库中实际存在,行和列数据来自定义视图的查询中使用的表,并且是在使用视图时动态生成的,通俗讲,视图就是一条select语句执行后返回的结果集。
视图相对普通表的优势
	简单:使用视图的用户完全不需要关心后面对应的表的结构,关联条件和筛选条件,对用户来说已经是过滤好的复合条件的结果集
	数据独立:一旦视图的结构确定了,可以屏蔽表结构变化对用户的影响,源表增加列对视图没有影响;源表修改列名,则可以通过修改视图来解决,不会造成对访问着的影响
	安全:使用视图的用户只能访问他们被允许直接查询的结果集,对表的权限管理并不能限制到某个列,但是通过视图就可以简单的实现

创建或者修改视图

建议先删除再创建
	DROP VIEW VIEW_name;
	create view view_name
	as
	select ...
	from view_name
alter修改
	alter view 视图名
	as
	select ...

查看视图

show tables; 查看所有的表,包括视图
show table status from mysql like ‘视图名称’
show create view view_name\G
describe 查看视图结构

删除视图

drop view view_name[..,..,..]

存储过程和函数

存储过程和函数概述

存储过程和函数是事先经过编译并存储在数据库中的一段sql语句集合,调用存储过程和函数可以简化应用开发人员的很多工作,减少数据在数据库和应用服务器之间的传输,对于提高数据处理的效率是有好处的
函数和存储过程的区别在于函数必须有返回值,而存储过程没有
函数:是一个有返回值的函数
过程:是一个没有返回值的函数

创建存储过程

create procedure 名称(参数,..)
begin
	select ...;
end$

// delimiter $ 把默认的分sql分隔符替换成指定的分割符

调用存储过程

call 存储过程名称 分隔符

查看存储过程

select name from mysql.proc where db = 'db_name'; 查询指定数据库中多有的存储过程
show procedure status; 查询存储过程的状态信息
show create procedure 存储过程名称\G; 查看某个存储过程的定义

删除存储过程

Drop procedure 【IF EXISTS】存储过程名称

语法

变量
	declare num int default 10;声明一个名为num,类型为int,默认值为10的变量
	赋值
		set num = num + 10; 为变量赋值
		select count(*) into num from temp;把查询出来的结果赋值给变量num
if条件判断
	create procedure pro_test4()
	begin
	declare height int default 175;
	declare description varchar(50) default '';
		if height > 180 then 
				set description = 'A';
		elseif height >= 170 then
				set description = 'B';
	  else 
				set description = 'C';
		end if;
	select concat('身材类型是:',description);
	end;
传递参数
	参数类型:in 输入参数、out输出参数、inout输入输出参数
	1
		create procedure pro_test5(in height int)
		begin
		declare description varchar(50) default '';
			if height > 180 then 
					set description = 'A';
			elseif height >= 170 then
					set description = 'B';
		  else 
					set description = 'C';
			end if;
		select concat('身高 ',height,'的身材类型是:',description);
		end;
		--调用
		call pro_test5(181);
	2
		create procedure pro_test6(in height int,out description varchar(50))
		begin
			if height >= 180 then
					set description = 'A';
			elseif height >= 170 and height < 180 then
					set description = 'B';
			else 
					set description = 'C';
			end if;
		end;
		--调用
		call pro_test6(175,@description);--@description用户会话变量
		select @description;
case结构
	create procedure pro_test7(mon int)
	begin
	declare result varchar(10);
		case
			when mon >=1 and mon <=3 then
				set result = '第一季度';
			when mon >= 4 and mon <= 6 then
				set result = '第二季度';
			when mon >= 7 and mon <= 9 then
				set result = '第三季度';
			when mon >= 10 and mon <= 12 then
				set result = '第四季度';
			else 
				set result = '不在季度范围';
		end case;
	select concat('传递的月份为:',mon,',计算出的结果为:',result) as content;
	end;
	call pro_test7(12);
while循环
	特点:满足条件继续循环
	create procedure pro_test8(n int)
	begin
	declare total int default 0;
	declare num int default 1;
		while num <= n do
			set total = total + num;
			set num = num + 1;
		end while;
		select total;
	end;
	call pro_test8(100);
repeat结构
	特点:满足条件退出循环
	create procedure pro_test9(n int)
	begin
	declare total int default 0;
		repeat 
			set total = total + n;
			set n = n - 1;
			until n=0 --这里不能加分号
		end repeat;
		select total;
	end;
	call pro_test9(100);
loop语句
	create procedure pro_test10(n int)
	begin 
	declare total int default 0;
	c:loop
		set total = total + n;
		set n = n - 1;
		if n <= 0 then
			leave c;
		end if;
	end loop c;
	select total;
	end;
	call pro_test10(100);
leave语句
	loop实现简单的循环,退出循环的条件需要使用其他的语句定义,通常可以使用LEAVE语句实现
	用来结束loop循环
游标/光标
	游标是用来存储查询结果集的数据类型,在存储的过程和函数中可以使用光标对结果集进行循环处理。
	光标的使用包括光标的声明、open、fetch和close
	create procedure pro_test12()
	begin
	 declare e_id varchar(50);
	 declare e_name varchar(50);
	 declare e_gbm varchar(50);
	 declare e_dm varchar(50);
	 declare has_data int default 1;
	 --声明游标
	 declare corp_result cursor for select c_id,c_name,c_gbm,c_dm from t_corp where c_gbm like '_00' order by c_gbm;
	 --必须放在声明游标之后
	 DECLARE EXIT HANDLER FOR NOT FOUND set has_data = 0;
	 
	 open corp_result;
	 repeat
			fetch corp_result into e_id,e_name,e_gbm,e_dm;
			select concat('e_id=',e_id,',e_name=',e_name,',e_gbm=',e_gbm,',e_dm=',e_dm);
	 until has_data = 0
		end repeat;
	 close corp_result;
	end;

存储函数

和存储过程类似

create function fun1(gbm varchar(10))
RETURNS int
begin
	declare num int ;
	select count(1) into num from t_aty_corp where c_gbm like CONCAT('%',gbm,'%');
	return num;
end;

调用 select fun1('A');

删除 drop funciton fun1();

触发器

介绍

触发器是与表有关的数据库对象,指在insert、update、delete之前或之后触发并执行触发器中定义的sql语句集合
触发器可以协助数据库端确保数据的完整性,日志记录,数据校验等
触发器类型
	insert型触发器--》new 表示将要或者已经新增的数据
	update型触发器--》old表示修改之前的数据,new表示将要或者已经修改后的数据
	delete型触发器--》old表示将要或者已经删除的数据
mysql现在只支持行级触发器,不支持语句级触发

创建触发器

create trigger emp_insert_trigger
	after insert
	on emp
	for each row
	begin
		INSERT INTO emp_logs(id, operation, operate_time, operate_id, operate_params) 
		VALUES (null, 'insert', now(), new.id,concat('id=',new.id,',name=',new.name,',age=',new.age,'salary=',new.salary));
	end;

删除触发器

drop trigger triggername;

查看触发器

show triggers\G;

你可能感兴趣的:(数据库,数据库,mysql)