sub_title
 MSSQL
제   목 MSSQL 뷰(VIEW) 사용하기 - 기초
작성자 다자래 등록일 2008-07-09 18:24:02 조회수 54,281

[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
 
8
    
 
1
        list
 
※ 짧은 댓글일수록 예의를 갖추어 작성해 주시기 바랍니다.
line
reply cancel
 
번호 제목 글쓴이 추천 조회 날짜
9  [MSSQL] 기본키 제약조건의 삭제   member 수확물 0 / 0 29237 2008-07-31
8  SQL 테이블간의 차집합, 교집합 구하기   member 수확물 0 / 0 31607 2008-07-31
7  MSSQL - Outer Join 의 사용   member 다자래 0 / 0 38918 2008-07-30
6  MSSQL - Inner Join 의 사용   member 다자래 3 / 0 35734 2008-07-26
5  MSSQL - text, ntext 길이(바이트) 구하기   member 다자래 3 / 1 42548 2008-07-21
4  MSSQL - GROUP BY 를 이용한 중복 데이타 삭제 이미지   member 다자래 10 / 0 66952 2008-07-14
3  MSSQL - GROUP BY 를 이용한 중복 데이타 체크 이미지   member 다자래 16 / 4 96399 2008-07-12
2  MSSQL 뷰(VIEW) 사용하기 - 기초   member 다자래 8 / 1 54281 2008-07-09
1  MSSQL 참조키(Foreign Key) 설정하기   member 다자래 7 / 0 69681 2008-06-21
write
button [1]