`
1enny
  • 浏览: 70598 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

视图

 
阅读更多
oracle212


视图

q视图以经过定制的方式显示来自一个或多个表的数据
q视图可以视为“虚拟表”或“存储的查询”
q创建视图所依据的表称为“基表”
q视图的优点有:
q提供了另外一种级别的表安全性
q隐藏的数据的复杂性
q简化的用户的SQL命令
q隔离基表结构的改变
q通过重命名列,从另一个角度提供数据

创建视图语法 :
CREATE [OR REPLACE][FORCE]VIEW

view_name [(alias[, alias]...)]

AS

select_statement

[WITH CHECK OPTION]

[WITH READ ONLY];

SQL> create view test_view_force as select * from student;
create view test_view_force as select * from student
ORA-00942: 表或视图不存在

SQL> create force view test_view_force as select * from student;
Warning: View created with compilation errors

SQL> select * from user_views uv where uv.VIEW_NAME='TEST_VIEW_FORCE';
VIEW_NAME TEXT_LENGTH TEXT TYPE_TEXT_LENGTH TYPE_TEXT OID_TEXT_LENGTH OID_TEXT VIEW_TYPE_OWNER VIEW_TYPE SUPERVIEW_NAME EDITIONING_VIEW READ_ONLY
------------------------------ ----------- -------------------------------------------------------------------------------- ---------------- -------------------------------------------------------------------------------- --------------- -------------------------------------------------------------------------------- ------------------------------ ------------------------------ ------------------------------ --------------- ---------
TEST_VIEW_FORCE 22 select * from student N N

SQL> SELECT * FROM TEST_VIEW_FORCE;
SELECT * FROM TEST_VIEW_FORCE
ORA-04063: view "HR.TEST_VIEW_FORCE" 有错误

SQL> create table student(id number(20),name varchar2(20), enter_date date );
Table created
SQL> insert into student values(1,'张三',to_date('20140101','yyyymmdd'));
1 row inserted

SQL> insert into student values(1,'李四',to_date('20140102','yyyymmdd'));
1 row inserted

SQL> insert into student values(1,'王五',to_date('20140103','yyyymmdd'));
1 row inserted

SQL>
SQL> select * from test_view_force;
ID NAME ENTER_DATE
--------------------- -------------------- -----------
1 张三 01-1月-14
1 李四 02-1月-14
上面的测试时针对于force关键字的,通过force关键字可以预先为某个即将创建的表先创建视图。

SQL> create view test_view_with_check_option as select * from student where student.name='张三';
View created

SQL> select * from test_view_with_check_option;
ID NAME ENTER_DATE
--------------------- -------------------- -----------
2 张三 01-1月-14

SQL> update test_view_with_check_option tvwco set tvwco.ID=10 where tvwco.NAME='张三';
1 row updated

SQL>select * from test_view_with_check_option;
ID NAME ENTER_DATE
--------------------- -------------------- -----------
10 张三 01-1月-14

SQL> select * from student;
ID NAME ENTER_DATE
--------------------- -------------------- -----------
10 张三 01-1月-14
4 李四 02-1月-14
4 王五 03-1月-14

SQL>
更新视图也更新表
上面的测试本来是验证假如没有加with check option就会出现 红色的查询会查不出来,会出现丢失行的问题
但是测试没有成功....反正记住这一点加了with check option就是为了视图不能更新

with reed only 不能更新

视图的DML:
q在视图上也可以使用修改数据的DML语句,如INSERT、UPDATE和DELETE
q视图上的DML语句有如下限制:
q只能修改一个底层的基表
q如果修改违反了基表的约束条件,则无法更新视图
q如果视图包含连接操作符、DISTINCT 关键字、集合操作符、聚合函数或 GROUP BY 子句,则将无法更新视图
q如果视图包含伪列或表达式,则将无法更新视图

键保留表:
定义:就是两个表建立复杂视图,在视图中充当主键的列是来自哪个表中的那么那张表就是键保留表,相反的为非键保留表
对于键保留表通过视图可以更新,而对于非键保留表不可以通过视图更新;也就是视图中的列是来自键保留表中的列可以更新,相反的则不能。
但是可以通过instead of 触发器可以做到非保留表的更新操作
SQL> purge recyclebin;//清除回收站
Done

SQL> create table student (sno number(20),sname varchar2(20),sdept number(20));
Table created

SQL> create table dept (deptno number(20),deptname varchar2(20));
Table created

SQL> insert into student values(1,'张三',100);
1 row inserted

SQL> insert into student values(2,'李四',101);
1 row inserted

SQL> insert into student values(3,'李四',102);
1 row inserted

SQL> insert into dept values(100,'数计系');
1 row inserted

SQL> insert into dept values(101,'医学系');
1 row inserted

SQL> insert into dept values(102,'文学系');
1 row inserted

SQL> alter table student add constraints pk_student primary key(sno);
Table altered

SQL> alter table dept add constraints pk_dept primary key(deptno);
Table altered
SQL>
SQL> alter table student add constraints fk_foreign foreign key(sdept) references dept(deptno);
Table altered

SQL> create view view_stu_dept
2 as
3 select * from student s inner join dept d on s.sdept = d.deptno;
View created

SQL> select * from view_stu_dept;
SNO SNAME SDEPT DEPTNO DEPTNAME
--------------------- -------------------- --------------------- --------------------- --------------------
1 张三 100 100 数计系
2 李四 101 101 医学系
3 李四 102 102 文学系

SQL> select uc.OWNER,uc.CONSTRAINT_NAME,uc.CONSTRAINT_TYPE,uc.TABLE_NAME,uc.view_related from user_constraints uc where uc.TABLE_NAME='STUDENT';
OWNER CONSTRAINT_NAME CONSTRAINT_TYPE TABLE_NAME VIEW_RELATED
------------------------------------------------------------ ------------------------------ --------------- ------------------------------ --------------
HR PK_STUDENT P STUDENT
HR FK_FOREIGN R STUDENT


SQL> update view_stu_dept vsd set vsd.SNO=11 where vsd.SNO = 1;
1 row updated

SQL> select * from student;
SNO SNAME SDEPT
--------------------- -------------------- ---------------------
11 张三 100
2 李四 101
3 李四 102

SQL> update view_stu_dept vsd set vsd.SDEPT=103 where vsd.SNO = 2;
update view_stu_dept vsd set vsd.SDEPT=103 where vsd.SNO = 2
ORA-02291: 违反完整约束条件 (HR.FK_FOREIGN) - 未找到父项关键字

SQL> update view_stu_dept vsd set vsd.DEPTNO=103 where vsd.SNO = 2;
update view_stu_dept vsd set vsd.DEPTNO=103 where vsd.SNO = 2
ORA-01779: 无法修改与非键值保存表对应的列

SQL>

视图中使用函数:
q视图中可以使用单行函数、分组函数和表达式
q必须为使用函数或者表达式的字段指定名字
SQL> create view view_stu_fun
2 as
3 select sno, upper(student.sname) ,student.sdept from student s ;
create view view_stu_fun
as
select sno, upper(student.sname) ,student.sdept fromstudent s
ORA-00904: "STUDENT"."SDEPT": 标识符无效
上面错误说明了假如给表起了别名那么就必须使用指定别名来引用列而不能使用表名.列名
SQL>
SQL> create view view_stu_fun
2 as
3 select sno, upper(student.sname) ,student.sdept from student
4
SQL> create view view_stu_fun
2 as
3 select sno ,upper(sname),sdept from student;
create view view_stu_fun
as
select sno ,upper(sname),sdept from student
ORA-00998: 必须使用列别名命名此表达式
使用函数创建视图必须为视图起别名

SQL> create view view_stu_fun
2 as
3 select sno ,upper(sname) as upper_sname,sdept from student;
View created

SQL> select * from student;
SNO SNAME SDEPT
--------------------- -------------------- ---------------------
1 zhangsan 100
2 李四 101
3 李四 102

SQL> select * from view_stu_fun;
SNO UPPER_SNAME SDEPT
--------------------- -------------------- ---------------------
1 ZHANGSAN 100
2 李四 101
3 李四 102

SQL> update view_stu_fun set UPPER_SNAME = '张三' where UPPER_SNAME='zhangsan';
update view_stu_fun setUPPER_SNAME= '张三' where UPPER_SNAME='zhangsan'
ORA-01733: 此处不允许虚拟列
更新视图时不能使用虚拟列

SQL> update view_stu_fun set SNO = 4 where UPPER_SNAME='ZHANGSAN';
1 row updated

SQL>
SQL> create view view_stu_fun_2
2 as
3 select sno as snoo, upper(student.sname) as upper_sname,student.sdept from student;
View created

SQL> select * from view_stu_fun_2;
SNOO UPPER_SNAME SDEPT
--------------------- -------------------- ---------------------
4 ZHANGSAN 100
2 李四 101
3 李四 102

SQL> update view_stu_fun_2 set snoo=5 where snoo = 4;
1 row updated

SQL> update view_stu_fun_2 set UPPER_SNAME='张三' where snoo = 5;
update view_stu_fun_2 set UPPER_SNAME='张三' where snoo = 5
ORA-01733: 此处不允许虚拟列

SQL>
SQL> select * from view_stu_fun_2;
SNOO UPPER_SNAME SDEPT
--------------------- -------------------- ---------------------
5 ZHANGSAN 100
2 李四 101
3 李四 102

SQL> update view_stu_fun_2 set snoo=7 where UPPER_SNAME = 'ZHANGSAN';
1 row updated

SQL>
对于上面的更新只能更新视图中没有被函数处理的列,但是where 子句中可以使用被函数处理的列










分享到:
评论

相关推荐

    数据库实验报告视图的使用

    通过视图的设计和定义,掌握建立视图的基本方法,包括通过单张表建立视图和通过多张表建立视图,通过在定义的视图上进行查询,删除,更新,插入操作,理解视图的概念,掌握简单的视图查询方法。 3. 实验预备知识 在...

    MySQL数据库应用 实验训练4:视图和索引的构建与使用

    基于实验1创建的汽车用品网上商城数据库Shopping,理解视图和索引的概念和作用,练习视图的基本操作,包括视图的建立,视图的查询,视图的更新,视图的删除,体会视图带来的方便;练习索引的创建和删除,对比有索引...

    滚动视图与列表视图的共存效果.zip

    这是滚动视图与列表视图的共存效果源码,我们知道滚动视图与列表视图共存会存在滚动的问题,并且列表视图只显示一个半选项。 只要当列表视图的高度设定一定的值时,列表视图同样地会显示对应的高度的选项。 因此我们...

    《数据库系统概论》实验报告—视图

    1、用CREATE语句建立视图,观察结果。 ⑴建立计科系(CS)学生的视图cs_student,并要求进行修改和插入操作时仍需保证该视图只有计科系的学生。 ⑵建立计科系选修了1号课程的学生的视图。 ⑶定义一个反映学生出生...

    数据库实验报告 视图的定义及使用实验(详细版有截图的)

    实验三(1)视图的定义及使用实验 一、实验目的 使学生掌握 SQL Server中的视图创建及删除的方法,加深对视图和SQL Server图表作用的理解。 本实验需要1学时。 二、实验内容 1. 启动数据库服务软件SQL Server 2000的...

    视图详细操作.docx

    【例1】创建ccj视图,包括计算机专业各学生的学号、其选修的课程号及成绩。要保证对该视图的修改都符合专业为计算机这个条件。 【例2】创建计算机专业学生的平均成绩视图ccj_avg,包括学号(在视图中列名为num)和...

    SQL Server索引视图及性能提高简介

    从数据库管理系统 (DBMS) 的观点来看,视图是数据(元数据)的说明。创建典型视图时,通过 SELECT 语句(定义一个显示为虚拟表的结果集)来定义元数据。当其它查询的 FROM 子句中引用了某个视图时,将从系统目录中...

    4+1视图方法的3大特点——4+1视图剖析系列

    后来,PhilippeKruchten加入Rational,他的4+1视图方法演变为著名的、为许多架构师所熟知的“RUP4+1视图方法”(如下图所示)。概括而言:逻辑视图(LogicalView),设计的对象模型。进程视图(ProcessView),捕捉...

    angular4强制刷新视图的方法

    使用angular的过程中有时会出现数据已经更新了,但是对于的视图没有更新,针对这一情况,可以是用angular提供的方法强制更新视图。 这里使用NGZone来更新视图 import {NgZone} from '@angular/core'; constructor...

    oracle常用数据字典视图.xls

    数据字典视图说明: 数据字典视图一般有三套:以存表的视图为例 dba_tables[DBA所有的], all_tables[所有用户所有的], user_tables[当前用户所有的] 对于DBA所有的,只有拥有DBA权限的用户才可以查询,否则提示表或...

    实验六-视图的定义及查询

    基于实验一建立的“图书读者数据库”(Book_Reader_DB)和实验二输入的部分虚拟数据,在SQL ...③ 在查询分析器中用SQL语句来创建视图View3和视图View4,视图View3的要求与View1相同,视图View4与视图View2的条件相同。

    视图工具视图工具视图工具视图工具

    视图工具视图工具视图工具视图工具视图工具视图工具视图工具视图工具视图工具

    H3C Comware V7常用命令行视图介绍-整本手册.rar

    1 ComwareV7 命令行视图综述 1.1 命令行视图分层结构 1.2 进入视图 1.3 退出视图 2 用户视图 3 系统视图 4 功能视图 4.1 功能视图分类 4.2 物理接口及其对应的子接口视图 4.3 设备虚拟化技术相关视图 4.4 网络虚拟化...

    细说SQL Server中的视图

    1,什么是视图? 2,为什么要用视图; 3,视图中的ORDER BY; 4,刷新视图; 5,更新视图; 6,视图选项; 7,索引视图; 1.什么是视图  视图是由一个查询所定义的虚拟表,它与物理表不同的是,视图中的数据没有...

    VF 查询与视图

    视图与查询:利用学生管理中的数据库进行操作 1、 建立视图名为学生档案视图,包含xsgl(或学生档案表)中的学号、姓名、奖学金字段的内容 2、 建立视图名为成绩视图,包含学生的学号,姓名,年龄,课程号,成绩 3、...

    Oracle数据库中物化视图的原理剖析

    物化视图 (MV)在一个段中存储查询结果,并且能够在提交查询时将结果返回给用户,从而不再需要重新执行查询 — 在查询要执行几次时,这是一个很大的好处。物化视图可以利用一个快速刷新机制从基础表中全部或增量刷新...

    微信小程序学习demo:视图控件View、ScrollView、Swiper(源代码+截图)

    微信小程序学习demo:视图控件View、ScrollView、Swiper(源代码+截图)微信小程序学习demo:视图控件View、ScrollView、Swiper(源代码+截图)微信小程序学习demo:视图控件View、ScrollView、Swiper(源代码+截图)微信...

    多视图Demo,包括自定义视图,窗口分割,窗口样式改变

    MFC给我们做好了一个多视图的框架。但在应用中,MFC默认的视图并不能满足我们的要求。本Demo中包含以下做界面的常用代码: 自定义视图: 在CWinApp::Initlnstance里定义CMultiDocTemplate 视图窗口分割: 在...

    MySQL数据库:数据视图的修改和删除.pptx

    视图的修改和删除 数据视图 课程目标 理解 —— 修改视图定义的语法; 掌握 ——修改视图的方法; 掌握 —— 删除视图的方法。 视图的修改和删除 修改视图 视图被创建之后,由于某种原因(如基本表中的列发生改变或...

    对话框视图对话框视图

    对话框,视图 对话框,视图 对话框,视图

Global site tag (gtag.js) - Google Analytics