뷰란, CREATE TABLE로 정의된 실제 테이블로부터 작성되는 가상 테이블을 말합니다. 뷰는 그저 가상 테이블일 뿐이므로, 내부의 데이터는 존재하지 않습니다. 뷰는 실제 테이블을 어떻게 보여줄까를 정의한 것이라고 볼 수 있습니다.

이미 사용하고 있습니다만, CREATE TABLE에서 정의된, 데이터가 들어 있는 테이블을 실제 테이블이라고 하며, 이 실제 테이블에서 만들어지는 가상 테이블을 뷰라고 부릅니다.

뷰의 장점

뷰의 실체는 SELECT 문에 의한 쿼리를 정의한 것입니다. 뷰에 접근하면, 정의된 쿼리가 실행되며, 실제 테이블에서 필요한 데이터가 나타납니다. 또한, 뷰에서 뷰를 정의하는 것도 가능합니다. 그러므로 미리 매번 입력하는 것이 귀찮고 복잡한 쿼리를 한 번 뷰로 정의해두면, 유저와 프로그램에서는 단순한 쿼리를 실행하는 것으로 해결됩니다.

이러한 개발 노력의 경감이라고 하는 관점 이외에, 보안면에서도 장점이 있습니다. 예를 들어, 실제 테이블의 데이터 속에 일반 유저에게 보이고 싶지 않은 것이 있는 경우, 실제 데이터에 액세스 권한을 일반 유저에게 제공하는 것은 불가합니다. 그러나 보이고 싶지 않은 데이터를 제외한 뷰를 정의하는 것으로, 일반 유저에게도 실제 테이블의 데이터를 이용하게 할 수 있게 됩니다.

뷰의 작성

뷰를 작성하기 위해서 CREATE VIEW 문을 이용합니다. 기본 구조는 다음과 같습니다.

CREATE VIEW 뷰 이름 [(칼럼명, 칼럼명, .....)] AS
SELECT文
[WITH CHECK OPTION];

뷰 이름 이후에는, 추출되는 데이터의 칼럼명을 기술합니다. 칼럼명을 생략한 경우, SELECT 문에서 지정한 칼럼의 이름이 그대로 사용됩니다. SELECT 문에서 연산자를 사용한 경우와 미리 칼럼명을 지정한 경우에 명시적으로 기술하는 것입니다.

뷰 이름과 칼럼명 다음에는, AS에 이어서 SELECT 문에 의한 쿼리를 기술합니다. 이 쿼리 결과가 이 뷰의 데이터라는 것입니다. [WITH CHECK OPTION]은 뷰 갱신에 관련되는 옵션입니다. 뷰의 갱신에 대해서는 아래에서 설명합니다.

이 문장의 SQL 샘플에서 앞장까지 쓰이고 있던 수주표, 고객표, 상품표를 실제 테이블로 사용합니다. sample.21-1에서 v_수주라고 하는 이름의 뷰를 정의하고, 마지막에 뷰의 내용을 확인하고 있습니다.

/* 뷰의 작성 */
CREATE VIEW v_수주 AS
SELECT JJ.수주번호, KK.고객이름, SS.상품명,
JJ.수주개수, JJ.납품일
FROM 수주표 JJ, 고객표 KK, 상품표 SS
WHERE JJ.고객코드 = KK.고객코드
AND JJ.상품코드 = SS.상품코드;
 
/* 확인 */
SELECT JJ.수주번호, KK.고객이름, SS.상품명,
JJ.수주개수, JJ.납품일
FROM 수주표 JJ, 고객표 KK, 상품표 SS
WHERE JJ.고객코드 = KK.고객코드
AND JJ.상품코드 = SS.상품코드;

정의한 뷰에서 특정 행과 열을 출력할 수 있습니다. sample.21-2는 정의한 v_수주에서, 수주개수가 100 이상인 경우를 선택하여, 그 고객 이름과 상품명 및 수주 개수를 출력하는 것입니다.
실행결과

