MySQL的视图(介绍、创建、修改、更新、重命名和删除)MySQL的存储过程(入门、变量定义、参数传递和流程控制) |
您所在的位置:网站首页 › 电脑中的视图怎么删除 › MySQL的视图(介绍、创建、修改、更新、重命名和删除)MySQL的存储过程(入门、变量定义、参数传递和流程控制) |
目录 一:MySQL的视图 1.视图的介绍 2.创建视图 3.修改视图 4.更新视图 5.重命名视图 6.删除视图 二:MySQL的存储过程 1.入门案例 2.变量定义 2.1局部变量 2.2用户变量 2.3系统变量 3.参数传递 3.1参数传递--in 3.2参数传递--out 3.3参数传递--inout 4.流程控制 4.1分支语句--if 4.2分支语句--case 4.3循环语句--介绍 4.4循环语句--while循环 4.5循环语句--repeat循环 4.6循环语句--loop循环 4.7游标cursor的使用 4.8异常处理--handler句柄 一:MySQL的视图 1.视图的介绍概念:视图(view)是一个虚拟表,非真实存在其本质是根据SQL语句获取动态的数据集 作用:简化代码 数据安全 特点:视图本身不存在具体的数据,只存储数据的逻辑,这些数据存放在原来的表中 一旦表中的数据发生改变,显示在视图中的数据也会发生改变 2.创建视图操作: create or replace view view_emp as select ename,job from emp; -- 查看表和视图 show full tables;解释:创建或代替视图view_emp,view_emp是视图的名字,视图的内容是表emp里的ename和job两列内容。 emp表如下,表的创建和数据的准备就省略了,直接展示结果 3.修改视图MySQL可以通过create or replace view语句或alter view 语句来修改视图 格式:alter view 视图名 as select 语句 操作:查询语句根据需要自己改就行了 alter view view1_emp as select a.deptno,a.dname,a.loc,b.ename,b.sal from dept a,emp b where a.deptno = b.deptno; 4.更新视图某些视图是可以更新的。也就是说,可以在update,delete或insert等语句中使用他们,以更新基表的内容,在视图中的行和基表中的行之间必须有一对一的关系。如果视图中包含下述结构中的任意一种,那么他就是不可更新的: * 聚合函数 sum(),min(),max(),count()等 * distinct 去重 * group by 分组 * having * union 或 union all * 位于选择列表中的子查询 * join * from 子句中的不可更新视图 * where 中的子查询,引用from 子查询中的表 * 仅引用文字值(在该情况下,没有要更新的基本表) 注意:视图中虽然可以更新数据,但是有很多的限制。一般情况下,最好将视图作为查询数据的虚拟表,而不要通过视图更新数据。因为,在更新数据时,如果没有全面考虑在视图中更新视图的限制,就可能会造成数据更新失败! 5.重命名视图 -- rename table 视图名 to 新视图名 rename table view1_emp to my_view1; 6.删除视图 -- drop view 视图名 drop view if exists view_student; 二:MySQL的存储过程 1.入门案例格式: delimiter 自定义结束符号 create procedure 储存名 ([in,out,inout]参数名 数据类型) begin sql语句 end 自定义的结束符号 delimiter ; 创建存储过程: delimiter $$ create procedure proc01() begin select empno,ename from emp; end $$ delimiter ;调用存储过程: call proc01(); 2.变量定义 2.1局部变量用户自定义,在begin/end中有效 语法:声明变量 declare var_name type [default 'aaa']; 举例:declare nickname varchar (32); 操作: delimiter $$ create procedure proc02() begin declare var_name01 varchar(20) default 'aaa' -- 声明/定义变量 set var_name01 = 'zhangsan' -- 给变量赋值 select var_name01; -- 输出变量的值 end $$ delimiter ; -- 调用存储过程 call proc02;注意:给变量赋值除了set,还有另一种方式selct into,也可以为变量赋值 select ename into my_name from emp where empno = 1001;解释:就是将ename这一列员工号为1001的员工名赋给了my_name 2.2用户变量格式:用户自定义,当前会话(连接)有效。类比java的成员变量。 语法:@var_name 不需要提前声明,直接使用即可。 操作: delimiter $$ create procedure proc03() begin set @var_name01 = 'beijing'; select @var_name01; end $$ delimiter ; call proc03; select @var_name01; -- 在begin/and外也可以使用用户变量 2.3系统变量全局变量---由系统提供,在整个数据库有效 语法:@@global.var_name 操作: -- 查看全局变量 show global variables; -- 查看某全局变量 select @@global.auto_increment_increment; -- 修改全局变量的值 set global sort_buffer_size=40000; set @@global.sort_buffer_size=40000;会话变量---由系统提供,在当前会话(连接)有效 语法:@@session.var_name 操作: -- 查看会话变量 show session variables; -- 查看某会话变量 select @@session.auto_increment_increment; -- 修改会话变量的值 set session sort_buffer_size=50000; set @@session.sort_buffer_size=50000; 3.参数传递 3.1参数传递--inin表示传入的参数,可以传入数值或变量,即使传入变量,并不会更改变量的值,可以内部更改,仅仅作用在函数范围内。 举例说明: -- 封装有参数的存储过程,传入员工编号,查找员工信息 delimiter $$ create procedure dec_param01(in param_empno varchar(20)) begin select * from emp where empno = param_empno; end $$ delimiter ; call dec_param01('1001'); 3.2参数传递--outout表示从存储过程内部传值给调用者 举例说明: -- 封装有参数的存储过程,传入员工编号,返回员工名字 delimiter $$ create procedure proc04(in empno int,out out_name varchar(50)) begin select ename into out_name from emp where emp.empnno = empno; end $$ delimiter ; call proc04(1001,@o_ename); select @o_name;对代码做简要解释:首先传入参数1001,则emp.empno=empno=1001,根据它ename会得到一个值(名字),然后这个值会赋给out_name,最后out_name的值会传出去,传给变量@o_name 3.3参数传递--inoutinout表示从外部传入的参数经过修改后可以返回的变量,既可以使用传入变量的值也可以修改变量的值(即使函数执行完) 举例说明: -- 传入一个数字,传出这个数字10倍的值 delimiter $$ create procedure proc05(inout num int) begin set num=num*10; end $$ delimiter ; set @inout_num = 2; call proc05(@inout_num); select @inout_num; -- 20 4.流程控制 4.1分支语句--ifif语句包含多个条件判断,根据结果为true/false执行语句,与编程语言中的if,elseif,else语法类似,其语法格式如下: if search_condition_1 then statement_list_1 [elseif search_condition_2 then statement_list_2]... [else statement_list_n] end if举例说明: -- 输入学生的成绩,来判断成绩的级别 delimiter $$ create procedure proc_if(in score int) begin if score < 60 then select '不及格'; elseif score >= 60 and score < 80 then select '及格'; elseif score >= 80 and score < 90 then select '良好'; elseif score >= 90 and score |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |