MySQL视图

视图是存储在数据库中的虚拟表,视图中不保存数据,内部封装了一条SELECT语句,数据来源于查询的一个或多个基本表。视图的结构和基本表相同,也是由行和列构成的二维表,也可以进行增删改查的操作。视图中的数据依赖于基本表中的数据,表中数据发生改变,显示在视图中的数据也会改变,同样,在视图中对数据执行增删改的操作,基本表中的数据也会同步更新。

视图的作用

为了减少代码的重写,或增加代码的重复利用。所以如果语句只需要用一次或一两句,就没有必要单独写视图。

视图的优缺点
优点
  • 简单:简化SQL语句,快速提取数据。视图可以将复杂的查询语句进行封装,用户使用时不需要关心表的结构、连接关系、筛选条件、分组和排序等等,只需要对视图进行简单的查询。
  • 安全:保护数据,根据特定授权分配权限。创建视图时,可以筛选掉一些不希望用户看到的行和列,也可以给视图设置访问权限,让不同级别的用户看到不同的视图,从而提高数据库的数据安全性。
缺点
  • 操作视图会比直接操作基础表要慢,所以我们尽量避免在大型表上创建视图。
  • 尽量不要创建嵌套视图,就是在视图中使用视图。 这样在查询时,会多次重复访问基础表,带来性能损耗。
  • 在视图中只返回所需的信息,尽量不要在视图使用不需要访问的表。
  • 在大型表或者复杂定义的视图,可以使用存储过程代替。
  • 频繁使用的视图,可以使用索引视图来代替。
创建视图

语法

create view <视图名> as <select 查询语句>;

示例:不同职位的最低工资及从事该工作的员工姓名、职位和工资

mysql> create view job_minsal_view as
    -> (select ename,t.job,最低工资
    -> from (select job,min(sal) 最低工资 from emp group by job) t
    -> left join emp on t.job=emp.job
    -> where sal=最低工资);
查看视图

语法

desc <视图名>;

示例:查看视图结构

mysql> desc job_minsal_view;
+--------------+-------------+------+-----+---------+-------+
| Field        | Type        | Null | Key | Default | Extra |
+--------------+-------------+------+-----+---------+-------+
| ename        | varchar(15) | YES  |     | NULL    |       |
| job          | varchar(10) | NO   |     | NULL    |       |
| 最低工资     | float       | YES  |     | NULL    |       |
+--------------+-------------+------+-----+---------+-------+
使用视图

语法

select <字段名1>[,<字段名2>...<字段名n>] from <视图名>[ where <筛选条件>];

示例:查询视图中的记录

mysql> select * from job_minsal_view;
+--------+------------+--------------+
| ename  | job        | 最低工资     |
+--------+------------+--------------+
| smith  | clerk      |          800 |
| ward   | salesman   |         1250 |
| martin | salesman   |         1250 |
| clark  | manager    |         2450 |
| scott  | analyst    |         3000 |
| king   | persident  |         5000 |
| ford   | analyst    |         3000 |
+--------+------------+--------------+
修改视图

修改视图是指修改数据库中已存在的表的定义,当基表的某些字段发生改变时,可以通过修改视图来保持视图和基本表之间一致。
语法

create [or replace or alter] view <视图名> as <select 查询语句>;

示例

alter view job_minsal_view as
select empno,ename,t.job,最低工资
from (select job,min(sal) 最低工资 from emp group by job) t
left join emp on t.job=emp.job
where sal=最低工资;
更新视图

因为视图本身没有数据,因此对视图中的数据进行的操作最终都体现在基本表中。
更新视图的三种语法:update、insert和delete
语法

update <视图名> set <字段>=<>[ where <条件>];

insert into <视图名> values(1,2...值n);

delete from <视图名>[ where <条件>];

当然,不是所有的视图都可以更新,有下列内容之一,视图不能做更新:

  • select子句中包含distinct ;
  • select子句中包含组函数 ;
  • select语句中包含group by子句 ;
  • select语句中包含order by子句 ;
  • select语句中包含union 、union all等集合运算符 ;
  • where子句中包含相关子查询 ;
  • from子句中包含多个表 ;
  • 如果视图中有计算列,则不能更新;
  • 如果基表中有某个具有非空约束的列未出现在视图定义中,则不能做insert操作
删除视图

删除视图是指删除数据库中已存在的视图,删除视图时,只能删除视图的定义,不会删除数据,也就是说基本表中的数据不会被删除。
语法

drop view[ if exists] <视图名>;

示例

mysql> drop view job_minsal_view;
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值