고객명 상품명 수용자수
──────────── ────── ───────
KUROKIYA JUICE 300
ONSIDE BEER 200
KUSHINANA BEER 150
ONSIDE WINE 110
KUROKIYA TEA 250
KUSHINANA BEER 135
KUROKIYA BEER 290
KUSHINANA BEER 175

표준규격에 대해서

표준 SQL 규격에 대해서는, SQL89부터 가능합니다. SQL92에서 CHECK OPTION, LOCAL, CASCADE의 기능 확장이 행해집니다. SQL99에서 더욱 기능 강화가 이뤄져서, 일정 조건 하에서 뷰에서 실제 표의 데이터 갱신이 가능해졌습니다. 또한 SQL89에서 뷰를 작성할 수 있는 한편, DROP 스테이트먼트가 없는 탓에 삭제할 수 없습니다.

뷰의 삭제

뷰 삭제를 할 때는, 다음과 같이 SQL문을 기술합니다. (DROP 스테이트먼트 상세)

DROP VIEW 뷰 이름;

실습 과제

  1. 다음 테이블로 이하 조건에 맞는 쿼리를 만들어봅시다.
  • 이름을 하나의 칼럼으로 만들어서 fullname으로 지정
  • Birthdate가 2001-09-01보다 이전인 경우만 표시
id first_name last_name email birthdate added
1 Bonnie Medhurst [email protected] 1999-07-26 1982-05-01 21:32:19
2 Vincenza Streich [email protected] 2006-01-30 2000-07-15 18:19:18
3 Carter Kilback do’[email protected] 1998-12-07 1998-08-14 06:13:52
4 Mariano Stroman [email protected] 1996-06-18 2008-04-06 14:43:43
5 Deondre Kerluke [email protected] 1994-04-10 2008-06-26 22:02:19
6 Gia Towne [email protected] 1988-07-13 1982-03-22 03:16:39
7 Margarett Beahan [email protected] 2008-01-22 2010-09-12 08:59:33
8 Gilda Brekke [email protected] 1981-09-18 2016-04-14 01:17:38
9 Zackary Cummerata [email protected] 2001-05-27 2003-05-23 21:18:54
10 Kory Wiegand [email protected] 2010-03-16 1992-03-22 04:14:31
11 Vinnie Zboncak [email protected] 2016-06-23 2014-12-29 20:55:25
12 Carmella Bogan [email protected] 1978-06-10 1993-01-17 08:43:08
13 Vance Rice [email protected] 1996-10-09 1999-09-14 15:27:08
14 Coleman Maggio [email protected] 1999-11-22 2001-05-01 05:42:36
15 Patricia Zieme [email protected] 1978-11-18 1987-07-21 18:44:25
16 Jada Beer [email protected] 1991-07-17 1997-10-08 09:41:57
17 Kianna Torphy [email protected] 1994-03-17 2011-11-20 20:15:40
18 Maegan Harvey [email protected] 1979-07-18 2010-10-06 20:52:03
19 Winona Welch [email protected] 1974-10-28 2010-09-02 22:05:57
20 Queen Mosciski [email protected] 1983-05-23 1985-10-09 08:51:49

CREATE VIEW scit_view AS
SELECT (first_name || last_name) AS fullname, email
FROM scit_user
WHERE birthdate < to_date('2001-09-01','YYYY-MM-DD');

SELECT fullname, email FROM scit_view;
  1. WHERE에 지정된 조건에 맞는 아이템이 원래 테이블에서 변경되면, 뷰 결과는 어떻게 됩니까?
  2. Oracle을 포함하여, 최근 데이터베이스 시스템에서 INSERT, UPDATE, DELETE가 가능합니다만, 이러한 DML 조작이 불가능한 경우를 생각해봅시다.

 

이 본문은 Techscore 원문을 가공하여 발표를 위해 준비한 자료입니다.