oracle 視圖

--視圖
在進行復雜數據查詢時,經常使用視圖完成,利用視圖可以保證安全性

--視圖
視圖實際上一條存儲起來的查詢語句,是數據的顯示方式
是一張虛表,邏輯上的概念,不是實際的物理存儲,不佔用空間

--視圖的作用
--安全(可以利用視圖限制用戶訪問數據行,列,插入數據的權利,屏蔽某些字段)
--方便(將複雜的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他們的作用
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章