【数据库学习】17 视图

含义

是虚拟表,和普通表一样使用,它与包含数据的表不一样,视图只包含使用时动态检索数据的查询。

例如:一个年级有22个班级,有一天领导要来视察学校的情况,领导比较喜欢精英教育,如实为了应付领导的视察,学校从22个班级里临时抽调出一部分人组成一个新的临时班级23班,领导走之后这个班级就解散。那么原来的22个班级就是我们普通的表,而23班就是视图,虚拟表,一个临时生成的表。

应用场景

  • 多个地方需要用到相同的查询结果
  • 该查询结果使用的SQL语句较为复杂

案例

案例1:

SELECT last_name,department_name
FROM employees e,departments d
WHERE e.`department_id`=d.`department_id`
AND e.`commission_pct` IS NOT NULL;

上面这段用来查询奖金非空(有奖金)的员工名和部门名。任何需要这个数据的人都必须理解相关表的结构,并且知道如何创建查询和对表进行联结。现在加入将整个查询封装成一个名为departmentid的虚拟表,可以使用有如下的命令轻松检索:

SELECT last_name,department_name
FROM departmentid
WHERE  e.`commission_pct` IS NOT NULL;

这就是视图的作用。

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

SELECT stuname,majorname
FROM stuinfo s
INNER JOIN major m ON s.`majorid`= m.`id`
WHERE s.`stuname` LIKE '张%';

这是原始的方法,如果使用视图:

CREATE VIEW v1
AS
SELECT stuname,majorname
FROM stuinfo s
INNER JOIN major m ON s.`majorid`= m.`id`;

后面再进行查询姓张的学生名和专业名就可以这样:

SELECT   * 
FROM  v1 
WHERE stuname LIKE '张%' ;

创建视图

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 myv1
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 ORDER BY ag LIMIT 1;

视图的修改

方式一:

create or replace view  视图名
as
查询语句;

例如:

CREATE OR REPLACE VIEW myv3
AS
SELECT AVG(salary),job_id
FROM employees
GROUP BY job_id;

 方式二:

alter view 视图名
as 
查询语句;

例如:

ALTER VIEW myv3
AS
SELECT * FROM employees;

 删除视图

语法:drop view 视图名,视图名,...;

 查看视图

DESC 视图名;

 视图的更新(很少用)

我们新建一个视图,然后对它进行修改:

CREATE OR REPLACE VIEW myv1
AS
SELECT last_name,email
FROM employees;

查看一下新建的视图:

SELECT * FROM myv1;

1.在视图中插入

INSERT INTO myv1 VALUES('Zhangsan','[email protected]');

 然后再次查询发现视图就增加了一行:

2.在视图中修改

UPDATE myv1 
SET last_name = 'Lisi' 
WHERE last_name = 'Zhangsan' ;

 3.在视图中删除

DELETE FROM myv1 
WHERE last_name = 'Lisi';

在视图中的增删改也会影响到原始表的数据!

视图的可更新性和视图中查询的定义有关系,以下类型的视图是不能进行更新的:

  • 常量视图
  • join
  • Select中包含子查询
  • from一个不能更新的视图
  • where子句的子查询引用了from子句中的表
  • 包含以下关键字的sql语句:分组函数、distinct、group by、having、union或者union all
发布了169 篇原创文章 · 获赞 101 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/zzu_seu/article/details/102865785