视图view基本概念

视图是虚拟的表,基于一个或多个表导出,不存储数据,其内容由查询定义。视图简化了查询操作,提供安全性,并具有逻辑独立性。用户可以创建、查询视图,但对复杂视图的修改受到限制。视图的缺点包括性能差和修改限制。创建视图需要`CREATE VIEW`权限,可以对视图执行INSERT操作,但需遵循基表的约束。带有CHECK OPTION约束的视图确保插入和更新的数据在视图可见范围内。

视图(view):是根据用户需求定义的数据结构,是从一个或多个表导出的虚拟的表,其内容由查询定义。具有普通表的结构,但是不实现数据存储。视图本身并不包含任何数据,它只包含映射到基表的一个查询语句,当基表数据发生变化,视图数据也随之变化。

对视图的修改:单表视图一般用于查询和修改,会改变基本表的数据,

多表视图一般用于查询,不会改变基本表的数据。

  • 作用:

①简化了操作,把经常使用的数据定义为视图,或者用户个性化需要查看的数据定义为视图。

  我们在使用查询时,在很多时候我们要使用聚合函数,同时还要 显示其它字段的信息,可能还会需要关联到其它表,这时写的语句可能会很长,如果这个动作频繁发生的话,我们可以创建视图,这以后,我们只需要select * from view就可以啦,这样很方便。

②安全性,用户只能查询和修改能看到的数据。

  因为视图是虚拟的,物理上是不存在的,只是存储了数据的集合,我们可以将基表中重要的字段信息,可以不通过视图给用户,视图是动态的数据的集合,数据是随着基表的更新而更新。同时,用户对视图不可以随意的更改和删除,可以保证数据的安全性。

③逻辑上的独立性,屏蔽了真实表的结构带来的影响。

  视图可以使应用程序和数据库表在一定程度上独立。如果没有视图,应用一定是建立在表上的。有了视图之后,程序可以建立在视图之上,从而程序与数据库表被视图分割开来。

  • 缺点:

①性能差

  数据库必须把视图查询转化成对基本表的查询,如果这个视图是由一个复杂的多表查询所定义,那么,即使是视图的一个简单查询,数据库也要把它变成一个复杂的结合体,需要花费一定的时间。

②修改限制

  当用户试图修改视图的某些信息时,数据库必须把它转化为对基本表的某些信息的修改,对于简单的视图来说,这是很方便的,但是,对于比较复杂的试图,可能是不可修改的。

 

  • 作用:

①简化了操作,把经常使用的数据定义为视图。

②安全性,用户只能查询和修改能看到的数据。

③逻辑上的独立性,屏蔽了真实表的结构带来的影响。

原文:https://blog.csdn.net/weixin_38055381/article/details/80194986

视图的创建

1.授权创建视图
创建视图的DDL语句是CREATE VIEW,用户必须有CREATE VIEW系统权限,才能创建视图。如果没有权限,创建视图时会提示:权限不足。(和有权限操作视图设计的表和其他视图)
管理员可以通过DCL语句授予用户创建视图的权限。下例中管理员给用户tarena创建视图的权限:
GRANT CREATE VIEW TO tarena;

 

2、创建视图的语法:
CREATE [OR REPLACE] VIEW view_name[(alias[, alias…])]
AS subquery ;
视图创建后,可以像操作表一样操作视图,主要是查询操作。
语法中的Subquery是SELECT查询语句,对应的表被称作基表。
根据视图所对应的子查询种类分为几种类型:
•SELECT语句是基于单表建立的,且不包含任何函数运算、表达式或分组函数,叫做简单视图,此时视图是基表的子集;
•SELECT语句同样是基于单表,但包含了单行函数、表达式、分组函数或GROUP BY子句,叫做复杂视图;
•SELECT语句是基于多个表的,叫做连接视图。

 

3、 创建简单视图(单表)
创建一个简单视图V_EMP_10,来显示部门10中的员工的编码、姓名和薪水:
CREATE VIEW v_emp_10
AS
SELECT empno, ename, sal, deptno
FROM emp
WHERE deptno = 10;
查看视图结构:
DESC v_emp_10;

 

4、查询视图
查询视图和查询表的操作相同:
SELECT * FROM v_emp_10;
此时视图的列名,和创建视图时的列名一致,不一定是原列名:
SELECT id, name, salary FROM v_emp_10;
5、对视图进行INSERT操作
视图本身并不包含数据,只是基表数据的逻辑映射。所以当对视图执行DML操作时,实际上是对基表的DML操作。对视图执行DML操作的基本原则:
•简单视图能够执行DML操作,下列情况除外:在基表中定义了非空列,但简单视图对应的SELECT语句并没有包含这个非空列,导致这个非空列对视图不可见,这时无法对视图执行INSERT操作;
•如果视图定义中包含了函数、表达式、分组语句、DISTINCT关键字或ROWNUM伪列,不允许执行DML操作;
•DML操作不能违反基表的约束条件。
对简单视图执行INSERT操作,成功插入数据到基表中:
INSERT INTO v_emp_10
VALUES(1234, ‘DOCTOR’, 4000, 10);
简单视图可以通过DML操作影响到基表数据。


6、 创建具有CHECK OPTION约束的视图
语法如下:
CREATE [OR REPLACE] VIEW view_name[(alias[, alias…])]

AS subquery
[WITH CHECK OPTION];
其中:WITH CHECK OPTION短语表示,通过视图所做的修改,必须在视图的可见范围内:
•假设INSERT,新增的记录在视图仍可查看
•假设UPDATE,修改后的结果必须能通过视图查看到
•假设DELETE,只能删除现有视图里能查到的记录
创建带有CHECK OPTION约束的视图:
CREATE OR REPLACE VIEW v_emp_10
AS
SELECT empno id, ename name, sal salary, deptno
FROM emp
WHERE deptno = 10
WITH CHECK OPTION;
下述DML语句操作失败,因为部门20不在视图可见范围内:
01.INSERT INTO v_emp_10 VALUES(1008,‘donna’,5500, 20);
02.UPDATE v_emp_10 SET deptno = 20 WHERE id = 7782;

多表建视图例子:

CREATE VIEW view01
AS
SELECT student.id,student.name,city,brand,price,school.name school FROM student
LEFT JOIN cloth ON clothId=cloth.ID
LEFT JOIN school on school.id=schoolId;

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值