가상 테이블 뷰(VIEW)
테이블에 근거한 논리적인 가상 테이블. 데이터를 저장하고 있지 않더라도 테이블을 사용하는 것과 동일하게 뷰를 사용할 수 있다.
CREATE [OR REPLACE] [{FORCE | NOFORCE}] VIEW view_name
[(alias, alias, alias,...)] -- 별칭 (생략 가능)
AS subquery -- SELECT문
[WITH CHECK OPTION]
[WITH READ ONLY]; -- SELECT만 가능해진다.
뷰를 생성할 때엔 CREATE VIEW로 생성한다. AS 다음은 서브쿼리문과 유사하다. subquery에는 SELECT문을 기술하면 된다.
CREATE OR REPLACE VIEW
뷰의 구조를 바꾸려면 CREATE OR REPLACE VIEW로 뷰를 생성해야 한다. CREATE VIEW는 구조를 바꿀 수 없다.
FORCE | NOFORCE
FORCE를 사용하면 테이블 없이 뷰를 생성한다.
WITH CHECK OPTION
WITH CHECK OPTION을 사용하면 뷰를 통해 볼 수 있는 범위 내에서만 UPDATE, INSERT가 가능하다.
WITH READ ONLY
WITH READ ONLY를 사용하면 SELECT만 가능하며 INSERT, UPDATE, DELETE를 할 수 없다.
CREATE VIEW EMP_VIEW30
AS
SELECT EMPNO, ENAME, SAL, DEPTNO
FROM EMP_COPY
WHERE DEPTNO = 30;
SELECT * FROM EMP_VIEW30;
EMP 테이블의 30번 부서만 보여주는 뷰가 만들어졌다.
1. 뷰를 사용하는 이유
- 위와 같이 EMP 테이블에서 사원번호, 사원명, 부서번호만 출력되게 하는 VIEW를 생성하면 VIEW만 사용할 수 있는 유저는 VIEW에서 볼 수 있는 정보 외의 정보는 볼 수 없다. (보안 목적)
2. 단순 뷰와 복합 뷰
- 단순 뷰
하나의 테이블로 생성
그룹 함수의 사용 불가능
DISTINCT 사용 불가능
DML 사용 가능
- 복합 뷰
여러개의 테이블로 생성
그룹 함수의 사용 가능
DISTINCT 사용 가능
DML 사용 불가능
1) 단순 뷰의 별칭
CREATE OR REPLACE
VIEW EMP_VIEW(사원번호, 사원명, 급여, 부서번호) -- alias(별칭)
AS
SELECT EMPNO, ENAME, SAL, DEPTNO
FROM EMP_COPY;
SELECT * FROM EMP_VIEW;
2) 복합 뷰 만들기
CREATE VIEW EMP_VIEW_DEPT
AS
SELECT E.EMPNO, E.ENAME, E.SAL, E.DEPTNO, D.DNAME, D.LOC
FROM EMP E, DEPT D
WHERE E.DEPTNO = D.DEPTNO -- 조인
ORDER BY EMPNO DESC; -- 정렬
SELECT * FROM EMP_VIEW_DEPT;
3) 그룹함수를 사용한 단순 뷰
문제) 각 부서별 최대 급여와 최소 급여를 출력하는 뷰를 SAL_VIEW라는 이름으로 작성하라.
CREATE VIEW SAL_VIEW
AS
SELECT D.DNAME, MAX(E.SAL) MAX_SAL, MIN(E.SAL) MIN_SAL
FROM EMP E, DEPT D
WHERE E.DEPTNO = D.DEPTNO
GROUP BY D.DNAME
SELECT * FROM SAL_VIEW;
3. 뷰 삭제
DROP VIEW view_name;
뷰는 실체가 없는 가상테이블이므로 뷰를 삭제해도 뷰를 정의한 테이블의 구조나 데이터에는 영향을 주지 않는다.
4. 뷰 생성에 사용되는 다양한 옵션
1) CREATE OR REPLACE VIEW
뷰의 구조를 바꾸려면 CREATE OR REPLACE VIEW로 뷰를 생성해야 한다. CREATE VIEW는 구조를 바꿀 수 없다.
2) FORCE | NOFORCE
FORCE를 사용하면 테이블 없이 뷰를 생성한다. 지정하지 않으면 뷰의 디폴트는 NOFORCE(테이블이 있어야만 생성)
3) WITH CHECK OPTION
WITH CHECK OPTION을 사용하면 뷰를 통해 볼 수 있는 범위 내에서만 UPDATE, INSERT가 가능하다.
4) WITH READ ONLY
WITH READ ONLY를 사용하면 SELECT만 가능하며 INSERT, UPDATE, DELETE를 할 수 없다.
CREATE OR REPLACE VIEW EMP_VIEW30
AS
SELECT EMPNO, ENAME, SAL, DEPTNO
FROM EMP_COPY
WHERE DEPTNO = 30 WITH READ ONLY;
UPDATE EMP_VIEW30
SET SAL = 2000
SQL 오류: ORA-42399: cannot perform a DML operation on a read-only view
42399.0000 - "cannot perform a DML operation on a read-only view"
5. 뷰 활용하여 Top-N 구하기
1) ROWID : 레코드를 랜덤하게 접근하기 위한 논리적인 주소값
2) ROWNUM : 각 행에 대한 일련번호
SELECT ROWNUM, ENAME, DEPTNO FROM EMP;
기본적으로는 ROWNUM 순으로 나온다.
SELECT ROWNUM, ENAME, DEPTNO FROM EMP
ORDER BY ENAME
ENAME으로 정렬하면 ROWNUM의 정렬 순서가 달라진 것이 확인 가능.
3) 인라인 뷰로 구하는 TOP-N의 개념
인라인 뷰 : SELECT문의 FROM절 내부에 사용된 서브 쿼리문. 인라인 뷰는 SQL문 내부에 뷰를 정의하고 테이블처럼 사용한다.
SELECT ROWNUM, EMPNO, ENAME, HIREDATE
FROM (
SELECT EMPNO, ENAME, HIREDATE -- 인라인 뷰
FROM EMP
ORDER BY HIREDATE
)
WHERE ROWNUM <= 10
문제) 급여를 많이 받는 순서대로 5명만 출력하는 SAL_TOP5_VIEW를 작성하라.
CREATE OR REPLACE VIEW SAL_TOP5_VIEW -- 뷰 생성
(RANK, EMPNO, ENAME, SAL) -- alias
AS
SELECT ROWNUM, EMPNO, ENAME, SAL
FROM (
SELECT EMPNO, ENAME, SAL FROM EMP_COPY -- 인라인 뷰
ORDER BY SAL DESC -- 급여 내림차순은 급여가 많은 것부터 출력된다.
)
WHERE ROWNUM <= 5 -- 5명만 출력
'오라클 기초' 카테고리의 다른 글
인덱스(INDEX) (0) | 2016.01.19 |
---|---|
시퀀스(SEQUENCE): 자동 번호 발생기 (0) | 2016.01.19 |
Oracle SQL Developer에서 ERD 만들기 (1) | 2016.01.18 |
무결성 제약 조건: NotNull, Unique, PrimaryKey, ForeginKey, CASCADE (0) | 2016.01.15 |
서브쿼리: 다중행 서브쿼리와 IN, ANY, ALL 연산자 (0) | 2016.01.14 |