Views
사용자에게 접근이 허용된 자료만을 제한적으로 보여주기 위해 하나 이상의 기본 테이블로부터 유도된 이름을 가진 가상 테이블

Referential Integrity


위처럼 view를 만들면,
B받은 학생의 이름을 알고 싶을 때, Select name from B-Students만 하면 결과가 나온다.
-> where절이 필요 없으므로 명령어가 간단해짐
뷰를 삭제하는 명령어: DROP VIEW
하나의 뷰를 삭제하면 그 뷰를 기초로 정의된 다른 뷰도 자동으로 삭제됨 (cascade)
만약 view가 있으면 테이블은 어떻게 삭제할 수 있을까?

RESTRICT 옵션을 줘서 둘 다 삭제가 안 되게 하는 방법이 있고
CASCADE 옵션을 줘서 둘 다 삭제가 되게 하는 방법이 있다.
Update view

loan테이블에서 loan_number와 branch_name만을 공개하는 View를 만듦
-> View에 삽입을 하면 원래 테이블에 삽입이 됨

그러나 위처럼 삽입을 하면 loan테이블의 공개하지 않은 속성 값은 줄 수 없음
따라서 loan테이블은 아래처럼 null값으로 업데이트 됨

<삽입,삭제,갱신 제약 조건>
1. single base table로 view를 만든 경우에 update가 가능함 (어느 테이블에 갱신할지 모름)
2. aggregate연산을 이용하지 않았을 때 update가 가능함
(예를 들어 a의 점수가 100, b의 점수가 80임. 이 데이터를 바탕으로 view의 sum은 180이 됨.
그런데 view에서 sum을 수정하려고 함. 그러면 a의 점수가 오른건지 b의 점수가 오른건지 알 수가 없음)
3. 기본키를 포함해서 view를 만들어야 update가 가능함 (기본키 없이 테이블에 갱신이 불가능)