– 데이터 조회 용도. sql 간단하게 하기 위해. table처럼 존재
- 모든 사용자가 전체 논리적 모델을 보는 것은 바람직하지 않다.
- 교수의 연봉을 제외한 교수의 ID, 이름, 학과이름을 알아야한다.
select ID, name, dept_name
from instructor
- 뷰는 사용자에게 특정 데이터를 숨긴다.
- 가상적인 릴레이션으로 사용자에게 보이는 릴레이션
materialized view 데이터 중복 발생. view에서 정의된 sql 따로 돌리지 않아도 됨. 빠름
# 뷰 정의
- create view 명령을 사용하여 뷰 정의
create view v as < query expression >
- <query expression> 은 적법한 질의 표현식
- 뷰의 이름은 v
- 뷰 이름을 사용하여 뷰가 생성하는 가상 릴레이션을 참조 가능
- 뷰 정의는 새로운 릴레이션을 생성하는 것이 아님
- 뷰 정의는 표현식이 저장됨
- 표현식은 뷰를 사용하여 질의로 작성됨
- instructor릴레이션에서 salary를 제외한 정보를 접근
create view faculty as
select ID, name, dept_name
from instructor
- 생물 학과의 모든 교수들을 구하라
select name
from faculty
where dept_name = ‘Biology’
- 각 학과별 모든 교수의 연봉의 합을 구하는 뷰
create view departments_total_salary(dept_name, total_salary) as
select dept_name, sum (salary)
from instructor
group by dept_name;
# 뷰의 사용
create view physics_fall_2009 as
select course.course_id, sec_id, building, room_number
from course, section
where course.course_id = section.course_id
and course.dept_name = ’Physics’
and section.semester = ’Fall’
and section.year = ’2009’;
create view physics_fall_2009_watson as
select course_id, room_number
from physics_fall_2009
where building= ’Watson’;
==> 확장
create view physics_fall_2009_watson as
(select course_id, room_number
from (select course.course_id, building, room_number
from course, section
where course.course_id = section.course_id
and course.dept_name = ’Physics’
and section.semester = ’Fall’
and section.year = ’2009’)
where building= ’Watson’;
# 뷰의 갱신
– base table 1개 이어야함
- faculty 뷰에 새로운 투플 추가
insert into faculty values (’30765’, ’Green’, ’Music’);
- instructor 릴레이션에 (’30765’, ’Green’, ’Music’, null) 투플 삽입
create view faculty as
select ID, name, dept_name
from instructor
create view instructor_info as
select ID, name, building
from instructor, department
where instructor.dept_name= department.dept_name;
insert into instructor_info values (’69987’, ’White’, ’Taylor’);
- 삽입 후
select * from instructor_info => Instructor ‘White’ 사라짐 (삽입 안됨)
create view history_instructors as
select *
from instructor
where dept_name= ’History’;
insert (’25566’, ’Brown’, ’Biology’, 100000)
into history_instructors
=> Instructor ‘Brown’ 사라짐 (삽입 안됨)
# 갱신가능 조건
- from 절은 오직 한 개의 데이터베이스 릴레이션을 가져야한다.
- select 절은 오직 릴레이션의 속성 이름만 포함해야 한다.
어떠한 표현, 집계, 구분 수식을 가져서는 안된다.
- select 절에 나열되지 않은 어떤 속성도 널 값으로 될 수 있어야 한다.
not null 조건을 가지거나 주 키의 일부여서는 안된다 - 개체 무결성 계약 조건 위반
- 질의는 group by나 having 절을 가져서는 안된다.
특정 행을 식별하지 못하게 된다.
'전공 공부 > 데이터베이스시스템' 카테고리의 다른 글
단일 릴레이션에서의 제약조건 (0) | 2021.01.02 |
---|---|
조인 (0) | 2021.01.01 |
case 구문 (0) | 2021.01.01 |
데이터베이스의 변경 – 갱신 (0) | 2021.01.01 |
데이터베이스의 변경 – 삽입 (0) | 2021.01.01 |