오라클 VIEW 객체

최주영·2023년 4월 12일
0

오라클

목록 보기
18/22

✅ VIEW

  • SELECT 쿼리의 실행 결과를 화면에 저장한 논리적 가상 테이블 객체
  • 사용자에게 접근이 허용된 데이터만 제한적으로 제공
  • SELECT문의 결과 RESULT SET을 하나의 테이블처럼 활용하게 하는것
  • 실제 테이블과는 다르게 실질적 데이터를 저장하고 있진 않지만 사용자는 테이블을 사용하는 것과 동일하게 사용 가능
  • 임시 작업을 위한 용도로 활용되고 사용자의 편의성을 최대화 함

✅ VIEW 특징

  • 테이블에서 유도되었기 때문에 구조가 같음
  • 가상 테이블이라 물리적으로 구현되어있지 않음
  • 데이터의 논리적 독립성 제공
  • 뷰로 필요한 데이터만 처리하므로 관리가 용이함
  • 여러 테이블을 조인하여 뷰 생성 가능

✅ VIEW 장단점

장점

  • 동일 데이터에 대해 동시에 여러 사용자 요구 지원
  • 사용자의 데이터 관리 편의성 제공
  • 접근 제어를 통한 보안제공

단점

  • 독립적 인덱스 생성 불가
  • 뷰의 정의 변경 불가
  • 삽입, 수정, 삭제 연산에 제약

✅ VIEW 종류

  • 단순 뷰(Simple View) : 하나의 테이블에서 뷰 생성
  • 복합 뷰(Complex View) : 두개 이상의 테이블을 조인하여 뷰 생성
  • 인라인 뷰(Inline View) : SELECT문의 FROM절에 기술된 SELECT 문

많은 테이블들을 조인한 복합 뷰 형태

CREATE OR REPLACE VIEW emp_view  // 뷰 생성
AS 
    SELECT employee_id, first_name, last_name, email
    FROM employees;
--   모든 정보들을 주는것이 아닌, 필요한 데이터만 요구했을 때, 필요한 데이터만 만들어서 뷰를 만듬

💡 VIEW와 WITH의 차이점
-> VIEW는 한번 생성하면 DROP할 때까지 계속 존재하며 WITH는 단일사용할 쿼리내에 정의되어 있는경우, 해당 쿼리문안에서만 실행된다.


✅ 뷰 DML, DDL 적용

CREATE [옵션] VIEW VIEW명칭 AS SELECT문

// 관리자 계정으로 계정에다가 CREATE 권한을 먼저 줘야한다!
GRANT CREATE VIEW TO 계정이름;

// 다시 권한받은 계정으로 돌아와서
CREATE VIEW V_EMP  // V_EMP라는 뷰 생성 (이미 있는 테이블 안의 내용을 복사)
AS SELECT * FROM EMPLOYEE JOIN DEPARTMENT ON DEPT_CODE = DEPT_ID;

// 부서별 직책별 급여의 평균을 구하는 SELECT 문
CREATE VIEW V_AVG_DEPTJOB
AS
SELECT DEPT_CODE, AVG(SALARY) AS AVG_SALARY FROM EMPLOYEE GROUP BY ROLLUP(DEPT_CODE)
UNION
SELECT JOB_CODE, AVG(SALARY) FROM EMPLOYEE GROUP BY ROLLUP(JOB_CODE);

SELECT * FROM V_AVG_DEPTJOB
WHERE AVG_SALARY >= 3000000 AND DEPT_CODE IS NOT NULL; 
// 평균연봉이 300만원이상이고 부서코드가 있는 것들만 출력
  • VIEW에서 (DML) UPDATE문 사용해보기
    -> 실제 테이블과 연결되어있는 컬럼을 수정 가능 , 가상컬럼은 수정 ❌
    -> 컬럼 값을 수정하면 VIEW 만들때 연결한 실제 테이블의 값도 같이 변경 됨!
