含义:虚拟表,和普通的表一样使用,行和列的数据来自定义视图的查询中使用的表 ,并且是在使用视图时动态生成的,只保存了sql逻辑,不保存查询结果
应用场景:
多个地方用到同样的查询结果
该查询结果使用的sql语句较复杂
视图和表的对比:
创建语法的关键字 是否实际占用物理空间 使用
视图 create view 只是保存了sql逻辑 增删改查,只是一般不能增删改
表 create table 保存了数据 增删改查
一、创建视图
语法:
create view 视图名 as 查询语句;
#案例:
#1.查询姓名中包含a字符的员工名、部门名和工种信息
#创建:
create view myv1 as select last_name,department_name,job_title from employees e join departments d on
e.department_id=d.department_id join jobs j on j.job_id = e.job_id;
#使用:
select * from myv1 where last_name like '%a%';
#2.查询各部门的平均工资级别
#创建:
create view myv2 as select avg(salary) ag,department_id from employees group by department_id;
#使用:
select myv2.ag,g.grade_level from myv2 join job_grades g on myv2.ag between g.lowest_sal and g.highest_sal;
#3.查询平均工资最低的部门信息
select * from myv2 m order by ag limit 1;
#4.查询平均工资最低的部门名和工资
#创建:
create view myv3 as select * from myv2 m order by ag limit 1;
#使用:
select d.*,m.ag from myv3 m join departments d on m.department_id =d.department_id;
优点:
重用sql语句
简化复杂的sql操作,不必知道它的查询细节
保护数据,提高安全性
二、视图的修改
方式一:
create or replace view 视图名 as 查询语句;
方式二:
alter view 视图名 as 查询语句;
三、删除视图
drop view 视图名,视图名,......;
四、查看视图
desc myv2;
show create view myv3;
五、视图的更新
create or replace view myv1 as select last_name,email from employees;
#1.插入
insert into myv1 values('张飞','zf@qq.com');
#2.修改
update myv1 set last_name = '张无忌' where last_name = '张飞';
#3.删除
delete from myv1 where last_name = '张无忌';
视图的可更新性和视图中查询的定义有关系,以下类型的视图是不能更新的,包含以下关键字的sql语句:
分组函数、distinct、group by 、having、union或者union all
常量视图
Select中包含子查询
join
from一个不能更新的视图
where子句的子查询引用了from子句中的表