본문 바로가기

나 취준생/SQL

SQL - 뷰

320x100

테이블은 아니고 데이터를 바라보는 쿼리문을 테이블처럼 하나의 object(객체)로 생성하자


예 : emp 테이블의 내용을 가진 emp708 생성하기

create table emp708

 as

   select empno, ename, sal, deptno

     from emp;


select * from emp708;


** as 다음에 나오는 쿼리문의 결과대로 emp708 테이블이 생성된다.




하지만 emp708은 emp와는 다른, 별개의 또 다른 테이블이다.



** emp로 시작하는 내가 만든 테이블이 뭐가 있는지 확인하는 방법


select table_name

 from user_tables

 where table_name like 'EMP%';  -->> 반드시 대문자로 작성해줘야한다.



create view emp801

 as

  select empno, ename, sal, deptno

   from emp;


** view는 table 과는 다르게 별도로 데이터를 저장하고 있지 않다.


그러면, 어떨 때 사용하나?


데이터에 접근하는 사람에게 모든 정보를 공개하지 않고, 필요한 데이터만 공개하고 싶을 때 사용한다.


예제 : 직업, 직업별 월급의 합을 출력하기


select job,sum(sal)

 from emp

 group by job;


예제 : 위의 결과를 출력하는 뷰 생성하기


create view emp403

 as

  select job,sum(sal) as 토탈

  from emp

  group by job;


이렇게 만약 as 토탈을 안 써주면 오류가 난다.


** view를 생성할 때 그룹함수를 사용하게 되면 꼭 컬럼 별칭을 달아줘야 한다.


select e.ename, e.sal, v.토탈

 from emp e, emp403 v

 where e.job=v.job;




방금 만든 view를 데려와서 조인해서 함께 출력할 수 있다.


뷰의 장점


1. 민감한 컬럼을 감춰서 데이터를 제공할 수 있다.

2. 복잡한 쿼리문을 단순하게 만들 수 있다. (조인 할 때)



뷰의 종류 2가지


1. 단순 view

2. 복합 view

 

단순 view                                          복합 view


테이블의 갯수                    1개                                              2개 이상

그룹 함수                        포함안됨                                          포함됨

DML 여부                        가능                                          불가능할 수도 있음



예제 : 이름과 부서위치를 출력하는 VIEW를 ename_loc라는 이름으로 생성하기

create view ename_loc

 as

    select e.ename, d.loc

         from emp e, dept d

          where e.deptno=d.deptno;


그 다음, ename_loc의 SCOTT의 부서 위치를 washington으로 변경하기


update ename_loc

 set loc='washington'

 where ename='SCOTT';



그럼 오류가 뜬다.

왜 오류가 뜰까?


ename_loc의 SCOTT의 위치를 washington으로 바꾸면,

dept 테이블과 연결되어있기 때문에, 원래 SCOTT과 연결된

dept의 'DALLAS'가 'washington '으로 바뀌어버리고,

DALLAS와 연결된 다른 emp 사원들도 washington으로 바뀌어버리기 때문이다.



마찬가지로 이 뷰로도 수정을 진행해보자.


select * from emp403;


SALESMAN의 월급을 2000으로 바꿔보면,


update emp403

 set 토탈 = 2000

 where job='SALESMAN';





마찬가지로 토탈 월급이라는 집계 함수가 포함되어있는 경우도 수정하려면 오류가 발생한다.

월급을 바꾸면 합계라는 컬럼의 값에도 영향이 가기 때문이다.



지금까지 만든 뷰 전체 조회하기


select view_name, text

 from user_views;




** 위와 같이 조회하면 view를 만들었을 때 사용한 테이블 명도 볼 수 있다.

그래서 외부에서 온 데이터 분석가들은 위의 쿼리를 조회할 수 있는 권한을 제한하는 경우가 많다. (권한 제한 - DCL문)



뷰 삭제하기


drop view emp809;


( 테이블 삭제할 때랑 똑같다 )

반응형

'나 취준생 > SQL' 카테고리의 다른 글

SQL - 인덱스 원리, 힌트  (0) 2020.11.11
SQL - 인덱스  (0) 2020.11.10
SQL - 임시 테이블 생성  (0) 2020.11.10
SQL - 구구단 출력하기  (0) 2020.11.10
SQL - 치환 변수 (&)  (0) 2020.11.10