[Basic] 뷰

고보·2024년 1월 23일

1 뷰

  • 가상 테이블로서, 데이터 딕셔너리 테이블에 뷰의 정의만 저장되고, 저장공간은 할당 안된다
    => 보안과 사용자 편의성(flexibility)
    ex) 교수 테이블에서 개인정보는 가리고, 나머지는 학생들에게 제공해서 사용할 수 있게
  • 뷰에 대한 수정 결과는 기본 테이블에 적용된다 => 뷰를 정의한 기본테이블의 무결성 제약 조건 상속
  • 뷰의 종류
    • 단순 뷰(simple view): 하나의 기본 테이블에 의해 정의.
    • 복합 뷰(complex view): 두 개이상.
  • 뷰의 내부 처리 과정
    • 0 사용자가 질의(select * from v_stud_dept101 where name = '김영균')
    • 1 USER_VIEW 데이터 딕셔너리에서 v_stud_dept101 뷰의 정의 조회
    • 2 기본 테이블에 대한 뷰 접근 권한 확인
    • 3 뷰에 대한 질의를 기본 테이블에 대한 질의로 내부에서 변환
    • 4 변환된 질의로, 기본 테이블의 데이터 검색
    • 5 검색 결과 출력

2 뷰 관리

2-1 뷰 생성

CREATE [FORCE/NOFORCE] VIEW v_stud_dept101 [(기본 테이블과 칼럼 이름 칼럼 이름 지정, ...)]
AS SELECT studno, name, deptno
	FROM student
    WHERE deptno = 101;
  • grant creat view to hr 로 권한 부여해야 가능
  • FORCE NOFORCED: 후자는 기본 테이블 student가 있을 때만 생성하는 것으로, default. 전자는 없더라도 뷰 생성.
  • 복합 뷰의 경우
CREATE VIEW v_stud_dept102
AS SELECT s.studno, s.name, s.grade, d.dname 
	FROM student s, deparment d
    WHERE s.deptno = d.deptno and s.deptno 102;
  • 함수 사용해서 뷰 생성하는 경우 칼럼별명 필수
CREATE VIEW v_prof_avg_sal 
AS SELECT deptno, sum(sal) sum_sal, avg(sal) avg_sal
	FROM professor
    GROUP BY deptno;

2-2 인라인 뷰(inline view)

  • FROM 절에 참조하는 테이블이 클 때, 필요한 행과 컬럼으로 구성된 서브쿼리를 재정의해서 효율적으로 만드는 것
SELECT dname, avg_height, avg_weight
FROM (SELECT deptno, avg(height) avg_height, avg(weight) avg_weight
	FROM student
    GROUP BY deptno) s, department d
WHERE s.deptno = d.deptno;

2-3 뷰 조회

  • USER_VIEWS에 저장되어 있다. 아래는 view_name과 그 내용 조회.
SELECT view_name, text
FROM user_views;

2-4 뷰 변경

CREATE OR REPLACE VIEW v_stud_dept101
AS SELECT studno, name, deptno, grade
	FROM student
    WHERE deptno = 101;
  • 기존 뷰가 같은 이름으로 있다면 삭제하고 재생성 => 변경 결과는 USER_VIEWS에 저장

2-5 뷰 삭제

  • 기본 테이블의 구조나 데이터는 전혀 영향 없음
  • USER_VIEWS에서 저장된 뷰의 정의만 삭제(어차피 가상 테이블)
DROP VIEW v_stud_dept101;

2-6 뷰의 종류와 데이터 조작

  • 뷰의 종류에 따라 데이터 조작 가능 범위가 다르다
  • 단순 뷰(simple view): 기본 테이블의 무결성 제약조건만 적용. DML 실행 결과 기본 테이블에 반영.
  • 복합 뷰(complex view): DML 명령문 제한적 사용
    • 뷰 정의에 포함되지 않는 기본 테이블의 칼럼이 Not null 제약조건 지정
    • 뷰 정의시 표현식으로 정의된 칼럼에 대해서 UPDATE, INSERT 명령문 실행 불가능
    • 그룹함수, DISTINCT, GROUP BY 절 포함한 경우 모든 종류 DML 불가
profile
일본에서 일하는 게임 기획자. 시시해서 죽어버리지 않게, 재밌고 의미 있는 컨텐츠에 관심 있습니다. 그 도구로 데이터, AI도 찝적댑니다.

0개의 댓글