본문 바로가기

데이터베이스(DB)/Oracle
[Oracle] 뷰(VIEW)

//뷰, VIEW

- 개념적인(논리적인) 데이터 구조

- 쿼리 문장을 뷰로 정의해서 사용하면 간단하게 사용할 수 있다.

- 데이터베이스 객체 중 하나

- 가상 테이블, 뷰 테이블 등..

- 테이블처럼 사용한다.★★★★

- SQL을 저장한 객체(select 결과셋 데이터를 저장한 객체X / select문을 저장한 객체 O)

- 호출될 때마다 저장된 SQL이 실행된다.(실시간 가상 테이블)

- 2개 이상의 테이블을 사용해서 생성 가능 > 복합뷰

- ★★★★★읽기 전용 테이블(insert, update, delete도 실행은 되지만 절대 사용 금지!!)

- 역할(목적)
    1. 쿼리 단순화 > 가독성 향상
    2. 보안 관리
    3. 쿼리를 다른 사용자(hr 등)과 공유
    4. 재사용

create view 뷰명
as
select문;
    
    
create or replace view 뷰명 > or replace는 쓰는 것을 권장
as
select문

CREATE VIEW NOTICEVIEW 
AS
    SELECT N.ID, N.TITLE, N.WRITER_ID, M.NAME WRITER_NAME, COUNT(C.ID) CNT FROM MEMBER M
    RIGHT OUTER JOIN NOTICE N ON M.ID = N.WRITER_ID
    LEFT OUTER JOIN "COMMENT" C ON N.ID = C.NOTICE_ID
    GROUP BY N.ID, N.TITLE, N.WRITER_ID, M.NAME;
    
SELECT * FROM NOTICEVIEW WHERE TITLE LIKE '%J%';

create or replace view 대여체크
as
select 
    m.name as mname,
    v.name as vname,
    to_char(r.rentdate, 'yyyy-mm-dd') as rentdate,
    case
        when r.retdate is not null then '반납 완료'
        else '미반납'
    end as state,
    case
        when r.retdate is null 
            then round(sysdate - (r.rentdate + (select period from tblGenre where seq = v.genre)))
    end as 연체일수,
    case
        when r.retdate is null
            then round((sysdate - (r.rentdate + (select period from tblGenre where seq = v.genre)))
                    * g.price * 0.1)
    end as 연체금 -- 대여가격(10%) x 연체일
from tblRent r
    inner join tblVideo v
        on v.seq = r.video
            inner join tblMember m
                on m.seq = r.member
                    inner join tblGenre g
                        on g.seq = v.genre
order by state asc;

select * from 대여체크;

'데이터베이스(DB) > Oracle' 카테고리의 다른 글

[Oracle] 시퀀스(Sequence)  (0) 2023.02.22
[Oracle] 제약사항  (0) 2023.02.22
[Oracle] 유니온(UNION)  (0) 2023.02.21
[Oracle] 조인(JOIN)  (0) 2023.02.21
[Oracle] 서브 쿼리  (0) 2023.02.20