<목차>
ㅇ 뷰 생성
ㅇ 뷰 수정
ㅇ 복합 뷰 생성
ㅇ 뷰에 DML 수행
(이제 2권 시작. 11장)
ㅇ VIEW 뷰
- 사용 목적
- 데이터 액세스를 제한하기 위해 : 보안과 관련된 객체야 (가장 큰 목적 : 보안 )
- 테이블은 부서 전체를 볼 수 있어. 10번 부서 사람이 굳이 20번 부서 사람 정보 볼 필요 없잖아. -> 뷰를 이용해서 10번 부서 사원의 정보만 제한해서 보여줌
- 복잡한 질의를 쉽게 작성하기 위해 : 탑 N 분석과 같은
- 데이터 독립성을 제공하기 위해
- 동일한 데이터로부터 다양한 결과를 얻기 위해
ㅇ 단순 뷰, 복합 뷰
- 테이블의 데이터 제한해서 보여주는 거니까 테이블이 있긴 해야겠지
- 단순 뷰 : 테이블 데이터가 원본 그대로
- 복합 뷰 : 변한 데이터. 변경된 데이터를 보여줌. 예) AVG(salary)
ㅇ 뷰 생성
- CREATE TABLE AS 서브쿼리와 비슷해. 테이블 대신 뷰로 하면 되는 거야
80번 부서의 정보만 가져오겠다.
CREATE VIEW empvu80
AS SELECT employee_id, last_name, salary
FROM employees
WHERE department_id = 80
- desc와 select * from empvu80 이용해서 잘 만들어졌는지 확인
사용자들은 얘가 뷰인지 테이블인지 알 방법 없어. 셀렉트 문장 똑같이 사용하면 돼
ㅇ 열 별칭 사용하여 뷰 생성
CREATE VIEW salvu50
AS SELECT employee_id ID_NUMBER, last_name NAME, salary*12 ANN_SALARY
FROM employees
WHERE department_id = 50
- 테이블의 열 자체가 아니라 salary*12로 열을 새로 만들 수도 있어
- 뷰를 제대로 잘 사용하려면 SELECT를 어떻게 잘 사용하는지가 중요해지겠지
ㅇ 컬럼 헤딩 만드는 방법 2가지 (테이블 만들 때와 동일)
- CREATE 절에 컬럼 이름 명시하는 방법
- AS 서브쿼리의 SELECT 리스트절에 알리아스 주는 방법
ㅇ 뷰와 테이블의 차이
- 뷰에 대한 질의를 수행하면 저장되어 있던 서브쿼리를 재실행시켜서 마치 데이터를 가지고 있는 것처럼 보여줌
테이블 | 뷰 |
---|
| · 가짜 테이블, 논리 테이블 |
· 물리적인 구조생성 → 저장공간 할당 | · 물리적인 구조 존재하지 않아 → 저장공간 따로 할당하지 않아 |
· 2개 영역에 테이블에 관련된 내용 저장 | |
┖ 데이터딕셔녀리 : 테이블 구조, 정보 | · 데이터 딕셔너리에는 뷰 생성할 때 사용했던 서브쿼리 문장을 텍스트로 저장 |
┖ 파일 : 실제 데이터 값 | · 실제 뷰 데이터가 아니라 |
즉, 수납공간이 있어야지만 테이블을 저장할 수 있어 | |
ㅇ 테이블과 뷰의 차이 예제
(기본 테이블 100번 사원 급여의 100일 때)
- A 테이블 : CREATE TABEL AS 서브쿼리 기능으로 12*sal을 저장
- B 뷰 : CREATE VIEW AS 서브쿼리 기능으로 12*sal을 저장
- 둘 다 100번 사원의 연봉은 1200을 보여주겠지
- 이때, 원본 테이블의 데이터가 100에서 200으로 바뀌면??
- A테이블은 독립된 테이블 만든 거라서 1200 변하지 않아
- B뷰는 서브쿼리가 재실행이 되는 거라서 2400으로 바뀜
ㅇ 뷰 조인
- 테이블과 뷰 조인, 뷰와 뷰 조인도 다 가능
- 뷰를 통해 웬만한 건 다 구해져 !
물론, 셀렉트 문장을 잘 써야 뷰도 잘 써먹을 수 있겠지
ㅇ 뷰 수정
- 테이블의 경우 구조를 가지고 있기 때문에 ALTER로 변경했었는데
- 뷰는 구조가 없기 때문에 CREATE OR REPLACE 명령문 사용
- 서브쿼리를 변경하는 것
- 새로운 서브쿼리를 덮어쓰는 것
- 현업에서 대부분 뷰 생성할 때 CREATE OR REPLACE 명령어 써
ㅇ 뷰 제거
ㅇ 복합 뷰 생성
- 복잡한 질의를 간단하게 볼 수 있게 해줘. 이 뷰만 셀렉트 * 하면 되니까
- 부서 최소, 최대 이런 거 보고 싶으면 이 뷰만 보면 되잖아~
CREATE VIEW dept_sum_vu (name, minsal, maxsal, avgsal)
AS SELECT d.department_name, MIN(e.salary), MAX(e.salary), AVG(e.salary)
FROM employees e, departments d
WHERE e.department_id = d.department_id
GROUP BY d.department_name
ㅇ 뷰를 통한 DML 작업 수행
- 단순 뷰에서 테이블의 값 그대로 보여주는 경우에만 DML 수행 가능
- 테이블의 데이터를 이용해서 뷰 만들었기 때문에
뷰 자체에 INSERT UPDATE DELETE 를 이용하면 테이블에도 수행된다.
- 근데 이거 거의 안 써!
- 뷰는 보안 측면에서 만들어진 것이기 때문에 DML 사용 거의 안 해
- 성능도 떨어지고, 보안에도 취약해지니까
- 즉, 가능은 하지만 사용하진 않아
- 보안 측면 강조하기 위해 사용하는 옵션
(서브쿼리 셀렉트 리스트절 마지막에 붙여 )
- WITH CHECK OPTION
- WITH READ ONLY : DML 작업 거부