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

创建一个示例数据库和表及表中内容

创建数据库
CREATE DATABASE /*!32312 IF NOT EXISTS*/ `hello` /*!40100 DEFAULT CHARACTER SET utf8 */;

创建表结构
CREATE TABLE `student` (
`id` tinyint(4) NOT NULL AUTO_INCREMENT,
`name` varchar(20) DEFAULT NULL,
`age` tinyint(4) DEFAULT '25',
`sex` enum('F','M') DEFAULT 'M',
`phone` char(11) DEFAULT NULL,
`class` tinyint(4) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8;

插入表数据
INSERT INTO `student` VALUES
(1,'Bai zhantang',24,'M','10086',1),
(2,'Tong xiangyu',23,'F','10010',NULL),
(3,'Guo furong',21,'F','11010',2),
(4,'Li dazui',28,'M','12030',NULL),
(5,'Mo xiaobei',15,'F','13041',1),
(6,'Lu xiucai',22,'M','10001',NULL),
(7,'Yan xiaoliu',20,'M','14325',2),
(8,'Xing yusen',29,'M','3525436',1),
(9,'Lu wushuang',19,'F','123545',NULL),
(10,'Zhao shuai',26,'M','345346',NULL),
(11,'Bao zheng',33,'M','98745',2),
(12,'Liu yifei',19,'F','13423543',NULL),
(13,'Yang mi',29,'F','74568',2),
(14,'Liu yan',23,'F','677956',2),
(15,'Hu ge',33,'M','67957695',NULL),
(16,'Sun wukong',100,'M','46745674',NULL),
(17,'Zhou xingchi',55,'M','356756',NULL),
(18,'Liu dehua',57,'M','5624565',NULL);


视图

视图(view)是一种虚拟存在的表,是一个逻辑表,本身并不包含数据。作为一个select语句保存在数据字典中的。

将表的部分数据创建视图,方便查看,而不是输出表全部内容,只获取自己需要的。

视图的优点

1)简单:使用视图的用户完全不需要关心后面对应的表的结构、关联条件和筛选条件,对用户来说已经是过滤好的复合条件的结果集。

2)安全:使用视图的用户只能访问他们被允许查询的结果集,对表的权限管理并不能限制到某个行某个列,但是通过视图就可以简单的实现。

3)数据独立:一旦视图的结构确定了,可以屏蔽表结构变化对用户的影响,源表增加列对视图没有影响;源表修改列名,则可以通过修改视图来解决,不会造成对访问者的影响。

总而言之,使用视图的大部分情况是为了保障数据安全性,提高查询效率。

创建方法:create view view_name [(column_list)] as select_statement

查看视图定义:show create view_name

删除视图:drop view view_name

注意:
1)视图中的数据事实上存储于“基表”中,因此,对视图修改操作也会针对“基表”实现操作,其修改操作受“基表”限制
2)视图的所有数据都相当于表的映射,对视图修改就是对表修改
3)视图基本是供查询的,不对视图修改,对表修改会影响视图中的数据变化

视图示例

创建:
	create view stu_view as select id,name,age,sex from student;
	视图创建完成后会多出一张表
查看:
	show create view stu_view\G

删除视图:
	drop view stu_view1;
	删除视图是指删除数据库中已存在的视图,删除视图时,只能删除视图的定义,不会删除数据,也就是说不动基表

存储过程

是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,它存储在数据库中,一次编译后永久有效,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。

存储过程优势:
1)存储过程把经常使用的SQL语句或业务逻辑封装起来。预编译保存在数据库中,当需要时从数据库中直接调用,省去了编译的过程
2)提高了运行速度
3)同时降低网络数据传输量

存储过程与自定义函数的区别
存储过程实现的过程要复杂一些,而函数的针对性较强
存储过程可以有多个返回值,而自定义函数只有一个返回值
存储过程一般独立的来执行,而函数往往是作为其他SQL语句的一部分来使用
存储过程保存在mysql.proc表中

