본문 바로가기
국비지원/DataBase

[DB] 11. 뷰(View)

by cosmog 2022. 11. 16.
반응형
뷰(view) 

 

  • 뷰는 개념만 잘 알면 된다.
  • 뷰는 가짜 테이블 = 가상의 테이블이다.
  • 뷰는 테이블 또는 다른 뷰를 기초로 하는 논리적테이블 이다. (실제로는 존재하지 않는 가상의 테이블)
  • select로 뽑아낸 데이터들을 쉽게 뽑아서 고정으로 보기 위해서 뷰를 만들어서 사용한다. 매번 복잡한 select구문으로 데이터를 뽑아낼 필요가 없다.

 

뷰 생성, 데이터 검색, 수정, 삭제

 

--뷰 정보의 확인
select * from emp_details_view;


💡 view는 제한적인 자료만 보기 위해 사용할 수 있는 가상테이블의 개념이다
뷰는 기본 테이블로 유도된 가상테이블 이기 때문에 필요한 컬럼만 저장해 두면 관리가 용이해집니다.
뷰는 가상테이블은 실제 데이터가 물리적으로 저장된 형태는 아닙니다
뷰를 통해서 데이터에 접근하면 원본 데이터는 안전하게 보호할 수 있다.

1️⃣ 뷰 생성

 

🔸 단일뷰

  • 하나의 테이블로 부터 뷰를 생성할 때 사용
create or replace view view_emp
as (select employee_id,
        first_name || ' ' || last_name as name,
        job_id,
        salary
    from employees
    where department_id = 60
);

select * from view_emp;

 

🔸 복합뷰

  • 두 개 이상의 테이블로부터 뷰를 생성할 때 사용
-- 여러 테이블을 조인하여 필요한 데이터만 저장하고 빠른 확인을 위해서 사용

create or replace view view_emp_dept_job
as (select 
        e.employee_id,
        first_name || ' ' || last_name as name,
        d.department_name,
        j.job_id
    from employees e
    left outer join departments d
    on e.department_id = d.department_id
    left outer join jobs j
    on e.job_id = j.job_id)
order by employee_id;

select * from view_emp_dept_job;

 

2️⃣ 뷰의 수정

-- 수정 => 새로 만들어서 덮어쓰기

create or replace view view_emp_dept_job
as (select 
        e.employee_id,
        first_name || ' ' || last_name as name,
        e.salary, -- 추가
        e.email,
        d.department_name,
        j.job_id
    from employees e
    left outer join departments d
    on e.department_id = d.department_id
    left outer join jobs j
    on e.job_id = j.job_id)
order by employee_id;

select * from view_emp_dept_job;

 

3️⃣ 뷰의 삭제

drop view view_emp_dept_job;


🔸 jog_title별 salary 평균값

  • 뷰를 이용하면 데이터를 손쉽게 조회가능하다.
-- job_title별 salary 평균값구하기.

-- 그냥 select문을 이용
select * from employees order by job_id;
select * from departments;
select * from jobs;

select j.job_title, avg(e.salary) as 평균 from jobs j
left join employees e
on j.job_id = e.job_id
group by j.job_title
order by 평균;

select job_title, avg(salary) as 평균 from (select * from employees e
left join jobs j
on e.job_id = j.job_id) a
group by job_title
order by 평균;

--------------뷰를 이용
select job_title, avg(salary) as 평균
from view_emp_dept_job
group by job_title
order by 평균;

 

뷰를 이용한 DML 연산

 

  • 뷰를 통한 DML은 제한이 많다.

 

1️⃣ 가상열 컬럼이 있다면 허용되지 않음

-- 1. 가상열 컬럼이 있다면 허용되지 않음
insert into view_emp_dept_job(name, employee_id) values('xxx', 300);

 

2️⃣원본테이블의 null을 허용하지 않는 경우 허용되지 않음

-- 2. 원본테이블의 null을 허용하지 않는 경우도 안된다.
insert into view_emp_dept_job (employee_id, salary) values(300, 10000);

 

3️⃣ join된 뷰의 경우도 허용되지 않는다.

-- 3. join된 뷰의 경우도 허용되지 않는다.
insert into view_emp_dept_job (employee_id, job_title) values(300, 'xxx');

 

4️⃣ 뷰의 옵션

 

  • 뷰의 정의에 두가지 옵션 사용이 가능하다.
  • with check option (조건 컬럼 값을 변경하지 못하게 하는 옵션)
  • with read olny(select 만 허용하는 옵션) 

 

🔸 with check option

-- with check option 조건 컬럼 제약
create or replace view view_emp_test
as (select employee_id, first_name, department_id
    from employees
    where department_id in(60,70,80)
    )
with check option;

🔸 with read only

-- with read only 읽기 전용 뷰
create or replace view view_emp_test
as (select employee_id, first_name, department_id
    from employees
    where department_id in(60,70,80)
    )
with read only;

 

인라인 뷰

 

  • 아래와 같이 사용 가능하다.

반응형