第五章 视图
/*
含义:虚拟表,和普通表一样使用
mysql5.1版本开始提供视图功能,是通过表动态生成的数据是一种虚拟存在的表,行和列的数据来自定义视图的查询中使用的表,并且是在使用视图时动态生成的;只保存了sgl逻辑,不保存查询结果
应用场景:
多个地方用到同样的查询结果
该查询结果使用的sql语句较复杂
特点:
1、重用sql语句
2、简化复杂的sql操作,不必知道它的查询细节
3、保护数据,提高安全性
创建语法关键字 | 是否实际占用物理空间 | 使用 | |
---|---|---|---|
视图 | create view | 占用小,仅保存sql逻辑 | 增删改查,一般不能增删改 |
表 | create table | 保存了数据 | 增删改查 |
*/
USE student;
#案例:查询姓张的学生名和专业名
#创建视图
CREATE VIEW v1
AS
SELECT s.studentname,m.majorname
FROM student s
INNER JOIN major m ON s.majorid=m.majorid
WHERE s.studentname LIKE '%张%';
#从视图查询
SELECT * FROM v1 WHERE studentname LIKE '%张%';
一、创建视图
/*
语法:
create view 视图名
as
查询语句;
*/
USE myemployees;
#案例:查询姓名中包含a字符的员工名、部门名和工种信息
#①创建
CREATE VIEW v_name
AS
SELECT e.last_name,d.department_name,j.job_title
FROM employees e
INNER JOIN departments d
ON e.department_id=d.department_id
INNER JOIN jobs j ON e.job_id=j.job_id
WHERE e.last_name LIKE '%a%';
#②使用
SELECT * FROM v_name WHERE last_name LIKE '%a%';
#案例:查询各部门门的平均工资级别
#创建视图查看各部门平均工资
CREATE VIEW v_sal
AS
SELECT AVG(salary) ag,department_id
FROM employees
GROUP BY department_id;
#使用
SELECT v_sal.ag,g.grade_level
FROM v_sal
INNER JOIN job_grades g
ON v_sal.ag BETWEEN g.lowest_sal AND g.highest_sal;
#案例:查询平均工资最低的部门信息
CREATE VIEW v_min_sal
AS
SELECT * FROM v_sal ORDER BY ag LIMIT 1;
#案例:查询平均工资最低的部门名和工资
SELECT * FROM departments d
INNER JOIN v_min_sal
ON d.department_id=v_min_sal.department_id;
二、视图的修改
/*
方式一:
create or replace view 视图名
as
查询语句
*/
CREATE OR REPLACE VIEW v_sal
AS
SELECT AVG(salary) ag,job_id
FROM employees
GROUP BY job_id;
SELECT * FROM v_sal;
/*
方式二:
alter view 视图名
as
查询语句
*/
ALTER VIEW v_sal
AS
SELECT AVG(salary) ag,department_id
FROM employees
GROUP BY department_id;
SELECT * FROM v_sal;
三、删除视图
/*
语法:
drop view 视图名,视图名,...;
*/
DROP VIEW v_name,v_sal,v_min_sal;
四、查看视图结构
DESC v_name;
SHOW CREATE VIEW v_name;
五、视图的更新
/*
注意:视图一般是用于查询,所以具备以下特点的视图都不允许更新:
1、包含关键字的SQL语句:分组函数、distinct、group by、having、union或者union all
2、常量视图
3、select中包含子查询
4、join
5、from一个不能更新的视图
6、where子句的子查询引用了from子句的表
*/
CREATE OR REPLACE VIEW v_asal
AS
SELECT last_name,email
FROM employees;
SELECT * FROM v_asal;
SELECT * FROM employees;
1、插入
INSERT INTO v_asal VALUES('测试','test@qq.com');
2、修改
UPDATE v_asal SET last_name='Test'
WHERE last_name='测试';
3、删除
DELETE FROM v_asal WHERE last_name='Test';
====================================================
分享,多担待。望有帮助