Web develop/SQL

[SQL/ORACLE] VIEW 형식 및 사용법

ForA 2019. 6. 15. 20:41
728x90

VIEW : 물리적인 테이블을 근거한 논리적인 가상테이블
(가상: 실질적으로 데이터를 저장하고 있지 않는다.)
⇒ 독립적인 테이블은 아니다

  • 기본테이블에 대한 하나의 쿼리문(text를 저장하는 객체)

  • 자주 사용되는 복잡하고 긴 쿼리문을 저장하는 객체

  • 특정컬럼만 보여지게끔 하여 보안을 목적으로 사용. 제한적인 데이터 조회

  • 뷰는 기준테이블을 참조하는(바라보는) 논리적인 테이블이기에 기준테이블 수정시
    같이 변동된다.

형식  
CREATE VIEW 뷰이름;

옵션  
CREATE \[OR REPLACE\] \[FORCE|NOFORCE\] VIEW 뷰이름 \[별명\] AS SELECT\_statement  
\[WITH CHECK OPTION \[CONSTRAINT 제약명\]\]  
\[WITH READ ONLY \[CONSTRAINT 제약명\]\];
  • OR REPLACE : 존재하지 않는 뷰는 새로 생성하고 존재하는 뷰의 경우에는 text내용만 변경

  • FORCE | NOFORCE : 강제 실행

  • WITH READ ONLY : DML 불가능, 뷰만 사용가능

  • WITH CHECK OPTION: 조건식에 위반되는 추가, 수정을 제한함

--FROM view를 통해 조회  
CREATE VIEW emp\_copy AS SELECT \* FROM emp;  
SELECT empno, ename, sal, deptno FROM emp\_copy WHERE deptno=30;

--추가는 emp(Table)에서, 조회는 emp\_copy(view)  
INSERT INTO emp(empno, ename, sal, deptno) VALUES (8000,'홍길',3000,30);

--뷰 삭제  
DROP VIEW emp\_copy;

--테이블 행 삭제  
CREATE VIEW emp30 AS SELECT empno, ename, sal FROm emp WHERE deptno=30;  
DELETE FROM emp WHERE empno=8000;

--OR REPLACE  
CREATE OR REPLACE VIEW emp30  
AS SELECT empno, ename, sal FROm emp WHERE deptno=30;

-- abc테이블(존재하지 않는 테이블)의 모든 컬럼을 조회하는 뷰 생성  
CREATE OR REPLACE VIEW abc\_view AS SELECT \* FROM abc;  
-- 에러발생. 존재하지않는 뷰

CREATE OR REPLACE FORCE VIEW abc\_view AS SELECT \* FROM abc;  
-- FORCE 강제실행되어 Warning에러는 발생하지만 뷰객체는 생성

-- 뷰객체에 포함되지않은 컬럼 실행시  
SELECT mgr FROM emp30;  
-- 에러발생
  • DBMS에서는 user들이 만드는 객체에 대해 '시스템테이블'을 만들어 관리

    select view_name, text from user_views;

뷰에 대한 DML

-- 뷰를통한 삭제
DELETE FROM emp30 WHERE empno = 7900; 

-- 뷰를 통한 입력
INSERT INTO emp30 VALUES (8000,'나길',3000,30);
INSERT INTO emp30 VALUES (400,'나모',2000,20);

-- 뷰를 통한 수정
UPDATE emp30 SET sal = 9999;

-- 뷰를통한 뷰 생성
CREATE OR REPLACE VIEW emp30 
AS SELECT empno,ename,sal,deptno FROM emp_copy WHERE deptno=30;
  • WITH READ ONLY: 사용시 읽기전용. DML 불가

    CREATE VIEW emp20 AS SELECT empno, ename, sal, deptno  
    FROM emp\_copy WHERE deptno=20 WITH READ ONLY;

뷰에 별명주기

CREATE OR REPLACE VIEW emp20 (사원번호, 사원명, 급여, 부서번호) 
AS SELECT empno, ename, sal, deptno FROM emp_copy WHERE deptno=20;

--SELECT empno, ename FROM emp20;  
--> 별명지정시 컬럼명을 별명으로만 사용해야함

SELECT 사원번호, 사원명 FROM emp20;

-- ADAMS 사원 -> 10번부서로
UPDATE emp20 SET 부서번호 = 10 WHERE 사원번호 = 7876;
-- 김유신 사원을 30번부서에 추가
INSERT INTO emp20 VALUES (8004,'김유신',2000,30);
  • WITH CHECK OPTION: deptno=20(조건식)에 위반되는 추가, 수정을 제한함
CREATE OR REPLACE VIEW emp20 (사원번호, 사원명, 급여, 부서번호)  
AS SELECT empno, ename, sal, deptno FROM emp\_copy WHERE deptno=20 WITH CHECK OPTION;

--에러발생. deptno=20에 위배됨  
UPDATE emp20 SET 부서번호=10 WHERE 사원번호=7902;  
INSERT INTO emp20 VALUES (8006,'손오공',2000,30);  
--실행  
INSERT INTO emp20 VALUES(8006,'손오공',2000,20);

INLINEVIEW

  • 서브쿼리문에서 바깥쪽 SELECT문의 FROM절에 사용된 서브쿼리문

  • 내부에 사용되는 서브쿼리는 별칭이 부여, 이렇게 부여된 별칭이 뷰처럼 사용

SELECT .... => 메인쿼리  
(SELECT...) => 서브쿼리  
FROM ....(SELECT... => 서브쿼리, 인라인 뷰  
) Alias  
WHERE (SELECT...) => 서브쿼리