--视图
在进行复杂数据查询时,经常使用视图完成,利用视图可以保证安全性

--视图
视图实际上一条存储起来的查询语句,是数据的显示方式
是一张虚表,逻辑上的概念,不是实际的物理存储,不占用空间

--视图的作用
--安全(可以利用视图限制用户访问数据行,列,插入数据的权利,屏蔽某些字段)
--方便(将复杂的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他们的作用