MySQL学习笔记(八)-视图
作者:就叫易易好了
日期:2020/11/25
视图就是一种虚拟表,和普通表一样使用,是通过表动态生成的数据。视图的数据来自于表,只保存了sql的逻辑,不保存查询结果,不占储存空间。
一、创建视图
语法:create view 视图名
as 查询语句
使用myemployees数据库
一旦创建了一个视图,在后面需要多次使用的时候,直接调用就可以了,这样就减少了代码冗余。
#查询邮箱中包含a字符的员工名、部门名和工种信息
1、创建视图
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;
2、使用视图
SELECT * FROM myv1 WHERE last_name LIKE '%a%';
#案例:查询各部门的平均工资级别
1、
CREATE VIEW myv2
AS
SELECT AVG(salary) ag,department_id
FROM employees
GROUP BY department_id;
2、
SELECT myv2.`ag`,g.grade_level
FROM myv2
JOIN job_grades g
ON muv2.`ag` BETWEEN g.`lowest_sal` AND g.`highest_sal`;
#案例:查询平均工资最低的部门信息
平均工资已经在上一个题里面创建视图了
SELECT * from myv2 ORDER BY ag LIMIT 1;
#案例:查询平均工资最低的部门名和工资
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`;
视图的好处:
- 重用sql语句
- 简化复杂的sql操作,不必知道它的查询细节
- 保护数据,提高安全性,比如学校要在官网公布教师信息,只能对外提供教师姓名,照片,而身份证号和电话号码等不应该提供,此时就应该使用视图的方法来提高安全性
二、修改视图
方式一:
create or replace view 视图名
as
查询语句;
方式二:
alter viwe 视图名
as
查询语句
那么现在要改一下myv3,改为查询工种的平均工资
方式一:
CREATE OR REPLACE VIEW myv3
AS
SELECT AVG(salary),job_id
FROM employees
GROUP BY job_id;
方式二:
ALTER VIEW myv3
AS
SELECT AVG(salary),job_id
FROM employees
GROUP BY job_id;
三、删除视图
语法:
DROP VIEW 视图名,视图名……
现在我要删除刚才创建的三个视图
DROP VIEW myv1,myv2,myv3;
哦豁
四、查看视图
假如我要查看视图myview(假装有这个视图)
可以用这个语句:
DESC myview;
也可以用:
SHOW CREATE VIEW myview;
五、视图更新
先创建一个视图
CREATE OR REPLACE VIEW myv1
AS
SELECT last_name,email
FROM employees;
1、插入
INSERT INTO myv1 VALUES('马保国','baoguo@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
我们先来创建一个简单的视图:
CREATE OR REPLACE VIEW myv1
AS
SELECT MAX(salary),department_id
FROM employees
GROUP BY department_id;
如果我要对这个视图进行更新:
UPDATE myv1 SET m=9000 WHERE department_id=10;
就会出现这么一个错误:
The target table myv1 of the UPDATE is not updatable
也就是说,这个视图不允许更新,有GROUP BY这个关键词。
- select中包含子查询
CREATE OR REPLACE VIEW myv3
AS
SELECT (SELECT MAX(salary) FROM employees) 最高工资;
那现在我要篡改最高工资的值:
UPDATE myv3 SET 最高工资=10000;
依然会报错,不允许更新。