一、视图概述
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;