뷰(View)
뷰는 가상 테이블이다. 데이터를 담고 있는 테이블과는 달리 뷰는 쿼리만을 담고 있으며 필요시에 데이터를 동적으로 가져오다.
뷰는 주로 조인과 관련되어 많이 사용된다.
뷰의 사용 이유
- SQL 문을 재사용하기 위해
- 복잡한 SQL 작업을 단순화하기 위해 - 쿼리를 일단 작성해 두면 이 쿼리에 대한 세부 내용을 알 필요 없이 재사용하는 것이 가능하다.
- 테이블 전체가 아닌 일부만 활용하기 위해
- 데이터를 보호하기 위해 - 테이블 전체 대신 일부에서만 액세스 가능하도록 사용자를 제한할 수 있다.
- 데이터 포맷팅과 표현을 변경하기 위해 - 뷰를 사용하면 원래 데이터와는 다르게 포맷팅하고 표현하여 반환할 수 있다.
주의할 점
뷰의 규칙과 제한 사항
- 테이블과 마찬가지로 뷰의 이름은 고유해야 한다. 즉 다른 테이블이나 뷰와 동일한 이름을 가질 수 없다.
- 만들 수 있는 뷰의 수에는 제한이 없다.
- 뷰를 만들려면 보안 액세스가 필요하며 이 권한은 대개 데이터베이스 관리자에게 부여된다.
- 뷰는 중첩할 수 있다. 중첩할 수 있는 한계는 DBMS에 따라 다르며, 이러한 중첩은 쿼리의 성능을 저하시킬 수가 있다.
- 뷰는 인덱스를 사용할 수 없으며 트리거나 기본값 역시 연계하여 사용할 수 없다.
- 일부 DBMS에서는 뷰를 읽기 전용 쿼리로 취급한다. 즉 뷰를 사용하여 데이터를 조회할 수는 있으나 기반이 되는 테이블에 데이터를 입력하는 것은 불가능하다.
- 뷰는 DBMS에 따라 설정이 다르기때문에 뷰를 사용하기 전에 필수적으로 설명서를 읽어보는 것이 중요하다.
뷰 만들기
뷰의 사용
조인의 단순화
뷰의 가장 일반적인 용도는 복잡한 SQL을 숨기는 것으로, 조인과 관련되어 많이 사용된다.
CREATE VIEW ProductCustomers AS
SELECT cust_name, cust_contact, prod_id
FROM Customers, Orders, OrderItems
WHERE Customers.cust_id = Orders.cust_id
AND OrderItems.order_num = Orders.order_num;
위의 SQL 문은 ProductCustomers 라는 뷰를 생성하며 SELECT * FROM ProductCustomers 를 이용하여 조회할 수 있다.
WHERE 절의 추가
SELECT 문에 조건을 추가할 때 사용하는 WHERE 절을 뷰에서도 사용할 수 있다.
SELECT cust_name, cust_contact
FROM ProductCustomers
WHERE prod_id = 'RGAN01';
위의 쿼리가 실행되면 뷰 생성시에 이미 있던 WHERE 절에 위의 WHERE 절이 추가되어 조회된다.
재사용이 가능한 뷰 만들기
데이터의 포맷팅
위와 같이 데이터를 포맷팅하여 조회하는 경우가 많다면 필요할 때마다 열을 결합하는 것 보다, 포맷팅 된 데이터를 조회하는 쿼리를 뷰로 생성하면 쉽게 조회할 수 있다.
CREATE VIEW VendorLocations AS
SELECT PTRIM(vend_name) + ' (' + PTRIM(vend_country) + ')' AS vend_title
FROM Vendors
ORDER BY vend_name;
만약, 위의 뷰를 조회하고 싶다면 SELECT * FROM VendorLocations 문을 통해 쉽게 조회할 수 있다. 뷰를 사용하면 위의 포맷팅하는 쿼리가 포함된 복잡한 SELECT 문과 같은 결과를 얻는다.
계산 필드의 사용
특정한 주문 항목을 가져와 총 금액을 계산하는 쿼리를 단순화하는 데도 사용된다.
예를 들어, 아래와 같이 계산 필드를 사용하는 쿼리가 있다고 생각해 보자.
SELECT prod_id, quantity, item_price,
quantity * item_price AS expanded_price
FROM OrderItems
WHERE order_num = 20008;
CREATE VIEW OrderItemsExpanded AS
SELECT prod_id, quantity, item_price,
quantity * item_price AS expanded_price
FROM OrderItems
WHERE order_num = 20008;
위와 같이 뷰를 만들면 SELECT * FROM OrderItemsExpanded 문을 통해 쉽게 조회할 수 있다.
'Database > SQL' 카테고리의 다른 글
[PostgreSQL] 도메인, 인덱스, 트리거 (0) | 2016.09.26 |
---|---|
[PostgreSQL] 제약 조건 (0) | 2016.09.26 |
[PostgreSQL] 함수(Function) (1) | 2016.09.26 |
[SQL] 저장 프로시저(Procedure) (0) | 2016.09.26 |
[SQL] 연산자 (0) | 2016.09.23 |
댓글