본문
oracle view 무작정 따라하기
# Oracle View(뷰) 의 생성 및 사용
1. VIEW 란 무엇인가?
하나 또는 하나이상의 테이블로부터 데이터의 부분집합을 논리적으로 표현하는것으로 실제 데이터를 가지고 있는것이 아니라 해당 데이타의 결과를 하나의 SQL 쿼리 정보로 가지고 있습니다.
※ VIEW는 생성시 SQL쿼리문(SELECT * FROM TABLE) 형태로 저장이 됩니다.
※ 뷰테이블이란 표현은 잘못된 표현입니다. 뷰쿼리가 맞는 표현입니다.
2. VIEW 의 장점과 단점
뷰를 사용하면 코딩 라인이 짧아지고 결과에 대한 오류 발생시 빠르게 대응 할수 있다는 장점을 갖고 있습니다. 뷰는 상수값을 받지 못합니다. 즉, parameter 값을 받을수 없어 Scan 범위를 줄일수 없습니다.
3. VIEW 사용의 목적
-. 데이터베이스 액세스를 제한하기 위함. VIEW는 선택적인 내용을 보여주기 때문에 액세스를 제한합니다.
-. 데이터의 독립성을 허용하기 위해 다양하고 빠른 조회를 위해 사용한다.
-. 테이블의 수를 줄이고 성능향상을 가져온다.
-. 복잡한 질의를 쉽게 만들어 준다.
group나 order by와 같은 복잡한 질의의 정보를 view로 저장시켜놓으면 다음부터는 VIEW의 정보만 가져오면 되므로 쉽게 사용가능합니다.
4. VIEW 사용시점
해당 프로젝트에서 관리차원이나 유지보수차원을 중요시 여긴다면 VIEW를 사용하는게 좋다.
5. VIEW의 종류
a) 단순뷰
하나의 TABLE에서 뽑아오며 함수를 사용안한다. DML(INSERT,UPDATE,DELETE)사용 가능
b) 복합뷰
하나이상의 TABLE에서 뽑아오며 함수를 사용합니다. DML(INSERT,UPDATE,DELETE)사용 불가능
사용예제)
1 2 3 4 5 6 7 8 9 | CREATE OR REPLACE VIEW AAA AS SELECT D.DNAME, MIN(E.SAL), MAX(E.SAL), AVG(E.SAL) FROM EMP E , DEPT D WHERE E.DEPTNO=D.DEPTNO GROUP BY D.DNAME; |
6. VIEW 생성하기
a) 사용방식
CREATE [OR REPLACE] VIEW VIEW_NAME AS QUERY_STRING [WITH READ ONLY];
※ 주의할점
1. QUERY_STRING 에는 ORDER BY절 빼고 모두 사용가능하다.
2. "OR REPLACE" 옵션을 사용하게되면 생성할 VIEW와 같은 VIEW_NAME이 있어도 무시하고 새로운것으로 갱신하게 됩므로 주의하여 사용해야 합니다.
3. "WITH READ ONLY" 옵션을 사용하게 되면 해당 VIEW 에 DML 언어를 사용할수 없으며 DML 언어를 사용하게되면 에러가 발생합니다.
사용예제)
1 2 3 4 5 6 | CREATE VIEW VIEW1 AS SELECT NAME, AGE, ADDRESS FROM SCHOOL WHERE NAME = '홍길동'; CREATE OR REPLACE VIEW LEE AS SELECT * FROM DEPT; |
사용예제)
1 2 3 | CREATE OR REPLACE VIEW LEE AS SELECT * FROM DEPT WITH READ ONLY; |
7. VIEW의 데이터를 수정한다면?
-. VIEW 생성후, INSERT을 하게되면 VIEW에는 안들어가지고 원본 TABLE에 입력된다.
-. VIEW 생성후, UPDATE을 하게되면 VIEW는 데이타가 없어지면서 원본 TABLE내용이 갱신된다.
-. 뷰는 실테이블을 적당히 가공하여 보여주는 역할을 합니다.
-. 실제 테이블의 자료를 보기 위한 하나의 틀 정도로 생각하시면 됩니다.
-. 뷰중에는 자료 입력,수정,삭제가 가능한 뷰도 있습니다.
-. 뷰의 자료를 수정하게 되면 실제 테이블의 자료가 수정되는 것입니다.
-. 테이블이 수정되면 뷰 또한 수정된 값을 보여줍니다.
8. VIEW 지우기
-. 사용형식 : DROP VIEW VIEW_NAME;
-. 사용예제 : DROP VIEW EXAMPLE1;
9. 생성된 VIEW 목록 확인하기
SELECT * FROM USER_OBJECTS WHERE OBJECT_TYPE='VIEW';
10. 인라인 뷰란? (Oracle 7.1 이상에서 사용가능)
SQL문에서 사용가능한 별칭을 사용하는 서브쿼리입니다. 인라인뷰는 기본 질의의 FROM절에 명명된 서브쿼리를 사용하는것과 유사합니다.
※ 단점 : 인라인뷰를 사용한다는것은 가상메모리를 더 사용한다는 것이다.
※ 대용량에서 인라인뷰를 출력항목에 사용하게되면 성능이 많이 떨어진다.
because 조회되는 건수만큼 인라인뷰가 실행되기 때문이다.
ex) SELECT (SELECT NAME FROM MEMBER) AS NAME FROM TRADE;
# oracle view 무작정 따라하기: 필자가 만들어 사용하고 있는 VIEW 예시
sample 01) quota_transactions
1 2 3 4 5 6 7 8 9 10 11 12 13 | create view quota_transaction as select dh.id as transaction_id, dh.change_date as transaction_date, op.name as vendor_name, op.loginid as vendor_id, op.cash_point as cms_id, dh.id as receipt_no, dh.charge_deposit as quota_amount, (charge_deposit*commission*0.01) as commission, dh.tax, dh.netvalue as net_amount, op2.loginid as cashier_id, op2.name as cashier_name, lo.name as location from deposit_history dh inner join operator op on dh.operator_id = op.id inner join operator op2 on dh.loginuser_id = op2.id inner join location lo on op.location_id = lo.id where dh.loginuser_id is not null; |
sample 02) sales_transactions
1 2 3 4 5 6 7 8 9 10 11 12 | create view sales_transaction as select p.id as transaction_id, p.lasttokendate as charge_date, op.loginid as vendor_id, op.name as vendor_name, vc.casherid as cashier_id, vc.name as cashier_name, lo.name as vending_station_location, p.pre_arrears, p.pre_balance, p.chargedarrears, p.chargedcredit, p.arrears, p.balance, p.contract_id, p.customer_id from prepaymentlog p inner join operator op on p.operator_id = op.id inner join vendor_casher vc on p.vendorcasher_id = vc.id inner join location lo on p.location_id = lo.id where is_canceled is null and (chargedcredit is not null and 0 <> chargedcredit) and monthlyPaidAmount is null and monthlyPaidAmount is null; |
→ 출처: https://tipland.tistory.com/6 [외로운 개발자]
댓글