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...) => 서브쿼리
'Web develop > SQL' 카테고리의 다른 글
[SQL/ORACLE] 제약조건 설명 및 사용법 (NOT NULL, UNIQUE, PK, FK, CHECK) (0) | 2019.06.15 |
---|---|
[SQL/ORACLE] TOP-N 사용 예제 (0) | 2019.06.15 |
[SQL/ORACLE] CASCADE 사용법 및 예제 (0) | 2019.06.15 |
[SQL/ORACLE] 서브쿼리 , 다중행 서브쿼리 연산자 (0) | 2019.06.15 |
[SQL/ORACLE] ORACLE JOIN & ANCI JOIN (0) | 2019.06.15 |