MySQL:视图
MySQL:视图
介绍
一种虚拟存在的表,和普通表一样使用
行和列的数据来自定义视图的查询中使用的表,并且是使用视图时动态生成,只保存了sql逻辑不保存查询结果
mysql5.1版本出现的新特性,是通过表动态生成的数据。
应用场景
- 多个地方用到同样的查询结果
- 该查询结果使用的sql语句较复杂
- 重用sql语句
- 简化复杂的sql操作,不必知道他的查询细节
- 保护数据,提高安全性
创建视图
create view 视图名 as 查询语句;
案例
# 案例1: 查询有相中包含a字符的员工名、部门名、工种信息 # 创建视图 create view myv1 as select name,department,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 * form myv1 where name like '%a%'; # 案例2: 查询各部门的平均工资级别 create view myv2 as select avg(salary) ag,department_id from employees group by departmetn_id; select myv2.`ag`,g.grage_level from myv2 join job_grades g on myv2. `ag` between g.`lowest_sal` and g.`highest_sal`; # 案例3:查询平均工资最低的部门信息 select * from myv2 order by ag limit 1; # 案例4:查询平均工资最低的部门名和工资 create view myv3 as select * from myv2 order by ag limit 1; select d.*,m.ag from myv3 m join departments d on m.`department_id`=d.`department_id`;
修改视图
# 方式1 create or replace view 视图名 as 查询语句; # 方式2 alter view 视图名 as 查询语句;
删除视图
drop view 视图名1,视图名2...
查看视图
#方式1, 推荐 desc myv3; # 方式2 show create view myv3\G; # \G格式化输出
案例
# 案例1 创建视图emp_v1, 要求查询电话号码以 "011"开头的员工姓名和工资,邮箱 create or replace view emp_v1 as select name,salary,email from employees where phone_num link "011%"; # 案例2 创建视图emp_v2, 要求查询部门的最高工资高于12000的部门信息 create or replace view emp_v2 as select max(salary) mx_dep, department_id from employees group by department_id having max(salary)>12000; select d.*,m.mx_dep from departments d join emp_v2 m on m.department_id=d.department_id;
视图的更新
视图的可更改性和试图中查询的定义有关系,一下类型的视图是不能更新的。
-
- 包含以下关键字的sql语句:分组函数,distinct, group by, having, union, union all
- 常量视图
- select 中包含子查询
- join
- from 一个不能更新的视图
- where子句的子查询引用了from子句中的表
/* create view myv1 as select name,email from employees; 1. 插入: 有些情况可以成功,有些情况不会成功,也不报错; insert into myv1 values(); 2. 修改 update myv1 set name='jhon' where name='Mary' 3. 删除 delete from myv1 where name='jhon'; */
视图和表
创建语法 | 占用物理空间 | 使用 | |
视图 | create view | 只是保存了sql逻辑 | 增删改查,一般不能增删改 |
表 | create table | 保存了数据 | 增删改查 |