当前位置:   article > 正文

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.创建视图

操作:

  1. create or replace view view_emp
  2. as
  3. select ename,job from emp;
  4. -- 查看表和视图
  5. show full tables;

解释:创建或代替视图view_emp,view_emp是视图的名字,视图的内容是表emp里的ename和job两列内容。

emp表如下,表的创建和数据的准备就省略了,直接展示结果

3.修改视图

MySQL可以通过create or replace view语句或alter view 语句来修改视图

格式:alter view 视图名  as select 语句

操作:查询语句根据需要自己改就行了

  1. alter view view1_emp
  2. as
  3. select a.deptno,a.dname,a.loc,b.ename,b.sal from dept a,emp b
  4. 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.重命名视图
  1. -- rename table 视图名 to 新视图名
  2. rename table view1_emp to my_view1;
6.删除视图
  1. -- drop view 视图名
  2. drop view if exists view_student;

二:MySQL的存储过程

1.入门案例

格式:

delimiter 自定义结束符号

create  procedure  储存名 ([in,out,inout]参数名  数据类型)

begin  sql语句

end  自定义的结束符号

delimiter ;

创建存储过程:

  1. delimiter $$
  2. create procedure proc01()
  3. begin
  4. select empno,ename from emp;
  5. end $$
  6. delimiter ;

调用存储过程:

call proc01();
2.变量定义
2.1局部变量

用户自定义,在begin/end中有效

语法:声明变量  declare  var_name type [default 'aaa'];

举例:declare nickname varchar (32);

操作:

  1. delimiter $$
  2. create procedure proc02()
  3. begin
  4. declare var_name01 varchar(20) default 'aaa' -- 声明/定义变量
  5. set var_name01 = 'zhangsan' -- 给变量赋值
  6. select var_name01; -- 输出变量的值
  7. end $$
  8. delimiter ;
  9. -- 调用存储过程
  10. call proc02;

注意:给变量赋值除了set,还有另一种方式selct  into,也可以为变量赋值

select ename into my_name from emp where empno = 1001;

解释:就是将ename这一列员工号为1001的员工名赋给了my_name

2.2用户变量

格式:用户自定义,当前会话(连接)有效。类比java的成员变量。

语法:@var_name

不需要提前声明,直接使用即可。

操作:

  1. delimiter $$
  2. create procedure proc03()
  3. begin
  4. set @var_name01 = 'beijing';
  5. select @var_name01;
  6. end $$
  7. delimiter ;
  8. call proc03;
  9. select @var_name01; -- 在begin/and外也可以使用用户变量
2.3系统变量

全局变量---由系统提供,在整个数据库有效

语法:@@global.var_name

操作:

  1. -- 查看全局变量
  2. show global variables;
  3. -- 查看某全局变量
  4. select @@global.auto_increment_increment;
  5. -- 修改全局变量的值
  6. set global sort_buffer_size=40000;
  7. set @@global.sort_buffer_size=40000;

会话变量---由系统提供,在当前会话(连接)有效

语法:@@session.var_name

操作:

  1. -- 查看会话变量
  2. show session variables;
  3. -- 查看某会话变量
  4. select @@session.auto_increment_increment;
  5. -- 修改会话变量的值
  6. set session sort_buffer_size=50000;
  7. set @@session.sort_buffer_size=50000;
3.参数传递
3.1参数传递--in

        in表示传入的参数,可以传入数值或变量,即使传入变量,并不会更改变量的值,可以内部更改,仅仅作用在函数范围内。

举例说明:

  1. -- 封装有参数的存储过程,传入员工编号,查找员工信息
  2. delimiter $$
  3. create procedure dec_param01(in param_empno varchar(20))
  4. begin
  5. select * from emp where empno = param_empno;
  6. end $$
  7. delimiter ;
  8. call dec_param01('1001');
3.2参数传递--out

        out表示从存储过程内部传值给调用者

举例说明:

  1. -- 封装有参数的存储过程,传入员工编号,返回员工名字
  2. delimiter $$
  3. create procedure proc04(in empno int,out out_name varchar(50))
  4. begin
  5. select ename into out_name from emp where emp.empnno = empno;
  6. end $$
  7. delimiter ;
  8. call proc04(1001,@o_ename);
  9. select @o_name;

对代码做简要解释:首先传入参数1001,则emp.empno=empno=1001,根据它ename会得到一个值(名字),然后这个值会赋给out_name,最后out_name的值会传出去,传给变量@o_name

3.3参数传递--inout

        inout表示从外部传入的参数经过修改后可以返回的变量,既可以使用传入变量的值也可以修改变量的值(即使函数执行完)

举例说明:

  1. -- 传入一个数字,传出这个数字10倍的值
  2. delimiter $$
  3. create procedure proc05(inout num int)
  4. begin
  5. set num=num*10;
  6. end $$
  7. delimiter ;
  8. set @inout_num = 2;
  9. call proc05(@inout_num);
  10. select @inout_num; -- 20
4.流程控制
4.1分支语句--if

        if语句包含多个条件判断,根据结果为true/false执行语句,与编程语言中的if,elseif,else语法类似,其语法格式如下:

  1. if search_condition_1 then statement_list_1
  2. [elseif search_condition_2 then statement_list_2]...
  3. [else statement_list_n]
  4. end if

举例说明:

  1. -- 输入学生的成绩,来判断成绩的级别
  2. delimiter $$
  3. create procedure proc_if(in score int)
  4. begin
  5. if score < 60
  6. then
  7. select '不及格'
  8. elseif score >= 60 and score < 80
  9. then
  10. select '及格'
  11. elseif score >= 80 and score < 90
  12. then
  13. select '良好'
  14. elseif score >= 90 and score <= 100
  15. then
  16. select '优秀'
  17. else
  18. select '成绩错误'
  19. end if;
  20. end $$
  21. delimiter ;
  22. call pro_if(88); -- 良好
