본문 바로가기

Language/MySQL

[MySQL] 뷰 작성과 삭제

뷰(VIEW)는 테이블과 같은 부류의 데이터베이스 객체 중 하나이다.

데이터베이스 객체란 테이블이나 인덱스 등 데이터베이스 안에 정의하는 모든 것을 말한다.

반면 SELECT 명령은 객체가 아니다.

본래 데이터베이스 객체로 등록할 수 없는 SELECT 명령을 객체로서 이름을 붙여 관리할 수 있도록 한 것이 뷰이다.

 

예를 들어 앞에서 공부했던 서브 쿼리는 FROM구에서도 기술할 수 있다.

select * from (select * from sample54) sq;

 

여기서 FROM구에 기술된 서브 쿼리에 이름을 붙이고 데이터베이스 객체화하여 쓰기 쉽게 한 것을 뷰라고 한다.

뷰를 만든 후 SELECT 명령에서 뷰의 이름을 지정하면 참조할 수 있다.

select * from sample_view_67;

 

복잡한 명령으로 이루어지는 서브 쿼리를 뷰로 대체하여 SELECT 명령을 간단하게 표현할 수 있다.

즉, 자주 사용하거나 복잡한 SELECT 명령을 뷰로 만들어 편리하게 사용할 수 있다.

 

뷰는 테이블처럼 취급할 수 있지만 '실체가 존재하지 않는다'라는 의미로 '가상 테이블'이라 불리기도 한다.

SELECT 명령으로 이루어지는 뷰는 테이블처럼 데이터를 쓰거나 지울 수 있는 저장공간을 가지지 않는다.

이 때문에 테이블처럼 취급할 수 있다 해도 'SELECT 명령에서만 사용'하는 것을 권장한다.

 

[SYNTAX]
CREATE VIEW 뷰명 AS SELECT 명령
DROP VIEW 뷰명

 

뷰는 DDL로 작성 및 삭제가 가능한데 뷰를 생성할 때 AS는 별명과는 달리 생략할 수 없다.

 

또한 뷰는 필요에 따라 열을 지정할 수 있는데 이 경우 이름 뒤에 괄호로 묶어 열을 나열한다.

[SYNTAX]
CREATE VIEW 뷰명 (열명 1, 열명 2,... ) AS SELECT 명령

 

뷰의 열 지정을 생략하면 SELECT 명령의 열 정보가 수집되어 자동적으로 뷰의 열로 지정된다.

반대로 열을 지정한 경우 SELECT 명령의 열보다 우선시된다.

다만, SELECT 명령과 같은 수의 열을 일일이 지정해야 하므로 열을 지정하지 않은 편이 낫다.

또한, 열 이외에는 정의할 수 없으며, 테이블의 열을 정의할 때처럼 자료형 및 제약도 지정이 불가하다.

 

 

뷰를 삭제하게 되면 더 이상 뷰를 참조하여 사용할 수 없다.

 

 

뷰는 데이터베이스 객체로서 저장장치에 저장된다.

데이터베이스에 저장되는 것은 SELECT 명령이기 때문에 테이블처럼 대량의 저장공간이 필요하지 않는다.

뷰를 참조하면 뷰에 등록되어 있는 SELECT 명령이 실행되고,

실행 결과는 일시적으로 보존되며, 뷰를 참조할 때마다 SELECT 명령이 실행된다.

 

 

뷰에도 약점이 있는데, 

  1. 뷰의 근원이 되는 테이블에 보관하는 데이터 양이 많은 경우
  2. 집계처리를 할 때 뷰가 사용될 경우
  3. 뷰를 중첩해서 사용하는 경우

이러한 경우 처리 속도가 떨어지기 쉽다.

이와 같은 상황을 회피하기 위해 사용할 수 있는 것이 머티리얼라이즈드 뷰(Materialized View)이다.

뷰는 데이터를 일시적으로 저장했다 쿼리가 실행 종료될 때 함께 삭제되지만,

머티리얼라이즈드 뷰는 데이터를 테이블처럼 처음 참조되었을 때 저장장치에 저장해 두고 사용한다.

이후 다시 참조할 때 이전에 저장한 데이터를 SELECT 명령 없이 그대로 사용한다.

다만 뷰에 지정된 테이블의 데이터가 변경된 경우 RDBMS가 자동으로 실행하여 SELECT 명령을 재실행해 데이터를 다시 저장한다.

하지만 MySQL에서는 머티리얼라이즈드 뷰를 사용할 수 없고, Oracle과 DB2에서만 사용할 수 있다.

 

또한, 뷰를 구성하는 SELECT 명령은 단독으로 실행할 수 있어야 한다는 약점이 있다.

부모 쿼리와 어떤 식으로든 연관된 서브 쿼리의 경우 뷰의 SELECT 명령으로 사용할 수 없다.

이는 함수 테이블을 사용하여 회피할 수 있는데,

함수 테이블은 테이블을 결괏값으로 반환해주는 사용자 정의 함수이다.

함수에는 인수를 지정할 수 있기 때문에 인수의 값에 따라 WHERE 조건을 붙여 결괏값을 바꿀 수 있다.

그에 따라 상관 서브 쿼리처럼 동작이 가능하다.

 

'Language > MySQL' 카테고리의 다른 글

[MySQL] 테이블 결합 - JOIN  (0) 2022.12.20
[MySQL] 집합 연산 - UNION  (0) 2022.12.19
[MySQL] 인덱스 작성과 삭제  (0) 2022.12.13
[MySQL] 인덱스 구조  (0) 2022.11.24
[MySQL] 제약  (0) 2022.11.23