VIEW 객체

서현서현·2022년 3월 7일
0

DB, SQL

목록 보기
18/27

🍀 VIEW 객체

  • view는 테이블과 유사한 오라클 객체
  • select문의 결과가 가장 전형적인 뷰임
  • 필요한 정보가 여러 테이블에 분산되어 있는 경우
  • 특정 자료에 대한 접근을 제한하고 결과는 제공할때
(사용형식)
CREATE [OR REPLACE] VIEW 뷰이름[(컬럼list)]
AS
	SELECT;
	[WITH READ ONLY];
	[WITH CHECK OPTION];

- '(컬럼list)' : 생성된 뷰에서 사용할 컬럼명
	생략하면 뷰의 SELECT절에 사용된 컬럼의 별칭,
	또는 뷰의 SELECT절에 컬럼의 별칭이 사용되지 않았으면
	SELECT절에 컬럼명이 뷰의 컬럼명이 됨
- 'WITH READ ONLY' : 읽기전용 뷰 생성
- 'WITH CHECK OPTION' : 'SELECT 문'WHERE 조건을 
	위배하는 DML명령을 뷰를 대상으로 수행시킬 수 없음
- 'WITH READ ONLY''WITH CHECK OPTION'는 같이 사용 
	할 수 없음
  • 원본테이블이 변경되면 view에도 반영됨
  • view를 바꾸면 원본테이블이 바뀜 +(그래서 못바꾸게 하려고 WITH READ ONLY 씀)
  • WITH CHECK OPTION >> 원본 SELECT문에 정의되어진 WHERE조건절을 위배하는 DML명령어를 VIEW상대로 못쓰게함. WITH READ ONLY와 중복해서는 못씀.

(EX1) 회원테이블에서 마일리지가 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;

// 표 컬럼명 회원번호/회원명/직업/마일리지
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;
    
// 표 컬럼명 MEM_ID,MEM_NAME,MEM_JOB,MEM_MILEAGE
    CREATE OR REPLACE VIEW V_MEM01
AS
  SELECT MEM_ID,
         MEM_NAME,
         MEM_JOB ,
         MEM_MILEAGE
    FROM MEMBER
   WHERE MEM_MILEAGE>=3000;
-- 쿼리 테스트같은거 할때 복사본으로 테스트 하려고 만들어봄~
    CREATE TABLE TEMP_MEM
    AS
      SELECT MEM_ID,MEM_NAME, MEM_REGNO1,MEM_REGNO2,MEM_JOB,MEM_MILEAGE
        FROM MEMBER;

(EX2) 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');

뷰(V_TMEM01)의 내용 UPDATE -> 's001' 회원의 마일리지를 2500으로 변경하시오

UPDATE V_TMEM01
       SET 마일리지 = 2500
     WHERE 회원번호 = 's001';
     
    SELECT * FROM V_TMEM01;

MILEAGE 3000 이상의 모임인데 2500 됐으니까 해당 회원 없어짐

SELECT * FROM TEMP_MEM;
//뷰를 바꿨더니 원본테이블도 바뀌었다

(EX3) 원본테이블(TEMP_MEM)의 내용 UPDATE→ ‘s001’회원의 마일리지를 2500에서 7500으로 변경

UPDATE TEMP_MEM
SET MEM_MILEAGE = 7500
WHERE MEM_ID = 's001';

SELECT * FROM V_TMEM01;

뷰 고치면 원본 고쳐지고 원본 고치면 뷰 고쳐지ㅗㄱ

(EX4) TEMP_MEM 테이블을 이용하여 마일리지가 3000이상이며 여성회원으로 구성된 뷰(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;

(EX) 뷰(V_TMEM02)의 내용 UPDATE→’s001’회원의 마일리지를 2500으로 변경

UPDATE V_TMEM02
    SET 마일리지 =2500
    WHERE 회원번호 = 'S001';
// 얘는 뷰값 변경 불가함!

(EX) 원본테이블(TEMP_MEM)의 내용 UPDATE→’s001’회원의 마일리지를 2500으로 변경

UPDATE TEMP_MEM
    SET MEM_MILEAGE = 2500
    WHERE MEM_ID = 's001';
// 원본테이블은 변경 가능하다!!!

SELECT * FROM V_TMEM02;

(EX5)TEMP_MEM 테이블을 이용하여 마일리지가 3000이상 회원들로 WITH CHECK OPTION을 갖는 뷰(V_TMEM03)을 생성하시오.

컬럼은 회원번호, 회원명, 직업,마일리지 이다

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;

(EX) 뷰(V_TMEM03)에서 ‘e001’회원(이혜나)의 마일리지를 6500에서 1000으로 수정

UPDATE V_TMEM03
           SET 마일리지 =1000
         WHERE 회원번호 = 'e001';

UPDATE V_TMEM03
           SET 마일리지 =16500
         WHERE 회원번호 = 'e001';

UPDATE V_TMEM03
           SET 마일리지 =16500
         WHERE 회원번호 = 'e001';

  • 'WITH CHECK OPTION' : 'SELECT 문'의 WHERE 조건을
    위배하는 DML명령을 뷰를 대상으로 수행시킬 수 없음!!!!!!

(EX) 원본테이블(TEMP_MEM)의 내용 UPDATE → ‘e001’회원의 마일리지를 2500으로 변경

UPDATE TEMP_MEM
           SET MEM_MILEAGE=2500
           WHERE MEM_ID = 'e001';

원본테이블이 변경되어지는것은 뷰하고는 상관이 없으니까 뷰로 바꿈!

0개의 댓글