뷰(VIEW)는 논리적인, 가상의 테이블을 말한다.
즉, 실제 데이터를 저장하지 않고 쿼리 결과를
가상의 테이블 형태로 제공하는 논리 테이블이라고 보면 된다.
뷰는 실제 존재하는 물리 테이블로부터 생성될 수 있으며
다수의 테이블 또는 다른 뷰를 이용해서 만들 수 있다.
VIEW의 장점
VIEW는 데이터베이스의 저장 공간을 차지하지 않으면서,
또한 데이터베이스에 어떠한 영향을 주지 않으면서도
애플리케이션이 원하는 형태로 데이터에 접근할 수 있게 해준다.
또한 복잡한 쿼리나 자주 사용되는 데이터를 간단하게 조회할 수
있는 방법을 제공한다.
예를 들어, 여러 테이블을 조인하여 필요한 데이터를 가져오거나,
특정 조건에 따라 필터링된 데이터를 조회할 수 있다.
하나의 뷰에 여러 개의 테이블에 대한 데이터가 담겨 있다고 가정하면,
해당 뷰를 조회하는 간단한 SELECT문 하나로 여러 테이블의 데이터를
한 번에 조회할 수 있기 때문에 복잡하게 여러 번 테이블의 튜플을 조회하지
않고도 비교적 간소화된 방법으로 같은 데이터를 조회할 수 있는 것이다.
보안 측면에서도 중요한 역할을 할 수 있는데,
사용자에게 VIEW를 제공하여 보안이 필요한
실제 데이터에 대한 직접적인 접근을 제한하여
필요한 데이터만을 안전하게 제공할 수 있다.
VIEW의 단점
뷰는 물리적으로 존재하는 테이블이 아니므로
인덱스를 활용해서 보다 빠르게 검색할 수는 없다.
왜냐하면 인덱스는 물리적으로 저장된 데이터를
대상으로 생성되기 때문에 논리적 구성인 뷰 자체는
인덱스를 가지지 못한다.
뷰는 CREATE문으로 생성되고, DROP문으로 삭제되지만,
DDL로 생성되고 삭제되는 다른 객체와 달리
한 번 생성하면 ALTER문을 이용하여 정의를 변경할 수 없다.
ALTER문이 아니더라도 바꿀 방법이 없다.
따라서 뷰의 정의를 변경하려면 해당 뷰를 삭제하고
변경하고 싶은 내용으로 다시 뷰를 생성해야 한다.
또한 뷰의 데이터를 변경하려면 제약조건이 존재한다.
뷰의 내용에 대한 삽입, 삭제, 변경에 제약이 있다.
VIEW 생성
VIEW는 실제 테이블과 똑같이
CREATE문으로 생성하고
데이터의 내용을 확인하려면
SELECT문으로 조회한다.
기본 형태 : CREATE VIEW 뷰이름 AS SELECT 컬럼명1, 컬럼명2, ... FROM 테이블명; | |
상황 | 뷰 생성 쿼리문 |
테이블 A 전체를 뷰로 생성 |
CREATE VIEW 뷰이름 AS SELECT * FROM A ; |
테이블 A의 일부 컬럼만 뷰로 생성 |
CREATE VIEW 뷰이름 AS SELECT 컬럼명1, 컬럼명2 FROM A ; |
테이블 A와 테이블 B를 조인한 결과를 뷰로 생성 |
CREATE VIEW 뷰이름 AS SELECT * FROM A, B WHERE A.컬럼명1 = B.컬럼명1 ; |
참고로 VIEW를 생성할 때 사용되는 SELECT문에는
집합 연산자인 UNION이나 정렬을 해주는 ORDER BY절을 사용할 수 없다.
또한 컬럼명을 기술하지 않으면 SELECT문의 컬럼명이
자동으로 사용된다. 이 부분은 예시와 함께 이해할 필요가 있다.
예시1과 예시2의 두 쿼리문을 비교해보자.
//customers 테이블
CREATE TABLE customers (
customer_id INT PRIMARY KEY,
first_name VARCHAR(50),
last_name VARCHAR(50),
email VARCHAR(100),
phone VARCHAR(20)
);
//예시1 - 별도의 컬럼명 지정하여 VIEW 생성
CREATE VIEW my_view (column1, column2) AS
SELECT first_name, last_name
FROM customers;
//예시2 - 별도의 컬럼명 지정없이 VIEW 생성
CREATE VIEW my_view AS
SELECT first_name, last_name
FROM customers;
예시1과 예시2로 생성한 VIEW는
조회했을 때 같은 내용의 데이터를 생성한다.
두 쿼리문의 차이는 쿼리문 맨 첫 줄에 있는데,
예시1의 경우는 my_view 옆에 괄호로 별도의 컬럼명을 명시했다.
즉 column1은 first_name과 매칭되며, column2는 last_name과
매칭되어 VIEW를 생성한다는 의미이다.
***이때 생성되는 VIEW 테이블의 컬럼명은 column1과 column2가 된다.
예시2와 같이 별도로 지정해주지 않아도 VIEW는 생성된다.
다만 별도로 지정해주지 않았기 때문에 SELECT문에 근거하여
쓰여진 순서대로 first_name, last_name에 해당하는 VIEW를 생성한다.
만약 VIEW의 컬럼의 순서도 새로 지정해야 한다면
이를 고려해서 SELECT문을 작성하면 된다.
또한 이 경우에는 생성할 VIEW의 컬럼명이
원본 테이블인 customers의 컬럼명 first_name과 last_name을
그대로 사용한다는 점도 알아둘 필요가 있다.
컬럼명이 같으면 사용하기 더 편할 수도 있고,
상황에 따라서는 컬럼명을 다르게 해야할 경우도 있으니
예시1과 같이 뷰에 맞는 새로운 컬럼명을 지정해야 할 수도 있다.
VIEW 삭제
DROP VIEW 테이블명 [CASCADE 또는 RESTRICT] ;
DROP VIEW 테이블명; 만으로 뷰를 삭제할 수 있지만,
위와 같이 CASCADE나 RESTRICT과 같은 옵션이 존재한다.
CASCADE의 경우,
삭제하려는 VIEW를 참조하는 다른 VIEW나 테이블이 있다면
해당 VIEW나 테이블까지 연쇄적으로 삭제하라는 옵션이다.
RESTRICT의 경우,
삭제하려는 VIEW를 참조하는 다른 VIEW나 테이블이
있을 경우 삭제하려는 VIEW를 삭제하지 못하도록 제한하는 옵션이다.
데이터베이스에서 한 VIEW가 다른 VIEW를 참조한다면,
이것은 VIEW간의 의존성이 있음을 의미한다.
예를 들어, VIEW_A를 참조하는 VIEW_B가 있다고
가정해보자. 이 경우 VIEW_B는 VIEW_A에 의존하고 있다.
이 상황에서 'DROP VIEW VIEW_A RESTRICT;' 를 실행하면
데이터베이스는 VIEW_B가 아직 존재하기 떄문에 VIEW_A를
삭제하지 않고 오류를 발생시킨다.
즉, VIEW_B가 존재하여 두 VIEW 사이에 의존성이 있기 때문에
VIEW_A를 삭제할 수 없다는 것을 알려준다.
데이터베이스는 이러한 제한을 적용하여 데이터의 무결성을
보호하고 손실을 방지한다.
만약 'DROP VIEW VIEW_A CASCADE;'를 실행하면
데이터베이스는 VIEW_A를 삭제할 때, VIEW_A에 의존하고 있는
VIEW_B도 함께 삭제한다. 함께 삭제된다고 표현했지만,
명확히 말하자면 이 때 VIEW_B가 먼저 삭제되어 의존관계가 사라진 후
VIEW_A를 삭제하는 것이므로 오류가 발생하지 않는다.
만약 VIEW_B가 있고
VIEW_B가 VIEW_A에 의존하고 있는데
별도의 옵션없이 'DROP VIEW VIEW_A;'를 실행하여
VIEW_A를 삭제하려 한다면 VIEW_B가 존재하므로
VIEW_A를 삭제하려는 시도는 실패하고, 오류가 발생할 것이다.
'DB > SQL - Oracle' 카테고리의 다른 글
[SQL] DML(데이터 조작어) - select *order by* 정렬 + ASCII(아스키코드) + UNICODE(유니코드) (0) | 2024.02.16 |
---|---|
[SQL] DML(데이터 조작어) - select *group by, having* 그룹화 (0) | 2024.02.16 |
[SQL] DCL(데이터 제어어) - grant, revoke (0) | 2024.02.15 |
[SQL] 인덱스(INDEX)의 장점과 단점, 활용 방법 (0) | 2024.02.14 |
[SQL] 인덱스(INDEX)의 종류와 생성, 변경, 삭제, 조회 방법 (0) | 2024.02.13 |