(DB2.4)MySQL视图 MySQL存储过程

一、视图概述

1、什么是视图(View)

-虚拟表
-内容与真实表相似
-视图并不在数据库中以存储的数据形式存在
-行和列的数据来自定义视图时查询所引用的基表,并且在具体引用视图时动态生成
-更新视图的数据,就是更新基表的数据
-更新视图的数据,就是更新基表的数据
-更新基表数据,视图的数据也会跟着改变

2、为什么要使用视图(视图的优点)

  • 简单
    -用户不需关心视图中的数据如何查询获得
    -视图中的数据已经是过滤好的符合条件的结果集
  • 安全
    -用户只能看到视图中的数据
  • 数据独立
    -一旦视图结构确定,可以屏蔽表结构对用户的影响

3、视图使用规则(创建视图时,要满足规则要求)

  • 不能在视图上创建索引
    • 在视图的FROM 字句中不能使用子查询
  • 以下情形中的视图是不可更新的
    -包含以下关键字的SQL语句:聚合函数(SUM、MIN、MAX、COUNT等)、DISTINCT、GROUP BY、HAVING、UNION或UNOIN ALL
    -常量视图、JOIN、FROM一个不能更新的视图
    -WHERE子句的子查询引用了FROM子句中的表
    -使用了临时表

4、视图管理

4.1、创建视图
  • 语法格式

-create view 视图名称 as SQL查询;
-create view 视图名称(字段名列表) as SQL查询;

[root@55 ~]# mysql -uroot -pTaren1.com
mysql> create view db9.v1 as select name,uid from db9.user;
mysql> grant all on db9.v1 to yay10@"%" identified by "123qqq...A";

mysql> create view db9.v2(a,b,c) as select name,uid from db9.user;
mysql> grant select,insert,update,delete on db9.v2 to yay10@"%" identified by "123qqq...A";
4.2、验证视图特点
[root@50 ~]# mysql -h192.168.4.55 -uyay10 -p123qqq...A
mysql> show grants;
mysql> 对数据做操作验证特点:
更新视图的数据,就是更新基表的数据
更新基表的数据,视图的数据也会跟着改变
4.3、查看视图

mysql> show table status;
mysql> show table status where comment=“view”\G;
mysql> show create view v2\G;

4.4、删除视图

mysql> drop view db9.v1;

4.5、限制对视图的操作

5、视图进阶

5.1设置字段别名
  • 视图中的字段名不可以重复 所以要定义别名

-create view 视图名 as select 表别名.源字段名 as 字段别名 from 源表名 表别名 on条件;

mysql> create table t2 select name,uid,shell from user limit 3;
mysql> create table t3 select name,uid,password,homedir from user limit 5;
mysql> select * from t2 left join t3 on t2.uid = t3.uid;
mysql> create view v4 as select * from t2 left join t3 on t2.uid=t3.uid;
mysql> create view v4 as select a.name x1,a.uid x2,a.shell x3,b.name x4,b.uid x5,b.password x6,b.homedir x7 from t2 a left join t3 b on a.uid=b.uid;
5.2、OR REPLACE 强制覆盖创建新视图

mysql> create view v4 as select uid,gid,name from user;
mysql> create or replace view v4 as select uid,gid,name from user;
mysql> select * from v4;

5.3、算法(ALGORITHM)访问视图时,mysql服务的处理方式

algorithm=算法
merage,替换方式
temptable,具体化方式
undefined,默认方式
mysql> create algorithm=temptable view v5 as select uid,gid,name from user;

5.4、with chech option 限制视图操作

1 LOCAL 对视图操作时,必须满足视图自身的限制
2 CASCADED 对视图操作时,即要满足视图自身的限制有要满足基表
的限制

mysql> create table t5
   -> select name,uid,gid,shell from user where gid >=20 and gid <=1000;
   mysql> select * from t5;
   mysql> create  view v7 as  select * from user where gid<=500 with local check option;
   mysql> select * from v7;
   mysql> create  view v7 as select * from user where gid<=500 with local check option;
   mysql> select * from v7;
   mysql> update v7 set gid=499 where name="games";
   mysql> select * from v7 where name="games";

