728x90

데이터 조회 용도. 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 byhaving 절을 가져서는 안된다.

  특정 행을 식별하지 못하게 된다.

 

반응형

'전공 공부 > 데이터베이스시스템' 카테고리의 다른 글

단일 릴레이션에서의 제약조건  (0) 2021.01.02
조인  (0) 2021.01.01
case 구문  (0) 2021.01.01
데이터베이스의 변경 – 갱신  (0) 2021.01.01
데이터베이스의 변경 – 삽입  (0) 2021.01.01
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기