본문 바로가기
Database/SQL

[SQL] 뷰(View)

by 혀나Lee 2016. 9. 23.

뷰(View)

뷰는 가상 테이블이다. 데이터를 담고 있는 테이블과는 달리 뷰는 쿼리만을 담고 있으며 필요시에 데이터를 동적으로 가져오다.

뷰는 주로 조인과 관련되어 많이 사용된다.

뷰의 사용 이유

  • SQL 문을 재사용하기 위해
  • 복잡한 SQL 작업을 단순화하기 위해 - 쿼리를 일단 작성해 두면 이 쿼리에 대한 세부 내용을 알 필요 없이 재사용하는 것이 가능하다.
  • 테이블 전체가 아닌 일부만 활용하기 위해
  • 데이터를 보호하기 위해 - 테이블 전체 대신 일부에서만 액세스 가능하도록 사용자를 제한할 수 있다.
  • 데이터 포맷팅과 표현을 변경하기 위해 - 뷰를 사용하면 원래 데이터와는 다르게 포맷팅하고 표현하여 반환할 수 있다.
뷰는 테이블과 같은 방법으로 사용할 수 있다. SELECT 문을 수행하거나 필터링 또는 정렬도 가능하고, 다른 뷰나 테이블과 조인하거나 데이터 추가 및 업데이트도 가능하다. 추가와 업데이트의 경우 약간의 제한이 있다.
여기서 중요한 점은 뷰는 어딘가에 저장된 데이터에 대한 '보기(view)'라는 것이다. 뷰는 자체적으로 아무런 데이터를 포함하지 않으며 단지 다른 테이블에서 데이터를 가져와 보여준다.

주의할 점

뷰는 데이터를 포함하지 않기 때문에 뷰를 볼 때마다 쿼리를 실행하여 데이터를 가져오는 작업이 실행된다. 여러 조인과 필터를 사용하여 복잡한 뷰를 만들거나 뷰를 중첩하면 성능이 떨어질 수 있다.

뷰의 규칙과 제한 사항

  • 테이블과 마찬가지로 뷰의 이름은 고유해야 한다. 즉 다른 테이블이나 뷰와 동일한 이름을 가질 수 없다.
  • 만들 수 있는 뷰의 수에는 제한이 없다.
  • 뷰를 만들려면 보안 액세스가 필요하며 이 권한은 대개 데이터베이스 관리자에게 부여된다.
  • 뷰는 중첩할 수 있다. 중첩할 수 있는 한계는 DBMS에 따라 다르며, 이러한 중첩은 쿼리의 성능을 저하시킬 수가 있다.
  • 뷰는 인덱스를 사용할 수 없으며 트리거나 기본값 역시 연계하여 사용할 수 없다.
  • 일부 DBMS에서는 뷰를 읽기 전용 쿼리로 취급한다. 즉 뷰를 사용하여 데이터를 조회할 수는 있으나 기반이 되는 테이블에 데이터를 입력하는 것은 불가능하다.
  • 뷰는 DBMS에 따라  설정이 다르기때문에 뷰를 사용하기 전에 필수적으로 설명서를 읽어보는 것이 중요하다.

뷰 만들기

뷰를 생성할 때는 테이블을 생성하는 것과 마찬가지로 CREATE VIEW 문을 사용하면 된다. 

뷰의 사용

조인의 단순화

뷰의 가장 일반적인 용도는 복잡한 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 절이 추가되어 조회된다.

재사용이 가능한 뷰 만들기

뷰를 사용하면 복잡한 쿼리를 미리 만들어 놓고 뷰를 통해 편리하게 사용할 수 있다. 하지만 뷰는 특정한 데이터에만 한정되지 않게 만드는 것이 좋다. 예를 들어 앞서 만든 뷰는 RGAN01 뿐만 아니라 모든 제품에 대해 사용할 수 있다. 뷰의 범위를 넓히면 재사용 가능성도 늘어나며 그만큼 더 유용해진다. 또한 유사한 여러 뷰를 만들어야 하는 수고도 덜 수 있다.

데이터의 포맷팅

SELECT 문을 사용하다 보면 데이터의 포맷을 지정하는 경우가 있다. (DBMS 마다 연산자의 종류가 다르니 주의.)
SELECT PTRIM(vend_name) + ' (' + PTRIM(vend_country) + ')' AS vend_title
FROM Vendors
ORDER BY vend_name;


위와 같이 데이터를 포맷팅하여 조회하는 경우가 많다면 필요할 때마다 열을 결합하는 것 보다, 포맷팅 된 데이터를 조회하는 쿼리를 뷰로 생성하면 쉽게 조회할 수 있다.

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

댓글