뷰(가상 테이블)는 물리적으로 존재하지 않는 가상의 테이블이며, 기존의 테이블이나 뷰에 대한 질의문을 이용하여 뷰를 생성할 수 있다. VIEW 와 VCLASS 는 동의어로 사용된다.
CREATE VIEW 문을 이용하여 뷰를 생성한다. 뷰 이름 작성 원칙은 식별자 를 참고한다.
CREATE [OR REPLACE] {VIEW | VCLASS} <view_name>
[ <subclass_definition> ]
[ ( <view_column_def_comma_list> ) ]
[ CLASS ATTRIBUTE
( <column_definition_comma_list> ) ]
[ METHOD <method_definition_comma_list> ]
[ FILE <method_file_comma_list> ]
[ INHERIT <resolution_comma_list> ]
[ AS <select_statement> ]
[ WITH CHECK OPTION ]
<view_column_definition> ::= <column_definition> | <column_name>
<column_definition> :
column_name column_type [ <default_or_shared> ] [ <column_constraint_list>]
<default_or_shared> :
{SHARED [ <value_specification> ] | DEFAULT <value_specification> } |
AUTO_INCREMENT [ (seed, increment) ]
<column_constraint> :
NOT NULL | UNIQUE | PRIMARY KEY | FOREIGN KEY REFERENCES...
<subclass_definition> :
{ UNDER | AS SUBCLASS OF } table_name_comma_list
<method_definition> :
[ CLASS ] method_name
[ ( [ argument_type_comma_list ] ) ]
[ result_type ]
[ FUNCTION function_name ]
<resolution> :
[ CLASS ] { column_name | method_name } OF superclass_name
[ AS alias ]
OR REPLACE : CREATE 뒤에 OR REPLACE 키워드가 명시되면, view_name 이 기존의 뷰와 이름이 중복되더라도 에러를 출력하지 않고 기존의 뷰를 새로운 뷰로 대체한다.
view_name : 생성하려는 뷰의 이름을 지정한다. 뷰의 이름은 데이터베이스 내에서 고유해야 한다.
AS select_statement : 유효한 SELECT 문이 명시되어야 한다. 이를 기반으로 뷰가생성된다.
WITH CHECK OPTION : 이 옵션이 명시되면 select_statement 내 WHERE 절에 명시된 조건식을 만족하는 경우에만 업데이트 또는 삽입이 가능하다. 조건식을 위반하는 가상 테이블에 대한 갱신을 허용하지 않기 위해서 사용한다.
예제
CREATE TABLE a_tbl(
id INT NOT NULL,
phone VARCHAR(10));
INSERT INTO a_tbl VALUES(1,'111-1111'), (2,'222-2222'), (3, '333-3333'), (4, NULL), (5, NULL);
--creating a new view based on AS select_statement from a_tbl
CREATE VIEW b_view AS SELECT * FROM a_tbl WHERE phone IS NOT NULL WITH CHECK OPTION;
SELECT * FROM b_view;
id phone
===================================
1 '111-1111'
2 '222-2222'
3 '333-3333'
--WITH CHECK OPTION doesn’t allow updating column value which violates WHERE clause
UPDATE b_view SET phone=NULL;
ERROR: Check option exception on view b_view.
--creating view which name is as same as existing view name
CREATE OR REPLACE VIEW b_view AS SELECT * FROM a_tbl ORDER BY id DESC;
--the existing view has been replaced as a new view by OR REPLACE keyword
SELECT * FROM b_view;
id phone
===================================
5 NULL
4 NULL
3 '333-3333'
2 '222-2222'
1 '111-1111'
다음의 조건을 만족한다면 해당 뷰를 업데이트할 수 있다.
뷰가 위의 규칙을 모두 충족해도, 해당 뷰의 다음과 같은 칼럼은 업데이트할 수 없다.
뷰에 정의된 칼럼이 업데이트 가능하더라도 FROM 구문에 포함된 테이블에 대해 업데이트를 위한 적절한 권한이 있어야 하며 뷰에 대한 접근 권한이 있어야 한다. 뷰에 접근 권한을 부여하는 방법은 테이블에 접근 권한을 부여하는 방식과 동일하다. 권한 부여에 대한 자세한 내용은 권한 부여 를 참조한다.
ALTER VIEW 문에 ADD QUERY 절을 사용하여 뷰의 질의 명세부에 질의를 추가할 수 있다. 뷰 생성 시 정의된 질의문에는 1이 부여되고, ADD QUERY 절에서 추가한 질의문에는 2가 부여된다.
ALTER [ VIEW | VCLASS ] view_name
ADD QUERY select_statement
[ INHERIT resolution [ {, resolution }_ ] ]
resolution :
{ column_name | method_name } OF superclass_name [ AS alias ]
예제
SELECT * FROM b_view;
id phone
===================================
1 '111-1111'
2 '222-2222'
3 '333-3333'
4 NULL
5 NULL
ALTER VIEW b_view ADD QUERY SELECT * FROM a_tbl WHERE id IN (1,2);
SELECT * FROM b_view;
id phone
===================================
1 '111-1111'
2 '222-2222'
3 '333-3333'
4 NULL
5 NULL
1 '111-1111'
2 '222-2222'
ALTER VIEW 문에 AS SELECT 절을 사용하여 가상 테이블에 정의된 SELECT 질의를 변경할 수 있다. 이는 CREATE OR REPLACE 문과 유사하게 동작한다. ALTER VIEW 문의 CHANGE QUERY 절에 질의 번호 1을 명시하여 질의를 변경할 수도 있다.
ALTER [ VIEW | VCLASS ] view_name AS select_statement
예제
ALTER VIEW b_view AS SELECT * FROM a_tbl WHERE phone IS NOT NULL;
SELECT * FROM b_view;
id phone
===================================
1 '111-1111'
2 '222-2222'
3 '333-3333'
ALTER VIEW 문의 CHANGE QUERY 절을 사용하여 뷰 질의 명세부에 정의된 질의를 변경할 수 있다.
ALTER [ VIEW | VCLASS ] view_name
CHANGE QUERY [ integer ] select_statement [ ; ]
예제
--adding select_statement which query number is 2 and 3 for each
ALTER VIEW b_view ADD QUERY SELECT * FROM a_tbl WHERE id IN (1,2);
ALTER VIEW b_view ADD QUERY SELECT * FROM a_tbl WHERE id = 3;
SELECT * FROM b_view;
id phone
===================================
1 '111-1111'
2 '222-2222'
3 '333-3333'
4 NULL
5 NULL
1 '111-1111'
2 '222-2222'
3 '333-3333'
--altering view changing query number 2
ALTER VIEW b_view CHANGE QUERY 2 SELECT * FROM a_tbl WHERE phone IS NULL;
SELECT * FROM b_view;
id phone
===================================
1 '111-1111'
2 '222-2222'
3 '333-3333'
4 NULL
5 NULL
4 NULL
5 NULL
3 '333-3333'
ALTER VIEW 문의 DROP QUERY 예약어를 이용하여 뷰 질의 명세부에 정의된 질의를 삭제할 수 있다.
예제
ALTER VIEW b_view DROP QUERY 2,3;
SELECT * FROM b_view;
id phone
===================================
1 '111-1111'
2 '222-2222'
3 '333-3333'
4 NULL
5 NULL
뷰는 DROP VIEW 문을 이용하여 삭제할 수 있다. 뷰를 삭제하는 방법은 일반 테이블을 삭제하는 방법과 동일하다.
DROP [ VIEW | VCLASS ] view_name [ { ,view_name , ... } ]
예제
DROP VIEW b_view;
뷰의 이름은 RENAME VIEW 문을 사용하여 변경할 수 있다.
RENAME [ TABLE |CLASS | VIEW | VCLASS ] old_view_name AS new_view_name [ ; ]
예제
다음은 game_2004 뷰의 이름을 info_2004 로 변경하는 예제이다.
RENAME VIEW game_2004 AS info_2004;