티스토리 뷰

SQL

[SQL] 15. View

superkong1 2018. 2. 9. 10:21
반응형

15. View

우리가 ORACLE SQL을 다룰 때 흔히 말하는 table은 데이터베이스 객체 중에 하나로,
아래와 같은 기타 여러 객체가 있다.

오늘은 view에 대해 알아보겠다.



View

view란, table 또는 다른 view를 기반으로 하는 논리적 table이다.
자체적으로 데이터를 가지고 있는 table은 아니지만, table의 데이터를 보거나 변경할 수 있다.
처음 view를 배울 때 "다른 table을 하나 더 만들면 되는데 왜 view를 만들었을까?"라는 생각이 들었다.

view가 필요한 이유는

  • table의 열을 선택적으로 표시하므로 Data excess를 제한한다.
  • 복잡한 query를 단순하게 조회할 수 있다.
  • 특정 기준에 따라 user group에게 Data excess 권한을 부여할 수 있다.
    이정도로 들 수 있다.

view를 생성하는 코드는 아래와 같다.
create (or replace) view "view이름"
as
query문"

or replace는 기존에 동일한 이름의 view가 있다면 대체하라는 명령어로,
기존에 동일한 이름의 view가 없다면 사용하지 않아도 된다.


예제로 알아보자.

예제) emp테이블의 사원(sal), 부서번호(deptno), 월급(sal)을 가지고 있는 emp_view를 생성하시오!
create or replace view emp_view
as
select ename, deptno, sal
from emp ;

select * from emp_view ;


view를 생성할 때 컬럼명을 변경하고 싶다면(alias를 적용하고 싶다면)
as 다음에 나오는 query문에서 alias를 적용해도 되지만,
불러올 컬럼의 수와 순서를 알고 있다는 가정하에서 미리 지정해줘도 된다.

create or replace view emp_view (이름, 부서번호, 월급)
as
select ename, deptno, sal
from emp ;

생성된 view의 구조를 알고 싶다면, describe view이름으로 확인한다.
describe emp_view;

view는 기본 table의 자료를 보여주는 것이므로, 생성한 view에 DML문 사용 시
기본 테이블에도 적용이 되어 데이터가 변경된다.

update emp_view
set 부서번호=0
where 이름='BLAKE' ;

select * from emp;


만약, view에는 DML문을 적용 불가하게 하려면

  1. view 생성 시 with READ ONLY를 query문 맨 마지막에 붙여주거나,
  2. with check option으로 constraint(제약)를 사용하면 된다.

create or replace view emp_view (이름, 부서번호, 월급)
as
select ename, deptno, sal
from emp
WITH READ ONLY; 이후

update emp_view
set 부서번호=0
where 이름='BLAKE' ; 를 실행하면 아래의 오류 메세지가 뜬다.

constraint(제약)을 만드는 법에 대해서는 다음에 더 자세하게 알아보겠다.



복합 view

위에서 실행해본것을 단순 view라 하고, 이번에는 복합 view를 알아보자.
두 view의 차이점은 다음과 같다.

기본적인 차이점은 복합 view에서 DML문(insert, update, delete)은
사용할 수 없는 경우도 있다는 것이다.


예제) 이름(ename)과 부서번호(deptno), 부서위치(loc)를 출력하는 view를 생성하시오!
create or replace view emp_view
as
select e.ename, e.deptno, d.loc
from emp e, dept d
where e.deptno = d.deptno ;

select * from emp_view ;

이러한 복합 view에서 DDL문인 update를 실행해보자.
update emp_view
set loc = 'BOSTON'
where ename = 'KING';


위의 에러의 원인은 join을 할 때 1:N의 개념으로 조인이 되었기 때문이다.
이를 다시 쉽게 설명하면,
dept테이블에는 join에 사용된 deptno가 하나씩 밖에 없다.

그런데 emp테이블에는 16명 사원에 해당되는 deptno가 여러가지가 있다.
이러한 join 형태로 만든 view는 N인 emp테이블에서 가져온 데이터 ename과 deptno는 변경 가능하지만,
1인 dept테이블에서 가져온 데이터인 loc는 변경이 불가능하다.


view의 장점 중 Data excess 권한 부분은 constraint를 배울때 조금 더 자세히 알아보겠다.

=================이 글은 Markdown을 활용해 작성하였습니다=================

반응형

'SQL' 카테고리의 다른 글

[SQL] 17. index  (0) 2018.02.13
[SQL] 16. Sequence, Synonym  (0) 2018.02.12
[SQL] 14. ORACLE SQL의 Data Type  (0) 2018.02.07
[SQL] 13. 데이터 정의 언어(DDL문)  (0) 2018.02.06
[SQL] 12. 데이터 조작 언어(DML문)  (0) 2018.02.05
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함