创建存储过程:

	create procedure name([parameter]) routime_body 
	parameter:[in|out|inout] parameter type
		in表示输入参数,out表示输出参数,inout表示既可以输入也可以输出
		parameter表示参数名称,type表示参数的类型

查看存储过程列表:show procedure status;

查看存储过程定义:show create procedure name;

调用存储过程:call name ([parameter,…])

	**说明**:当无参时,可以省略(),当有参时,不可省略()

存储过程修改
alter语句修改存储过程只能修改存储过程的注释等无关紧要的东西,不能修改存储过程体,所以要修改存储过程,方法就是删除重建

删除存储过程:drop procedure name;

示例:
	创建无参存储过程
		delimiter //
		create procedure showtime()
		begin
		select now();
		end//
		delimiter ;
		调用:call showtime;

	创建包含参数的存储过程,只有一个in参数
		delimiter //
		create procedure selectid(in uid smallint unsigned)
		begin
		select * from student where id=uid;
		end//
		delimiter ;
		调用:call selectid(2);

	循环存储过程:repeat,until
		delimiter //
		create procedure dorepeat(n int)
		begin
		set @i=0;
		set @sum=0;
		repeat set @sum=@sum+@i;set @i=@i+1;
		until @i > n end repeat;
		end//
		delimiter ;
		调用:call dorepeat(100);
		显示变量内容:select @sum

	创建包含参数存储过程,in和out参数
		delimiter //
		create procedure deleteid(in uid smallint unsigned,out num smallint unsigned)
		begin
		delete from student where id=uid;
		select row_count() into num;
		end//
		delimiter ;
		调用:call deleteid(18,@line);
		显示变量内容:select @line;
		说明:创建存储过程deleteid,包含一个in参数和一个out参数,调用时,传入删除的id和保存被修改的行数值的用户变量@line,select @line;输出被影响行数

流程控制
	存储过程和函数中可以使用流程控制来控制语句的执行
		if	:用来进行条件判断,根据是否满足条件,执行不同语句
		case:用来进行条件判断,可实现比if语句更复杂的条件判断
		loop:重复执行特定的语句,实现一个简单的循环
		leave:用于跳出循环控制
		inerate:跳出本次循环,然后直接进入下一个循环
		repeat:有条件控制的循环语句。当满足特定条件时,就会跳出循环语句
		while:有条件控制的循环语句
	
	 示例:
		 delimiter //
		 
		 create procedure pro_testlog()
		 begin
		 declare i int;
		 set i=1;
		 while i <=100000
		 do insert into testlog(name,age) values(concat('cheng',i),i);
		 set i=i+1;
		 end while;
		 end//
		 
		 delimiter ;

函数

mysql 5.0开始支持函数,函数是存在数据库中的一段sql集合,调用函数可以减少很多工作量,减少数据在数据库和应用服务器上的传输,对于提高数据处理的效率。

函数:系统函数和自定义函数

系统函数:

	函数官网介绍:https://dev.mysql.com/doc/refman/5.6/en/func-op-summary-ref.html
	函数文章推介:https://www.cnblogs.com/kissdodog/p/4168721.html

自定义函数
保存在mysql.proc表中
创建

create function function_name(parameter_name1 type,parameter_name2 type,...) returns {字符串|整数|带小数点} 定义体

定义时的参数称为形式参数,简称形参
调用时使用参数名字称为实际参数,简称实参

说明:参数可以有多个,也可以没有参数

必须有且只有一个返回值

查看函数

	show function status;	显示的信息有点乱
	show function status\G	纵向显示方便观看

查看函数定义:show create function func_name
删除:drop function func_name
调用自定义函数语法:select function_name(parameter_value,…)

出现函数定义失败时:
报错信息:ERROR 1418 (HY000): This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you might want to use the less safe log_bin_trust_function_creators variable)

解决方法:set global log_bin_trust_function_creators=1;