4.2分支语句--case

        case是另一个条件判断的语句,类似于编程语言中的switch语法

  1. -- 语法一
  2. case case_value
  3. when when_value then statement_list
  4. [when when_value then statement_list]...
  5. [else statement_list]
  6. end case
  7. -- 语法二
  8. case
  9. when search_condition then statement_list
  10. [when search_condition then statement_list]...
  11. [else statement_list]
  12. end case

用法和上面的if语句基本相同,这里就不再举例说明了。

4.3循环语句--介绍

概述:循环是一段在程序中只出现一次,但可能会连续运行多次的代码,循环中的代码会运行特定次数,或许是运行到特定条件成立时结束循环。

分类:*while    *repeat   *loop

循环控制:leave类似于break,跳出,结束当前的循环

                  iterate类似于continue,继续,结束本次循环,继续下一次循环

4.4循环语句--while循环

格式:标签可写可不写,根据自己需要

  1. [标签:] while 循环条件 do
  2. 循环体;
  3. end while [标签];

具体代码展示:

  1. -- 创建测试表
  2. create table user(
  3. uid int primary_key,
  4. username varchar(50),
  5. password varchar(50)
  6. );
  7. -- 向表中添加指定条数的数据
  8. delimiter $$
  9. create procedure proc_while_leave(in insertCount int)
  10. begin
  11. declare i int default 1;
  12. label:while i < = insertCount do
  13. insert into user(uid,username,password) values(i,concat('user-',i),'123456');
  14. if i = 5 then
  15. leave label; -- 跳出循环
  16. end if;
  17. set i = i + 1;
  18. end while label;
  19. end $$
  20. delimiter ;
  21. call proc_while_leave(10);

插入数据后的表格如下:

4.5循环语句--repeat循环

格式:

  1. [标签:] repeat
  2. 循环体;
  3. until 条件表达式
  4. end repeat [标签];
4.6循环语句--loop循环

格式:

  1. [标签:] loop
  2. 循环体;
  3. if 条件表达式 then
  4. leave [标签];
  5. end if;
  6. end loop;

说明一下:repeat循环和loop循环和while循环他们都差不多,就不在用例子说明了

4.7游标cursor的使用

        游标(cursor)是用来存储查询结果集的数据类型,在存储过程和函数中可以使用对结果集进行循环处理。光标的使用包括光标的声明,open,fetch和close.

举例说明:

  1. -- 需求:输入一个部门名,查询该部门员工的编号,名字和薪资,将查询结果集添加游标
  2. delimiter $$
  3. create procedure proc_cursor(in in_dname varchar(50))
  4. begin
  5. -- 定义局部变量
  6. declare var_empno int;
  7. declare var_ename varchar(50);
  8. declare var_sal decimal(7,2);
  9. -- 声明游标
  10. declare my_cursor cursor for
  11. select empno,ename,sal
  12. from dept a,emp b
  13. where a.deptno = b.deotno and a.dname = in_name;
  14. -- 打开游标
  15. open my_cursor;
  16. -- 通过游标获取值
  17. label:loop
  18. fetch my_cursor into var_empno,var_ename,var_sal;
  19. select var_empno,var_ename,var_sal;
  20. end loop label;
  21. -- 关闭游标
  22. close my_cursor;
  23. end $$
  24. delimiter ;
  25. call proc_cursor('销售部');

注意上面的loop是死循环,会有一个异常,我们会在后面进行解决

4.8异常处理--handler句柄

        MySQL存储过程也提供了对异常处理的功能:通过定义句柄handler来完成异常声明的实现。

直接上代码:

  1. -- 需求:输入一个部门名,查询该部门员工的编号,名字和薪资,将查询结果集添加游标
  2. delimiter $$
  3. create procedure proc_cursor(in in_dname varchar(50))
  4. begin
  5. -- 定义局部变量
  6. declare var_empno int;
  7. declare var_ename varchar(50);
  8. declare var_sal decimal(7,2);
  9. -- 定义标记值
  10. declare flag int default 1;
  11. -- 声明游标
  12. declare my_cursor cursor for
  13. select empno,ename,sal
  14. from dept a,emp b
  15. where a.deptno = b.deotno and a.dname = in_name;
  16. -- 定义句柄:定义异常的处理方式
  17. /*
  18. 1.异常处理后程序该怎么执行
  19. continue:继续执行剩余代码
  20. exit:直接终止程序
  21. undo:不支持
  22. 2.条件触发
  23. 条件码:1329
  24. 条件名:SQLWARNING
  25. NOT FOUND
  26. SQLEXCEPTION
  27. 3.异常触发之后执行什么代码
  28. 设置flag的值---》0
  29. */
  30. declare continue handler for 1329 set flag = 0;
  31. -- 打开游标
  32. open my_cursor;
  33. -- 通过游标获取值
  34. label:loop
  35. fetch my_cursor into var_empno,var_ename,var_sal;
  36. -- 判断flag,如果flag为1则执行,否则不执行
  37. if flag = 1 then
  38. select var_empno,var_ename,var_sal;
  39. else leave label;
  40. end if;
  41. end loop label;
  42. -- 关闭游标
  43. close my_cursor;
  44. end $$
  45. delimiter ;
  46. call proc_cursor('销售部');

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小桥流水78/article/detail/740054
推荐阅读
相关标签
  

闽ICP备14008679号