// VEMP 테이블은 DEPARTMENT와 EMPLOYEE 테이블이 연결되어있어서 그 테이블의 컬럼들을 수정가능
UPDATE V_EMP SET DEPT_CODE='D3' WHERE EMP_NAME = '월드컵'; 
UPDATE V_EMP SET EMP_NAME = '최주영' WHERE EMP_NAME = '월드컵'; 
SELECT * FROM EMPLOYEE;  // VIEW가 수정됬으면 실제 테이블도 수정됨
UPDATE V_AVG_DEPTJOB SET AVG_SALARY = 10000000; // 가상 컬럼(AVG_SALARY)은 수정 불가능함
  • VIEW에서 (DML) INSERT문 사용해보기
    -> 단일 테이블로 만들어진 VIEW는 INSERT가 가능
    -> VIEW에서 값을 넣은것 이외에 컬럼에는 NULL 값을 삽입함
    -> 즉 NOT NULL 조건이 있는 컬럼들은 뷰를 생성할 때 포함해서 넣어야한다
    -> INSERT도 마찬가지로 VIEW에 값을 추가하면 실제 테이블도 값이 추가된다
CREATE VIEW V_EMPTEST  // EMPLOYEE 단일 테이블만 이용해서 VIEW 만들기
AS SELECT EMP_ID, EMP_NO, EMP_NAME, EMAIL, PHONE, JOB_CODE, SAL_LEVEL FROM EMPLOYEE;

// 단일 테이블이므로 INSERT 가능함
INSERT INTO V_EMPTEST VALUES('997','981011-1234123','홍길동','HONG@HONG.COM','12341234','J1','S1');

// V_EMP 테이블은 DEPARTMENT와 EMPLOYEE가 JOIN 된 뷰 테이블이며
// 단일테이블이 아니므로 값 삽입 불가능!
INSERT INTO V_EMP VALUES('996','홍길동','980110-1234567','HONG@HONG.COM','12345','D5','J1','S1',100
                        ,0.2,206,SYSDATE,NULL,'N','D0','되니','L3');
  • VIEW에서 (DML) DELETE문, DROP문 사용해보기
    -> DELETE 도 마찬가지로 VIEW에 값을 삭제하면 실제 테이블도 삭제 된다
DELETE FROM V_EMPTEST WHERE EMP_ID = '997';
DELETE FROM V_EMP WHERE EMP_NAME = '방명수';
DROP VIEW emp_view; // emp_view 뷰 삭제

✅ 뷰 만들 때 선택옵션

  • OR REPLACE
    -> 중복되는 VIEW 이름이 있으면 덮어쓰기를 해주는 옵션
    💡 OBJECT 명칭은 중복이 불가능
CREATE OR REPLACE VIEW V_EMP  // 테이블이 덮여쓰이게됨 (조심해서 사용해야함)
AS SELECT * FROM EMPLOYEE;
  • FORCE / NOFORCE
    -> 실제 테이블이 존재하지 않아도 VIEW 먼저 생성할 수 있게 해주는 옵션
// TT 테이블이 없는 상태로 VIEW 테이블만 생성
CREATE FORCE VIEW V_TT AS SELECT * FROM TT;
// VIEW 테이블과 연결할 비어있는 TT 테이블 생성
CREATE TABLE TT(
    TTNO NUMBER,
    TTNAME VARCHAR2(200)
);
  • WITH CHECK OPTION
    -> SELECT 문의 WHERE절에 사용한 컬럼은 수정하지 못하게 만드는 옵션
CREATE OR REPLACE VIEW V_CHECK
AS SELECT EMP_ID, EMP_NAME, SALARY, DEPT_CODE
FROM EMPLOYEE
WHERE DEPT_CODE = 'D5' WITH CHECK OPTION;  //  DEPT_CODE 컬럼은 수정하지 못함

UPDATE V_CHECK SET DEPT_CODE = 'D6' WHERE EMP_NAME = '하이유'; // 수정못함
// 하지만 다른 컬럼들은 수정 가능함!
  • WITH READ ONLY
    -> VIEW 테이블에서 수정을 불가능하게 하는 옵션 -> 읽기전용
    -> 모든 컬럼 수정, 삽입, 삭제 (DML 작업) 불가능
CREATE OR REPLACE VIEW V_CHECK
AS SELECT EMP_ID, EMP_NAME, SALARY, DEPT_CODE
FROM EMPLOYEE
WHERE DEPT_CODE = 'D5' WITH READ ONLY; // 이 VIEW 테이블에서 모든 컬럼 수정 불가능함!
profile
우측 상단 햇님모양 클릭하셔서 무조건 야간모드로 봐주세요!!

0개의 댓글