물리적 테이블 근거의 논리적 가상 태이블
실질적으로 데이터를 저장하고 있지 않지만 사용자는 테이블을 사용하는 것과 동일하게 뷰를 사용할 수 있다.
특정 결과를 출력하기 위해 매번 select 문을 입력하기 변거로우니 보다 쉽게 원하는 결과를 얻기 위해 출발한 개념이다.
기본 테이블에서 파생된 객체로서 기본 테이블에 대한 하나의 쿼리문이다.
사용자에게 주어진 뷰를 통해서 기본 테이블을 제한적으로 사용하게 된다.
뷰를 생성하기 위한 실질적인 데이터를 저장하는 테이블을 '기본 테이블'이라고 한다.
(실습에서 emp, dept에 해당하는 테이블)
테이블의 내용을 복사할 때 제약조건은 복사되지 않는다.
view 를 만들 때는 create view 또는 create or replace view를 사용한다.
- 전자는 뷰의 구조를 바꾸려면 뷰를 삭제하고 다시 만들어야 한다.
- 후자는 새로운 뷰를 만들 수 있을 뿐만 아니라 기존에 뷰가 존재하더라도 삭제하지 않고 새로운 구조의 뷰로 변경 가능하다
-force
- 기본 테이블의 존재 여부에 관계없이 뷰를 생성한다.
noforce
- 기본 테이블이 존재해야만 뷰를 생성할 수 있다. 정의하지 않을 시 디폴트 값으로 사용된다.
with check option
- 해당 뷰를 통해서 볼 수 있는 범위 내에서만 update 또는 insert가 가능하다.
with read only
- 해당 뷰를 통해서 select만 가능하다.
뷰 생성 예제
create view emp_view30
as
select empno, ename, deptno
from emp_copy
where deptno = 30;
select * from emp_view30;
--select 문이 편해진다
결과
뷰에 데이터 추가 예제
insert into emp_view30
values(1111, 'aaaa', 30);
select * from emp_view30;
select * from emp_copy;
출력
뷰에 데이터를 추가하면 그것이 뷰에만 저장되는 것이 아닌, 기본 테이블에 데이터를 추가하고 뷰는 그것을 보여줄 뿐이다. 뷰는 아무런 힘이 없다. ㅠㅠ
뷰를 정의하기 위해 사용되는 기본 테이블의 수에 따라 단순 뷰(simple view)와 복합 뷰(complex view)로 나뉜다.
뷰 별칭 설정하기 예제
create or replace
view emp_view(사원번호, 사원명, 급여, 부서번호)
as
select empno, ename,sal, deptno
from emp_copy;
select * from emp_view;
결과
그룹 함수 이용해서 뷰 만들기
create view view_sal
as
select deptno, sum(sal) as "SalSum", avg(sal) as "SalAvg"
from emp_copy
group by deptno;
select * from view_sal;
결과
단순 뷰에서 DML 명령어가 사용 불가한 경우
1. 뷰 정의에 포함되지 않은 컬럼에 not null이 포함된 경우 insert 불가능
2. 산술 표현식으로 정의된 가상 컬럼이 뷰에 정의되면 insert나 update 불가능
3. 추가예정
뷰 삭제 형식
drop view view_sal;
테이블 삭제하는 것과 비슷하다.
rownum
테이블에 데이터가 insert된 순서를 보여준다. 이를 응용하여 특정 기준으로 정렬했을 때의 top n을 구할 수 있다.
rownum 컬럼 값 출력
select rowid, rownum, empno, ename, hiredate
from emp;
결과
입사일 순서로 정렬
select rownum, empno, ename, hiredate
from emp
order by hiredate asc;
결과
입사일 기준으로 정렬되어 있는 뷰를 생성
create or replace view view_hire
as
select empno, ename, hiredate
from emp
order by hiredate;
select * from view_hire;
결과
인라인 뷰로 top n 구하기
서브쿼리를 사용하는 방법이다.
select 하려는 테이블에 하나의 쿼리 대입
select rownum empno, ename, hiredate
--from 테이블로부터 select할때 rownum을 새로 정의
from (select empno, ename, hiredate
from emp
order by hiredate)
where rownum<= 5;
결과
'수업 내용 > [DB] 오라클' 카테고리의 다른 글
[DB 오라클] 15. 인덱스 (INDEX) (0) | 2023.04.27 |
---|---|
[DB 오라클] 14. 시퀀스 (0) | 2023.04.27 |
12. 제약조건 (0) | 2023.04.25 |
11. 트랜잭션 (transaction) (0) | 2023.04.25 |
10. DML (0) | 2023.04.25 |