1. View

- 하나 이상의 테이블을 조회하는 SELECT문을 저장한 객체를 뜻하며, Virtual table로 불린다.

- SELECT문을 저장하기 때문에 물리적 데이터를 따로 저장하지는 않는다.

/* View 예시 */
SELECT *
FROM USER_VIEWS;

 

1.1 뷰의 사용 목적

구분 설명
편리성 SELECT문의 복잡도를 완화하기 위해 사용한다.
보안성 - 테이블의 특정 열을 노출하고 싶지 않을 때 사용한다.
- 테이블의 일부 데이터 또는 조인이나 여러 함수 등으로 가공을 거친 데이터만 SELECT하는 뷰 열람 권한을 제공함으로써 불필요한 데이터 노출을 막을 수 있다.

 

1.2 뷰 생성

/* CREATE VIEW */
CREATE [OR REPLACE] [FORCE | NOFORCE] VIEW 뷰이름 (열이름1, 열이름2, ..., 열이름n)
AS (저장할 SELECT문)
[WITH CHECK OPTION [CONSTRAINT 제약조건]]
[WITH READ ONLY [CONSTRAINT 제약조건]];
요소 설명
ON REPLACE 같은 이름의 뷰가 이미 존재할 경우에 현재 생성할 뷰로 대체하여 생성한다.
FORCE 뷰가 저장할 SELECT문의 기반 테이블이 존재하지 않아도 강제로 생성한다.
NOFORCE - 뷰가 저장할 SELECT문의 기반 테이블이 존재할 경우에만 생성한다.
- 생략할 경우의 기본값이 된다.
뷰 이름 - 생성할 뷰 이름을 지정한다.
- 필수값이다.
열 이름 SELECT문에 명시된 이름 대신 사용할 열 이름을 지정한다.
저장할 SELECT문 - 생성할 뷰에 저장할 SELECT문을 지정한다.
- 필수값이다.
WITH CHECK OPTION 지정한 제약 조건을 만족하는 데이터에 한해 DML 작업이 가능하도록 뷰를 생성한다.
WITH READ ONLY 뷰의 열람, 즉 SELECT만 가능하도록 뷰를 생성한다.

- CREATE문으로 생성할 수 있다.

/* CREATE VIEW 예시 */
CREATE VIEW VW_EMP20
AS (SELECT EMPNO, ENAME, JOB, DEPTNO
	FROM EMP
	WHERE DEPTNO=20);

 

1.3 뷰 삭제

- DROP문을 사용해서 뷰를 삭제할 수 있다.

- 뷰는 실제 데이터가 아닌 SELECT문만 저장하므로 뷰를 삭제해도 테이블이나 데이터가 삭제되지는 않는다.

/* DROP VIEW 예시 */
DROP VIEW VW_EMP20;

 

2. Inline view를 사용한 TOP-N SQL문

- Inline view와 ROWNUM을 사용하면 ORDER BY절을 통해 정렬된 결과 중 최상위 몇 개 데이터만을 출력하는 것이 가능하다.

/* Inline view로 TOP-N 추출 예시 : Subquery 사용 */
SELECT ROWNUM, E.*
FROM (SELECT *
	FROM EMP
	ORDER BY SAL DESC) E
WHERE ROWNUM <= 3;

/* Inline view로 TOP-N 추출 예시 : WITH절 사용 */
WITH E AS (SELECT * FROM EMP ORDER BY SAL DESC)
SELECT ROWNUM, E.*
FROM E
WHERE ROWNUM <= 3;

 

2.1 Pseduo Column

- 데이터가 저장되는 실제 테이블에 존재하지는 않지만 특정 목적을 위해 테이블에 저장되어 있는 열처럼 사용 가능한 열을 의미한다.

- 오라클에서는 ROWNUM과 ROWID가 대표적이다.

- ROWNUM의 경우 데이터를 하나씩 추가할 때 매겨지는 번호이므로 ORDER BY절을 통해 정렬해도 유지되는 특성이 있다. 때문에 TOP-N을 출력하기 위해서는 ORDER BY로 데이터를 먼저 정렬한 후에 ROWNUM을 매겨야 한다.

 

참고

- 『오라클로 배우는 데이터베이스 입문』

'Database' 카테고리의 다른 글

Synonym  (0) 2021.10.28
Sequence  (0) 2021.10.28
Index  (0) 2021.10.26
Data Dictionary  (0) 2021.10.26
DDL(Data Definition Language)  (0) 2021.10.25