log_bin_trust_function_creators:
	它控制着是否可以信任存储函数创建者,而不创建不导致将不安全事件写入二进制日志的存储函数。
	如果设置为0(默认值),用户不允许创建或更改存储功能,除非他们有SUPER 除了特权CREATE ROUTINE或ALTER ROUTINE特权。
	如果变量设置为1,MySQL不会在创建存储函数时强制执行这些限制。

创建函数示例:
无参函数:

MariaDB [hello]> create function hello() returns varchar(20) return 'Hello World!';  
Query OK, 0 rows affected (0.00 sec)

MariaDB [hello]> select hello();
	+--------------+
	| hello()      |
	+--------------+
	| Hello World! |
	+--------------+
	1 row in set (0.00 sec)

有参函数:

delimiter //	:此命令时将平时执行命令时的结束执行符修改为//
create function delete_id(uid tinyint unsigned) returns varchar(20) begin delete from student where id=uid; 
return (select count(id) from student); 
end//
delimiter ;		:恢复默认;为结束执行符

调用函数执行:select delete_id(17);

自定义函数中定义局部变量语法
declare var1 [,var2,…] var_type [default 默认值]

说明:局部变量的作用范围在begin .. end程序中,而且定义局部变量语句必须在begin .. end的第一行定义
	示例
		delimiter //
		create function number(x tinyint unsigned,y tinyint unsigned) 
		returns tinyint 
		begin declare a,b tinyint unsigned; 
		set a=x,b=y; return a+b;
		end//
		delimiter ;
调用:select number(10,20);
		函数执行完后值就没有了,只是在当前函数体有效,函数体内定义变量叫局部变量

会话变量:仅在当前会话有效,退出再进则失效
	语法:set @a=10;
	调用:select @a;

触发器

详细描述请点击

触发器是与表有关的数据库对象,在满足定义条件时触发,并执行触发器中定义的语句集合。触发器的这种特性可以协助应用在数据库端确保数据的完整性。

触发器虽然能实现一定的功能,但是生产中一般不太用。

触发器的执行不是有程序调用,也不是由手工启动,而是由事件来触发、激活从而实现执行

创建触发器:

	create
	[definer = {user|current_user}]
	trigger trigger_name
	trigger_time trigger_event
	on tb_name for each row
	trigger_body

说明:trigger_name:触发器的名称
	  trigger_time:{before|after},表示在事件之前或之后触发
	  trigger_event:{insert|update|delete},触发的具体事件
	  tb_name:该触发器作用在哪个表
	  each row:被触发时执行触发的次数

触发器示例:
创建两张表:
1、create table student_info(id int(11) not null auto_increment,name varchar(20) default null,primary key (id));
2、create table student_count(count int(11) default 0);

创建触发器:
再向学生表insert数据是,学生数量增加,触发器执行指定的命令。delete学生时,学生数量减少,触发器执行指定命令

insert触发器:
	create trigger trigger_student_count_insert	:触发器名字
	after insert 	:insert之后被触发
	on student_info 	:在student_info这张表上添加触发器
	for each row 	:
	update student_count	:触发器被触发后要对哪个表执行操作
	set count=count+1;	:要执行的命令

delete触发器:
	create trigger trigger_student_count_delete
	after delete on student_info for each row update 
	student_count set count=count-1;
			和上面insert解释一样
测试:
	插入数据测试student_count表是否自动递增
			insert student_info values(1,'a');
	删除数据是否会自动递减
		delete from student_info where id=2;
		
	查看:select * from student_count
	
查看触发器:show triggers
	查询系统表information_schema.triggers的方式指定查询条件,查看指定的触发器信息
		mysql> use information_schema;
		mysql>select * from triggers where trigger_name='trigger_student_count_insert';
	
删除触发器:drop trigger trigger_name;
			
说明:删除表时触发器自动删除,因为触发器被依附在表上,表没有了触发器自然也没有了
发布了63 篇原创文章 · 获赞 0 · 访问量 2225

猜你喜欢

转载自blog.csdn.net/qq_43058911/article/details/102999783
今日推荐