mysql> create view v8 as select * from v7 where gid>=100 with CASCADED check option;

mysql> create view v9 as select * from user where gid<=100 with cascaded check option;
mysql> updata v9 set gid=101 where name"root";
mysql> create view v10 as select * from user where gid <=500 with cascaded check option;
mysql> update v10 set gid=99 where name="games";
mysql> create view v11 as select * from v10 where gid>=30 with local check option;
mysql> update v11 set gid=20 where name="nobody";        报错
mysql> update v11 set gid=501 where name="nobody";     报错
mysql> update v11 set gid=31 where name="nobody";     正确

###二、mysql存储过程
1、 存储过程介绍(什么是存储过程)
是mysql服务里的脚本

  • 存储过程,相当于是mysql语句组成的脚本
    -指的是数据库中保存的一些列SQL命令的集合
    -可以在存储过程中使用变量、条件判断、流程控制等
    2、 存储过程的优点(为什么要使用存储过程)

  • 提高性能

  • 减轻网络负担

  • 可以防止对表的直接访问

  • 避免重复编写SQL操作
    3、 使用存储过程
    3.1、基本使用
    3.1.1 创建存储过程
    delimiter //
    create procedure 库名.名称()
    begin
    功能代码
    select * from db9.user ;
    end
    //
    delimiter ;
    3.1.2 执行存储过程
    call 库名.名称();
    3.1.3 查看存储过程

    (1)查看服务器上已有存储过程
    mysql> desc mysql.proc;
    mysql> select db,name from mysql.proc
    where type=“PROCEDURE”;
    (2)查看存储过程代码
    mysql> select db,name,body from
    mysql.proc where
    type=“PROCEDURE”
    and name=“存储过程名”;
    3.1.4 删除存储过程
    mysql> drop procedure 库名.名称;

    进阶操作

    1、变量(变量类型)
    会话变量
    mysql> show session variables;
    mysql> set session sort_buffer_size =
    全局变量
    mysql> show global variables ;
    mysql> show global variables like “%hostname%”;
    mysql> select @@hostname;
    mysql> show global variables like “%version%”;
    mysql> select @@version;
    用户变量
    mysql> set @x=99;
    mysql> set @name=“bob”;
    mysql> select @name,@x;
    局部变量(在存储过程中进行定义)
    declare 变量名 类型;
    set 变量名 = 值 ;
    select 变量名 ;
    delimiter //
    create procedure db9.p2()
    begin
    declare x int ;
    declare y int ;
    set x = 99 ;
    set y = 11 ;
    select x,y ;
    end
    //
    delimiter ;
    call db9.p2() ;
    使用查询结果给变量赋值
    mysql> select count(name) into 变量名 from db9.user;
    mysql> select count(name) into @x from db9.user;
    mysql> select @x;

delimiter //
create procedure db9.p4()
begin
declare x int ;
declare y int ;
select count(name) into x from db9.user where gid<=1000;
select count(name) into y from db9.user where gid>1000;
select x , y ;
end
//
delimiter ;
call db9.p3() ;
2、存储过程参数(参数类型)
3、四则计算 + - * / DIV %
delimiter //
create procedure db9.p4()
begin
declare x int ;
declare y int;
declare z int;
select count(name) into x from db9.user where gid<=1000;
select count(name) into y from db9.user where gid>1000;
set z = x + y ;
select x , y , z ;
end
//
delimiter ;
4、条件判断(是给流程控制使用的)
数值比较符号 字符比较符号 空 非空
范围内比较 逻辑比较 正则匹配 模糊匹配
5、流程控制(控制代码的执行顺序)
1 if 选择结构(根据条件判断执行操作)
2 循环结构(需要重复执行的代码放在循环结构里)
delimiter //
create procedure db9.p1()
begin
select count() from db9.user where shell != “/bin/bash”;
select count(
) from db9.user where shell = “/bin/bash”;
end
//
delimiter ;
call db9.p1() ;
select db,name from mysql.proc where type=“procedure” and name=“p1”;
select body from mysql.proc where type=“procedure” and name=“p1”\G;

猜你喜欢

转载自blog.csdn.net/weixin_45048541/article/details/90257308