首页 专题 文章 代码 归档
Mysql 视图简介
2020.03.13 16:14 2020.03.13 19:07

1. 视图

含义:虚拟表,和普通标一样使用;

视图是从一个或多个表中导出来的表,是一种虚拟存在的表。

视图就像一个窗口,通过这个窗口可以看到系统专门提供的数据。

这样,用户可以不用看到整个数据库中的数据,而只关心对自己有用的数据。

数据库中只存放了视图的定义,而没有存放视图中的数据,这些数据存放在原来的表中。

使用视图查询数据时,数据库系统会从原来的表中取出对应的数据。

视图中的数据依赖于原来表中的数据,一旦表中数据发生改变,显示在视图中的数据也会发生改变。

作用:

1.使操作简单化,可以对经常使用的查询定义一个视图,使用户不必为同样的查询操作指定条件

2.增加数据的安全性,通过视图,用户只能查询和修改指定的数据。

3.提高表的逻辑独立性,视图可以屏蔽原有表结构变化带来的影响。

应用场景:

1、多个地方使用到同样的查询结果;

2、该查询结果使用的SQL语句比较复杂;

基本语法:

create view 视图名字 as select 语句

案例:查询姓张的学生名和专业名

以前我们需要这样:

select stuname, majorName
from stuinfo s
         inner join major m on s.majorid = m.id
where stuname like '张%';

每次都要执行该语句,但是我们可以创建一个视图:

create view my_view1
as
select stuname, majorName
from stuinfo s
         inner join major m on s.majorid = m.id;

然后,以后就可以这样查询:

select *
from my_view1
where stuname like '张%';

是不是方便很多?相当于我们又建立了一张表,但是这张表是虚拟的!

相当于:视图帮我们保存了SQL逻辑,并不保存查询结果;

2. 创建视图

语法:

create view 视图名
as
查询语句;#一般是复杂的查询语句

案例:

1、查询姓名中包括a字符的员工名、部门名和工种信息

先建立视图:

create view myv_2
as
select last_name, department_name, job_title
from employees e
         join departments
              on e.department_id = departments.department_id
         join jobs j on e.job_id = j.job_id;

使用:

select *
from myv_2
where last_name like '%a%';

2、查询平均工资最低的部门信息

先创建一个平均工资视图:

create view myv_3
as

select avg(salary) sg, department_id
from employees
group by department_id;

再查询:

select *
from myv_3
order by sg
limit 1;

3、再进一步,查询平均工资最低的部门名和工资

在视图基础上,再创建视图:

create view myv_4
as
select *
from myv_3 v
order by sg
limit 1;

再查询:

select d.*, m.sg
from myv_4 m
         join departments d on m.department_id = d.department_id;

再次总结:

1、重用SQL语句

2、简化复杂的SQL操作,不必知道它的查询细节;

3、保护数据,提高安全性;

3. 视图的修改

方式一:

语法:

create or replace view
as
查询语句;

如下:

create or replace view myv_4
as
select avg(salary), job_id
from employees
group by job_id;

方式二:

语法:

alter view 视图名
as
查询语句;

如:

alter view myv_4
    as
        select *
        from employees;

4. 删除视图

语法:

drop view 视图名1,视图名2,...;

例如:

drop view myv_4,myv_3,myv_2;

5. 查看视图

可以和查看表一样:

desc myv_4;

查看创建语句:

show create view myv_4;

6. 更新视图

新建一个视图:

create or replace view myv1
as
select last_name, email
from employees;

插入:

insert into myv1
values ('迷思爱', 'admin@misiai.com');

然后你会发现:原始表中也有该数据了:

select *
from employees
order by last_name desc;

修改:

update myv1
set last_name = '无道'
where last_name = '迷思爱';

同样,原始表里面的数据也被更改了;

删除:

delete
from myv1
where last_name = '无道';

同样,原始表里面的数据也被删除;


所以一般都会给视图添加权限,让它不能更改原始表

但是,一般情况下,以下类型的视图是本身就不会被更新的:

1、包含以下关键字:分组函数、distinct、group by、having、union或者union all;

2、常量视图;

3、select中包括子查询;

4、join;

5、from一个不能更新的视图;

6、where子句的子查询引用了from子句中的表;

本节阅读完毕! (分享
二维码图片 扫描关注我们哟