deaver如何看mysql视图_mysql

文章中所有操作均是在 MySQL 5.7 版本下进行的

视图是一种虚拟存在的表,可以粗浅理解为一个表或者多个表的数据查询。视图相对于表并不在数据库中实际存在,视图仅是保存了 SQL 逻辑,并且是在使用视图时候才会去执行所谓的 SQL 逻辑。

视图是虚拟表,本身不存储数据,而是按照指定的方式进行查询。

视图相对表的优势:

  • 简单,使用视图的用户完全不需要关系后面对应的表结构、关联条件和筛选条件,对用户来说已经是过滤好的符合条件的结果集。
  • 安全,使用视图的用户只能访问他们被允许的结果集,对表的权限管理并不能限制到某个行某个列,但是通过视图就可以简单的实现。
  • 数据独立,一旦视图的结构确定了,可以屏蔽表结构变化对用户的影响,源表增加列对视图没有影响,源表修改列名,则可以通过修改视图来解决,不会造成对访问者的影响。

我们可以通过以下命令来查看当前数据库下有多少视图:

/*
由于视图其实就是虚拟的表,所以也可以认为是一张表,所以只能通过show tabels查询
但是由于视图的定义有特定的命名方式,我们可以通过以下命令查询:
show tabels like '%模拟查询的名字%';

又因为视图和普通的表确实有所不同,还可以通过以下命令查询:
show table status where comment = 'view';
*/
-- 引入示例表
drop table if exists tbl_emp;
create table tbl_emp(
    empno	 int primary key comment '员工号',
    ename	 varchar(50) comment '员工姓名',
    job		 varchar(50) comment '工作职位',
    sal		 decimal(7,2) comment '工资',
    deptno	 int comment '部门编号'
) comment '员工表';
drop table if exists tbl_dept;
create table tbl_dept(
    deptno	 int primary key comment '部门号',
    dname	 varchar(50) comment '部门名称'
) comment '员工表';
-- 输入插入省略

1 视图创建和使用

/*
创建视图的语法:
create [or replace] view 视图名 as select语句;
还可以(列名要和as后面的select语句查询的列保持一致):
create [or replace] view 视图名(列名1, 列名2, ...) as select语句;
如果加入“or replace”表示如果视图名存在将覆盖原视图重新创建
*/
-- 创建一个视图,查询员工号,姓名和工资
create or replace view v_test1
as
select e.empno, e.ename, e.sal from tbl_emp e;
-- 还可以定义列名(列名要和后面的select语句查询的列保持一致)
create or replace view v_test2(c1,c2,c3)
as
select e.empno, e.ename, e.sal from tbl_emp e;
-- 查看视图“desc 视图名”或者“show create view 视图名”
desc v_test1;
show create view v_test2;
-- 调用视图 select * from 视图名
select * from v_test1;
select * from v_test2;
-- 视图是在调用它的时候才去执行视图定义的sql语句
-- 可以创建多表之间的sql语句视图
-- 创建查询员工姓名和所属部门名的视图
create or replace view v_test3
as
select e.ename, d.dname from tbl_emp e, tbl_dept d where e.deptno = d.deptno;
-- 视图还可以针对视图创建
create or replace view v_test4
as
select * from v_test1 where empno > 1000;

-- 可以利用视图对数据进行insert,update,delete
-- 针对v_test1视图进行数据insert,update,delete
insert into v_test1 values (1001, '测试', 1000);
update v_test1 set ename = '张三' where empno = 1001;
delete from v_test1 where empno = 1001;
/*
针对视图对表进行insert,update,delete
如果表里视图之外的列不允许null,不能insert
包含以下关键字的sql语句不能进行insert,update,delete:
分组函数、distinct、group  by、having、union或者union all
常量视图
select中包含子查询
join
from一个不能更新的视图
where子句的子查询引用了from子句中的表
*/

2 视图修改和删除

/*
修改视图
可以利用“alter view 要修改的视图名 as 新的select语句;”。
一般情况下“create or replace 视图名”直接覆盖修改原视图。

删除视图
drop view 视图名;
drop view 视图名1, 视图名2, 视图名...;
*/

3 视图创建中的LOCAL、CASCADED OPTION

创建视图的时候可以在创建视图之后加入 with local check option 或者 with cascaded check option,在上面的讲解中并没有涉及,它们的作用主要是对底层视图检验 where 语句。版本不同,效果也不同,就不做特别介绍了。

结语

视图在一般的开发中用的比较多,有兴趣的朋友可以继续深入研究。