[MSSQL 뷰(VIEW) 사용하기 - 기초]
뷰(View)는 가상의 테이블로서 실제 존재하는 테이블이 아닌 동적으로 데이타를 가져올 쿼리문의 집합입니다. (SQL2000 부터 추가된 인덱스된 뷰는 예외) 뷰를 만들었을때 실제로 저장되는 것은 SELECT 이하의 쿼리문 이라 생각하시면 됩니다.
뷰를 왜 사용하는가?
관계형 데이타베이스에서 잘 설계된 테이블들은 여러조각으로 분리되어, 저장공간의 효율성 및 조작의 간소화 등 여러가지 잇점을 가져오게 됩니다. ( 테이블 하나에 수백개의 컬럼이 존재하고 이를 조작한다고 생각해 보십시요 ) 이렇게 분리된 테이블에서 필요한 데이타를 추출해서 가져오는 방법이 바로 조인(JOIN)인데 참여하는 테이블이 여러개이고, 가져올 컬럼에 여러가지 조작이 필요하다면 쿼리문 자체가 길어지고 가독성도 상당히 떨어질 것은 너무도 당연한 이치입니다. 아래의 예를 보겠습니다.
SELECT TOP 5 cus_gubun1,cus_name, CASE WHEN Len(source_addr) > 14 THEN substring( source_addr, charIndex( space(1), source_addr ) + 1, charIndex( space(1), source_addr, charIndex( space(1), source_addr, charIndex(space(1), source_addr) + 1) + 1) - charIndex( space(1), source_addr ) - 1 ) ELSE '잘못된 주소' END as source_addr, CASE WHEN Len(dest_addr) > 14 THEN substring( dest_addr, charIndex( space(1), dest_addr ) + 1, charIndex( space(1), dest_addr, charIndex( space(1), dest_addr, charIndex(space(1), dest_addr) + 1) + 1) - charIndex( space(1), dest_addr ) - 1 ) ELSE '잘못된 주소' END as dest_addr, cus_year + '-' + cus_month + '-' +cus_day as cusymd, CASE WHEN cus_finish = 'N' THEN '신규' ELSE '완료' END as cus_finish, cus_idate FROM customer a INNER JOIN cus_corp b ON a.cus_no = b.cus_no WHERE cus_gubun1 = '3' ORDER BY cus_idate DESC | |
위의 쿼리문은 customer와 cus_corp 라는 불과 두개의 테이블이 조인에 참여하지만, 우편번호와 함께 입력된 주소컬럼 (source_addr,dest_addr)에서 스페이스 값의 3번째 위치값을 반환해서 substring 으로 잘라내고, CASE 문을 이용해서 주소컬럼의 값이 14자리 미만이면 '잘못된 주소'를 출력하려다 보니 상당히 가독성이 떨어지는 쿼리문이 되어버렸습니다. 물론 주소컬럼을 잘게 분할하여 설계하였다면 쿼리문은 상당히 깔끔해 질것입니다. 조금 길어 보이는 쿼리문이지만 SELECT 해오는 컬럼은 cus_gubun1, cus_name, source_addr, dest_addr... 등 7개에 불과합니다. 뷰는 이와같은 쿼리 문을 깔금하게 처리할수 있게 해줍니다.
예제 하나로 뷰를 왜 사용하는지 한방에 처리할려고 했더니 몇가지 부족한 점이 있어서 정리 해보도록 하겠습니다.
뷰를 사용하는 이유 1. 복잡한 쿼리문을 단순화하기 위해서 2. 테이블 전체가 아닌 필요한 컬럼만 노출시킬 필요가 있을때... 3. 컬럼의 조작을 통한 데이타의 포맷팅을 변경하고자 할때... 4. 쿼리문을 재사용하기 위해서,... 5. 네트워크 트래픽을 절감하기위해서 ( 긴 쿼리문 보다는 뷰를 이용해 축약되 쿼리문이 네트워크 트래픽의 절감을 가져 옵니다, 이 부분은 사용자가 많을때 확실한 차이가 나타나는 부분입니다. ) | |
뷰 만들기
뷰는 CREATE VIEW 문을 이용해서 만듭니다. 뷰를 생성하는 기본형식은 아래와 같습니다.
CREATE VIEW [ < database_name > . ] [ < owner > . ] view_name [ ( column [ ,...n ] ) ] [ WITH < view_attribute > [ ,...n ] ] AS select_statement [ WITH CHECK OPTION ] | |
view_name : 뷰의 이름입니다. 테이블과 마찬가지로 데이타베이스 내에서 고유해야 합니다. column [ ,...n] : 이부분은 뷰에 사용된 SELECT 이하의 문장에서 산술식이나, 기타 컬럼의 조작으로 컬럼의 이름이 없을때 뷰에서 그 컬럼의 이름을 적어서 사용하는 것입니다. 아래의 예를 보시면 이해가 빠르실 것입니다.
CREATE VIEW viewTEST AS SELECT count(*) FROM customer
위의 문장을 실행시키면 다음과 같은 에러가 출력됩니다. "1 열에 대해 열 이름이 지정되지 않아서 뷰 또는 함수를 만들지 못했습니다." column [ ,...n ]은 이럴때 아래와 같이 사용됩니다.
CREATE VIEW viewTEST ( record_count ) AS SELECT count(*) FROM customer
record_count 부분이 뷰이름 옆의 컬럼명입니다. 위의 문장을 아래와 같이 수정한다면 뷰이름 옆에 컬럼명을 사용할 필요가 없습니다.
CREATE VIEW viewTest AS SELECT count(*) as record_count FROM customer
select_statement : 뷰에 사용될 select 이하의 문장입니다.
WITH CHECK OPTION : 뷰를 만들거나 수정시 이 옵션을 체크하면 뷰에서 정의한 범위외로 데이타가 변경되는 것을 금지합니다.
위의 CREATE VIEW 문을 이해하기 쉽게 단순화 시켜보면 아래와 같습니다.
--단순화 시킨 CREATE VIEW 구문 CREATE VIEW 뷰의이름 ( 컬럼명,... ) AS SELECT 문 ......... | |
그럼 CREATE VIEW 문을 이용해서 가독성이 떨어지는 첫번째 예제를 뷰로 만들어 보겠습니다.
CREATE VIEW viewCustomer AS SELECT TOP 5 cus_gubun1,cus_name, CASE WHEN Len(source_addr) > 14 THEN substring( source_addr, charIndex( space(1), source_addr ) + 1, charIndex( space(1), source_addr, charIndex( space(1), source_addr, charIndex(space(1), source_addr) + 1) + 1) - charIndex( space(1), source_addr ) - 1 ) ELSE '잘못된 주소' END as source_addr, CASE WHEN Len(dest_addr) > 14 THEN substring( dest_addr, charIndex( space(1), dest_addr ) + 1, charIndex( space(1), dest_addr, charIndex( space(1), dest_addr, charIndex(space(1), dest_addr) + 1) + 1) - charIndex( space(1), dest_addr ) - 1 ) ELSE '잘못된 주소' END as dest_addr, cus_year + '-' + cus_month + '-' +cus_day as cusymd, CASE WHEN cus_finish = 'N' THEN '신규' ELSE '완료' END as cus_finish, cus_idate FROM customer a INNER JOIN cus_corp b ON a.cus_no = b.cus_no ORDER BY cus_idate DESC | |
위와 같이 뷰를 만들었다면 SELECT 문은 아래와 같이 단순해 집니다.
SELECT cus_gubun1, cus_name, source_addr, dest_addr, cusymd, cus_finish, cus_idate FROM viewCustomer WHERE cus_gubun1 = '3' | |
뷰 수정하기
이미 만들어진 뷰에 대해 수정할 부분이 있다면 CREATE 명령어 대신 ALTER 명령어를 사용하시면 됩니다.
--단순화 시킨 ALTER VIEW 구문 ALTER VIEW 뷰의이름 AS SELECT 문 ......... | |
뷰 삭제하기
뷰의 삭제는 DROP 명령어를 사용합니다.
--DROP VIEW 구문 DROP VIEW 뷰의이름 | |
작성자: 다자래(mfcchang@naver.com) 웹제작 토탈 커뮤니티 http://www.webmadang.net | | |