-- ** 테이블의 컬럼은 되도록 적게(성능문제-데드락 발생가능성 높음)
1. 편의성(자주 사용하는 소스코드 저장-질의, 조인등...)
2. 보안성(숨기고자하는 내용 숨김)
create view view이름 "컬럼 목록"
as
select ...
create view viewTitle
as -- 다음절에는 select만 온다
select title_id, price from titles
select * from viewTitle -- 앞에서 선언한 뷰이름
select cast(title as char(30)) as bookTitle, price -- 타이틀이 길어서 자름
from titles
create view viewTilte2 -- 뷰 컬럼에 이름을 정해주어야 한다.
as
select cast(title as char(30)) as bookTitle, price -- as를 사용하여 이름을 지정해준다
from titles
create view viewTitle2("줄인제목", "가격") -- 컬럼에 이름을 주는 다른 방법
as
select cast(title as char(20)), price
from titles
select * from viewTitle2
where 가격 <7000 -- 이름을 바꿨을 경우 price가 아닌 바뀐 '가격'을 사용하여 질의
alter view viewTitle -- 뷰를 고칠때는 alter를 사용한다(새로 만들경우 권한이 삭제됨)
as
select title, price from titles
-- 뷰를 만들거나 고칠때 권장사항
1. dbo로 로그인한다.
2. 뷰에서 사용할 SQL문장을 먼저 작성한다
3. 먼저 작성한 문장을 실행ㅎ여 제대로 된 결과가 나타나는지 확인한다.
4. 문장앞에 "Create View dbo.뷰이름 as"를 붙인다. 컬럼이름을 준다
5. 만든 뷰를 사용할 사용자에게 권한을 준다
6. 사용자로 로그인하여 뷰에서 데이터를 가져온다. 원하던 결과인지 확인한다.
begin tran
drop view viewTitle -- 뷰를 지울때
rollback
sp_help viewTitle -- 뷰 테이블 정보보기
sp_helptext viewTitle -- 뷰 소스코드 보기
sp_depends viewTitle -- 의존하고 있는 테이블
alter view viewTitle -- 소스코드를 숨긴뒤에는 볼수 없으므로 다른곳에 저장해둔다
with encryption -- 뷰 소스코드 숨기기
as
select title_id, price from titles
-- 뷰에 대한 뷰 만들기
create view v1
as
select title_id, price *1 as VAT from viewTitle
select * from v1
begin tran
drop view viewTitle -- 뷰는 상위테이블이라해도 지워지므로
-- 뷰에대한 뷰는 만들지않는것이 좋다
commit
rollback
select * from viewtitle2
update viewtitle2 set 가격 = 가격/2 -- 원래 테이블을 수정한다.
update viewtitle2 set "줄인제목" = "줄인제목" +'a' -- 삽입에 대해는 규제
select cast(title as char(20))as title, qty, price, t.title_id
from titles t join sales s -- 조인 테이블에서 뷰가 걸려 잇으면 한쪽 테이블만 업데이트 해야한다
on t.title_id=s.title_id
create view vTitlePrice
as
select title_id, price
from titles
where price>$15.00
select * from vTitlePrice
begin tran
update vTitlePrice
set price = 10
where title_id = 'bu1032'
rollback
-- 뷰에서 사용할 수 없는 것
1. 뷰를 만들때 select into, order by, comute, compute by를 사용 할 수 없다.
2. 임시 테이블로 뷰를 만들 수 없다(데이터 없어짐)
3. 일괄처리 안에 뷰를 만들고 참조 불가(go로 분리해야함)
select * from sysobjects
where xtype= 'v' -- 뷰테이블을 가져와라(U-UserTable, P-Procedure)
select * from information_schema.views --뷰에대한 정보(권장)
-- 인덱스된 뷰(계산을 미리 저장해 두기 위한 뷰)
create view exampleView(prikey, sumColx, countColx)
with schema_binding
select prikey, sum(Colx), count_big(Colx)
from myTable
group by prikey -- 계산
go
-- 뷰안에 데이터를 만듬(다시 계산을 안하므로 속도향상에 도움
create union clustered index idx on exampleView(prikey)
select getdate() -- 비확정적 함수
select dateadd(m, 20, '2001.1.1') -- 확정적 함수(뷰에서 사용)
-- 분할된 뷰 (유니온으로 연결되며 대용량 디비에서만 사용 - 서버 3개 이상)
select orderID, productID, UnitPrice, Quantity
into tmpOd
from "Order Details"
select * from tmpOd
alter table tmpOd
add amt as UnitPrice * Quantity --amt 컬럼 추가(계산된 컬럼)
alter table tmpOd
add constraint pk_tmpod primary key
nonclustered (orderID, productID) -- 복합 키 설정
create nonclustered index idxAmt on tmpod(amt) -- 계산되어진 amt를 인덱스 추가
sp_helpindex tmpod
-- 인덱스된 컬럼 (계산된 테이블을 사용한 예-빠르기 정도)
select amt from tmpOd -- 가장 빠름
where amt <50
order by amt
select amt
from tmpOd with (index(pk_tmpod)) -- primary key를 사용
where amt <50
order by amt
select amt from tmpod whth (index(0)) --테이블 스캔(index(0))
where amt < 50
order by amt
-- 인덱스된 뷰
procuctid,
sum(unitPrice * quantity) as total
sum(quantity) as totQty
count (*) as count -- procuctid별로 갯수를 세라
select productid, sum(unitPrice * Quantity) as total,
sum(quantity) as totQty, count(*) as count
from "order details"
group by productid
create view vTotalProduct
with schemabinding -- 뷰 테이블이 지워지지 않도록 함
as
select productid, sum(unitPrice * Quantity) as Total,
sum(quantity) as totQty,
count_big(*) as count
from dbo."order details" -- dbo를 꼭 써준다
group by productid
create unique clustered index idx on vTotalProduct(productid)
select productid, sum(quantity) as totalQty --Unique 를 만들고 나서는 뷰에 데이터가 저장됨
from "order details"
group by productid
option(expand views) -- 뷰가 아닌 테이블에서 데이터를 가져옴(다른 많은 작업 시)
'연구개발 > DBA' 카테고리의 다른 글
EXEC (동적 SQL) (0) | 2010.08.02 |
---|---|
MS-SQL문 강좌 15장 (0) | 2010.08.01 |
MS-SQL문 강좌 13장 (0) | 2010.08.01 |
MS-SQL문 강좌 12장 (0) | 2010.08.01 |
MS-SQL문 강좌 11장 (0) | 2010.08.01 |