--视图
在进行复杂数据查询时,经常使用视图完成,利用视图可以保证安全性
--视图
视图实际上一条存储起来的查询语句,是数据的显示方式
是一张虚表,逻辑上的概念,不是实际的物理存储,不占用空间
--视图的作用
--安全(可以利用视图限制用户访问数据行,列,插入数据的权利,屏蔽某些字段)
--方便(将复杂的SQL语句创建成视图)
--一致性(将报表封装成视图)
--对视图的操作 实际上是操作实际真实存储的表,实际上修改的就是表的信息
--如何在oracle中创建或者替换视图
create or replace view myview
as
select * from dept; --创建视图的表我们称为基表
--使用视图
select * from myview;
select * from dept;
--通过视图删除基表数据
delete from myview where deptno=50
--通过视图往基表里面插入数据
insert into myview values(50,'deptment','china')
--通过视图去更新基表数据
update myview set dname = 'aaaa' where deptno=50
--带条件的视图
create or replace view myview
as
select * from dept where deptno <= 40;
--查询视图
select * from myview;
select * from dept;
insert into myview values(60,'bbbbb','china');
delete from dept where deptno=60;--如果视图中看不到这条记录,他们通过视图删除数据时删除不了
--上面语句容易让人误解没有将数据插入表中
--解决方法
create or replace view myview
as
select * from dept where deptno <= 40
with check option --检查视图的选项,对应的限制条件是where子句后面的条件
--或者在后面加上constraint 约束名称
--注意:with check option 只限制视图,不限制表
insert into myview values(70,'aaa','china');--创建上面视图后再执行就会报错的
insert into dept values(70,'aaa','china');--是可以插入的
insert into myview values(12,'bbb','china');--可以插入 没有问题
rollback;
--复杂SQL语句的组合查询
select * from emp;
select * from dept;
--查询员工编号,姓名,工作,所在部门名称,并且封装成视图
create or replace view myview
as
select empno,ename,job,dname
from emp ,dept
where emp.deptno = dept.deptno;
select * from myview;
/* 在SQL SERVER里面的操作
如果一个视图基于多张表,那么我们通过视图来修改、添加,以及删除的时候,如果记录里面的数据涉及到多张基表
我们是不能通过视图来进行操作的。我们可以通过视图来添加,修改某一张基表的数据(不考虑约束的情况下)是能够操作的。
use ss;
select * from student;
select * from score;
--创建一个视图,来查询学生学号,姓名,性别,以及每门课的成绩
create view stu_sco
as
select s.sno,sname,ssex, cno,degree
from student s,score sc
where s.sno = sc.sno
select * from stu_sco;
--通过视图去添加记录
insert into stu_sco values(111,'张三','男','6-106',80) --不能操作的
insert into stu_sco(sno,sname,ssex) values(222,'张三','男');--通过视图对其中的一张基表进行操作
--通过视图去删除记录
delete from stu_sco where sno = 103;--不能操作的
--通过视图去修改记录
update stu_sco set ssex = '女' where sno = 103; --能执行
select * from student;
select * from score;
update stu_sco set ssex='男' , degree =90 where sno = 103;--报错:视图或函数 'stu_sco' 不可更新,因为修改会影响多个基表。
update stu_sco set degree = 90 where sno = 103;
*/
select * from dept;
select * from emp;
select * from myview;
--试图书写查询语句
insert into myview values(1111,'jack','CLERK','sales');--数据涉及多张基表
--报错:因为基表超过两张
--那么如何解决?后面我们讲解oracle中替代触发器能解决
insert into myview(empno,ename,job) values(1111,'jack','CLERK'); --通过视图只操作一张基表
update myview set ename = 'aaa' where empno = 7369;--通过视图更新一张基表
update myview set ename = 'AAAA',DNAME='BBBB' where empno=7369;--不能通过视图修改多张基表
delete from myview where empno = 7369;--可以删除
select * from emp where empno = 7369;
select * from dept where dname='RESEARCH';
--如何创建视图只读 with read only
create or replace view myview
as
select * from dept
with read only;--只读
select * from myview;--没有问题
insert into myview values(70,'clerk','china');--报错,只读视图
delete from myview;--报错,只读视图
update myview set dname='AAAA' where deptno=10;--报错,只读视图
--在视图创建的时候,如果含有聚合函数,distinct,group by 子句,
--那么尽管我们不加with read only; 视图也是只读视图
--查询某部门里面的员工个数
create or replace view myview
as
select d.deptno,dname,count(empno) as count_emp
from dept d,emp e
where d.deptno = e.deptno
group by d.deptno,dname
select * from myview;
--尝试通过上面视图修改某一个基表的内容
update myview set dname='AAAA' where deptno = 10;
select * from student;
--创建带有错误的视图,如果在后续操作中将错误处理掉了。我们的视图就能使用了
select * from student1;
create force view view_error
as
select * from student1;
select * from view_error;
--表不存在的情况下,通过已经存在的表去创建新表,同时将数据拷贝过去
create table student1
as
select * from student;
--如果在SQL SERVER里面书写select * into student1 from student;
--总结:
(1) select
from
where
group by
having
order by
(2)去汇总在SQL SERVER中以及在ORACLE中分别有哪些方式同时一次性往表里面插入多条数据
select * from student1;
--联接视图
CREATE VIEW ven_ord_outj_view AS
SELECT vm.vencode, venname, orderno, odate, ostatus
FROM vendor_master vm, order_master om
WHERE vm.vencode = om.vencode(+);
--相当于
SELECT vm.vencode, venname, orderno, odate, ostatus
FROM vendor_master vm LEFT OUTER JOIN order_master om
ON vm.vencode = om.vencode;
/*只能修改一个底层的基表
如果修改违反了基表的约束条件,则无法更新视图
如果视图包含连接操作符、DISTINCT 关键字、集合操作符、聚合函数或 GROUP BY 子句,则将无法更新视图
如果视图包含伪列或表达式,则将无法更新视图
*/
--删除视图
drop view view_error
--查看视图
select * from dba_views;
select * from all_views;
select * from user_views;
--查看当前用户下视图的语法信息
select text from user_views;
--可以通过replace来修改视图
create or replace view myview
as
select * from dept;
--了解视图的优缺点
--一般都是通过视图来进行查询操作(比较SQL SERVER里面和oracle视图的区别)
--oracle存在错误视图
--知道如何查询视图
--以及with check option还有with read only他们的作用
oracle 视图
原创
©著作权归作者所有:来自51CTO博客作者415172536的原创作品,请联系作者获取转载授权,否则将追究法律责任
上一篇:oracle DML语句
下一篇:oracle 索引
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
如何在Odoo中利用SQL视图创建动态视图
odoo sql 视图
SQL 数据 菜单项 -
oracle 视图基础 - [ORACLE]
而补漏,不为晚矣;视图的概念视图是基...
Oracle 出版 SQL 数据结构 数据