빅데이터 서비스 교육/데이터베이스

데이터베이스 뷰

Manly 2022. 5. 1. 19:52
반응형

--뷰 생성: 
 - 데이터의 액세스를 제한 (보안과 관련) -> 전체가 아닌 일부분만 볼수있게
 - 복잡한 질의를 쉽게 작성하기위해
 - 데이터의 독립성 제공을 위해
 
 뷰를 통해서 테이블의 일부분을 볼때
 -테이블의 원본값 데이터일때 : 단순뷰
 -      변형된 데이터일때 : 복합뷰 (ex)salary*12, avg(sal)
 
 뷰생성
 create view 테이블 + as (서브쿼리)    로   뷰를 생성한다.
 

       테이블                                                                                   뷰
   물리적인 구조를 가지고있다.              논리(or가짜) 테이블 : 물리적인 구조가 없다.   
   (저장구조(공간)을 가지고있다)

테이블 구조->데이터 딕셔너리에 저장          뷰가 생성이 될때도 데이터 딕셔너리에 뷰 생성시 사용한 서브쿼리의 텍스트를 저장한다.
데이터 -> 저장공간에 저장                 
                                (select * from +뷰의이름)을 실행하면  테이블인것처럼 보여준다
 

테이블과 테이블 
테이블과   뷰        ->    '조인' 가능
뷰  와    뷰 


뷰는  alter 명령어가 없다  -> 뷰는 구조가 존재하지 않기때문에.

--뷰의 수정
create or replace view 테이블명 + as (서브쿼리)

--복합뷰 생성

단순뷰 일때만 dml 작업을 수행이 가능하다. 잘쓰진않음;

--뷰 제거
drop view 테이블;
-> 뷰를 제거해도 테이블은 그대로다.  (논리적 독립성)


--인라인뷰: alias    employees e 에서  e    
내가 필요로 하는 테이블이 없으니 가상의 테이블 (서브쿼리로 원하는 값을 출력)을 
만들어서 잠깐 사용하는것

ex) vol 2   p.35
    뷰를 가상의 테이블 b로   a테이블과 b의 조인을 시켜 사용한다.

select department_id, max(salary) maxsal      -> 서브쿼리는 부서별 최대 급여를 출력
from employees group by department_id;

select e.department_id, e.last_name, e.salary, b.maxsal
from employees e, (select department_id, max(salary) maxsal      
                from employees group by department_id) b
where e.department_id = b.department_id     -> 여기까지는 부서별 최대급여가 샐러리랑 같지않아서 조건추가 필요
and e.salary = b.maxsal;

데이터 분석에 파이썬, R 도 결국엔 데이터베이스에 접근해야한다.

--Top-N 분석 ->하위,상위에서 결과들을 뽑아내는데 -> rownum과 인라인뷰를 통해서 구한다.

select rownum, employee_id, salary
from employees;       
-> rownum: 출력이 된 행의 번호를 돌려주는 컬럼   출력이 되고나면 출력이 된 행의 번호를 나타내준다.

select rownum, employee_id, salary
from employees
where rownum<4;  -> 상위 3개를 구할수있다.     rownum<=  <-- 까지는 가능

select rownum, employee_id, salary
from employees
where rownum>4;  -> 결과가 없는데, 출력이 된 행의 번호를 알려주는것이기 때문


-급여를 조금받는 순서대로 출력

select rownum, employee_id, salary
from employees
where rownum<4
order by salary;

    ROWNUM EMPLOYEE_ID     SALARY
---------- ----------- ----------
         2         101      17000
         3         102      17000
         1         100      24000  로 나오는데
 
order by로 정렬 하기 전에 where절이 먼저 시작하기 때문에 원하는 결과가 나오지 않는다.  


이때 인라인뷰를 사용한다

select employee_id, salary       -> 이때 select절에서는 인라인뷰의 테이블 (가상테이블)의 컬럼들에서 데이터를 가져온다.
from (select employee_id, salary 
       from employees order by salary)
where rownum<4;
   -> 인라인뷰(가상의 테이블)에서 먼저 급여를 오름차순으로 정렬해 놓고
      하위 3개를 구한다.
  
  
문제: 부서별 평균급여가 많은 상위 3개 부서의 부서번호와 평균급여를 출력하시오
 -> 테이블생성에서 네이밍규칙, top-n분석   필요
 
select department_id, avgsal 
from (select department_id, avg(salary) as avgsal from employees
      group by department_id
      order by avg(salary) desc) 
where rownum <4;        -> 정답.
     
  
select department_id, avg(salary)  
          -> department_id와 avg(salary)는 인라인뷰에서 가져오는데   
     avg(salary)는 salary의 평균인데   인라인뷰에는 salary라는 이름의 컬럼이 없다.
 이때 테이블 명에서 ()는 쓸수없다 -> alias를 인라인뷰에서 써줘야한다.
 
from (select department_id, avg(salary) from employees
      group by department_id
      order by avg(salary) desc)
where rownum <4   -> rownum은 출력이 된 행에 부여되는데 
                    실행순서가 where가 order by보다 먼저니까
rownum의 번호가 출력이 된 행에 부여된 후 
order by로 정렬해버리면 rownum의 숫자순이 꼬이기때문에
                인라인뷰(가상테이블)를 통해 먼저 정렬 해주는것
group by department_id; (X)
 -> 이때 group by는 인라인뷰에서 이미 지정해주고 끝났기 때문에
    한번 더 그룹화 해주지 않아도 된다.

반응형