-
Oracle(2022.02.28)-View카테고리 없음 2022. 2. 28. 15:57728x90
view 객체
-view는 테이블과 유사한 오라클 객체
-select 문의 결과가 가장 전형적인 뷰임
-필요한 정보가 여러 테이블에 분산되어 있는 경우
-특정자료에 대한 접근을 제한하고 결과는 제공할때
(사용형식)CREATE [OR REPLACE] VIEW 뷰이름[(컬럼list)] AS SELECT 문; [WITH READ ONLY]; [WITH CHECK OPTION];
. 'OR REPLACE':같은 이름의 뷰 만들어지고, 이미 있을경우는 덮어 씌운다.
. '(컬럼list)' : 생성된 뷰에서 사용할 컬럼명
-(컬럼list)를 생략하면 뷰의 SELECT절에 사용된 컬럼의 별칭
또는 뷰의 SELECT절에 컬럼의 별칭이 사용되지 않았으면 SELECT절에 컬럼명이
뷰의 컬럼명이 됨
. 원본테이블은 언제든지 바뀔 수 있으며 SELECT 문의 데이터가 바뀌면 VIEW 값도 바뀐다.
VIEW 를 바꾸면 원본테이블도 바뀐다. 원본테이블이 바뀌지 않으려면 'WITH READ ONLY'사용
.'WITH READ ONLY': 읽기전용 뷰 생성 ,VIEW가 INSERT,UPDATE,DELETE (DML명령) 못하게 하며 원본테이블과는 상관 이 없다.
.'WITH CHECK OPTION' : 'SELECT 문'의 WHERE 조건을 위배하는 DML명령을
뷰를 대상으로 수행시킬수 없음. DML실행될 수 있는 조건하에 실행됨
.'WITH READ ONLY'와 'WITH CHECK OPTION'는 같이 사용할 수 없음.사용예) 회원테이블에서 마일리지가 3000이상인 회원의 회원번호, 회원명, 직업, 마일리지를 조회하고 이를 뷰로 생성하시오
CREATE OR REPLACE VIEW V_MEM01(MID,MNAME,MJOB,MILE) AS SELECT MEM_ID AS 회원번호, MEM_NAME AS 회원명, MEM_JOB AS 직업, MEM_MILEAGE AS 마일리지 FROM MEMBER WHERE MEM_MILEAGE>=3000;
(뷰 확인)
SELECT *FROM V_MEM01;
<view이름에 컬럼리스트가 없을 경우>
CREATE OR REPLACE VIEW V_MEM01 AS SELECT MEM_ID AS 회원번호, MEM_NAME AS 회원명, MEM_JOB AS 직업, MEM_MILEAGE AS 마일리지 FROM MEMBER WHERE MEM_MILEAGE>=3000;
(뷰 확인)
SELECT *FROM V_MEM01;
CREATE OR REPLACE VIEW V_MEM01 AS SELECT MEM_ID , MEM_NAME , MEM_JOB , MEM_MILEAGE FROM MEMBER WHERE MEM_MILEAGE>=3000;
(뷰 확인)
SELECT *FROM V_MEM01;
테이블 생성 (원본데이터를 지우거나 조작할 수 없으므로 연습사마 확인할때 복사본데이터로 테스트)
CREATE TABLE TEMP_MEM AS SELECT MEM_ID,MEM_NAME,MEM_REGNO1,MEM_REGNO2,MEM_JOB,MEM_MILEAGE FROM MEMBER;
사용예) TEMP_MEM 테이블을 이용하여 마일리지가 3000이상이며 여성회원으로 구성된
뷰(V_TMEM01)을 생성하시오. 컬럼은 회원번호, 회원명, 직업, 마일리지
CREATE OR REPLACE VIEW V_TMEM01 AS SELECT MEM_ID AS 회원번호, MEM_NAME AS 회원명, MEM_JOB AS 직업, MEM_MILEAGE AS 마일리지 FROM TEMP_MEM WHERE MEM_MILEAGE>=3000 AND SUBSTR(MEM_REGNO2,1,1) IN ('2','4');
1)뷰(V_TEME01)의 내용 UPDATE->'S001'회원의 마일리지를 2500으로 변경하세요
->뷰 테이블 변경하면 원본테이블 변경된다.UPDATE V_TMEM01 SET 마일리지=2500 WHERE 회원번호='s001';
2)원본테이블(TEMP_MEM)의 내용 UPDATE->'s001'회원의 마일리지를 2500에서 7500으로 변경
->원본을 고쳤더니 뷰도 고쳐진다.UPDATE TEMP_MEM SET MEM_MILEAGE=7500 WHERE MEM_ID='s001'
SELECT *FROM TEMP_MEM;
SELECT *FROM TEMP_MEM;
사용예)TEMP_MEM 테이블을 이용하여 마일리지가 3000이상이며 여성회원으로 구성된 뷰(V_TMEM02)를 읽기전용으로 생성하시오
뷰(V_TMEM01)을 생성하시오. 컬럼은 회원번호, 회원명, 직업, 마일리지CREATE OR REPLACE VIEW V_TMEM02 AS SELECT MEM_ID AS 회원번호, MEM_NAME AS 회원명, MEM_JOB AS 직업, MEM_MILEAGE AS 마일리지 FROM TEMP_MEM WHERE MEM_MILEAGE>=3000 AND SUBSTR(MEM_REGNO2,1,1) IN ('2','4') WITH READ ONLY;
1)뷰(V_TEME02)의 내용 UPDATE->'s001'회원의 마일리지를 2500으로 변경하세요
->뷰의 값을 변경할 수 없음UPDATE V_TMEM02 SET 마일리지=2500 WHERE 회원번호='s001';
2)원본테이블(TEMP_MEM)의 내용 UPDATE->'s001'회원의 마일리지를 2500에서 7500으로 변경
->뷰를 대상X 원본테이블 대상이며 원본테이블은 얼마든지 변경 가능하다.UPDATE TEMP_MEM SET MEM_MILEAGE=2500 WHERE MEM_ID='s001';
TEMP_MEM 데이터 변경(원본테이블)
SELECT *FROM TEMP_MEM;
뷰 테이블도 변경되었다.
SELECT *FROM V_TMEM02;
사용예) TEMP_MEM테이블을 이용하여 마일리지가 3000이상인 회원들로 WITH CHECK OPTION을 갖는
뷰(V_TEME03)을 생성하시오 컬럼은 회원번호, 회원명, 직업 ,마일리지이다.CREATE OR REPLACE VIEW V_TMEM03 AS SELECT MEM_ID AS 회원번호, MEM_NAME AS 회원명, MEM_JOB AS 직업, MEM_MILEAGE AS 마일리지 FROM TEMP_MEM WHERE MEM_MILEAGE>=3000 WITH CHECK OPTION;
1)뷰(V_TMEM03)에서 'e001'회원(이혜나)의 마일리지를 6500에서 1000으로 수정
UPDATE V_TMEM03 SET 마일리지=1000 WHERE 회원번호='e001';
WITH CHECK OPTION을 썼기 때문에 조건을 맞춰야 하고 , 3000이상으로 하면 바뀐다.
UPDATE V_TMEM03 SET 마일리지=16500 WHERE 회원번호='e001';
V_TMEM03뷰가 바뀜
TEMP_MEM테이블도 같이 바뀜
2)원본테이블(TEMP_MEM)의 내용 UPDATE-> 'e001'회원의 마일리지를 2500으로 변경
->원본테이블이 변경되는것은 뷰와는 전혀 상관이없다. 그래서 원본테이블은 언제든지 어떤값으로도 변경 가능하다.UPDATE TEMP_MEM SET MEM_MILEAGE=2500 WHERE MEM_ID='e001';
728x90