본문 바로가기

SQL

[MySQL_MariaDB] 뷰 정리

*

1) 가상테이블. 실체는 없으며, 진짜 테이블에 링크된 개념

* 뷰를 사용하는 이유

1) 보안

회원의 주소를 대량으로 변경해주는 작업이 필요하다고 가정해보자. 아르바이트생에게 회원의 다른 정보는 그대로 두고, 주소만 변경하는 일을 시키려한다. 그런데 이 아르바이트 생에게 회원테이블을 사용할 권한을 준다면 회원의 주소외에 주민번호, 전화번호 등 중요 정보를 열람하게 된다.

> 이 때 테이블을 하나 더 생성하여 데이터를 다시 입력해도 되지만, 중복의 문제가 발생한다.

> 이럴때 뷰를 사용한다. 아이디와 주소만 있는 뷰를 줘서 다른 정보를 보지 못하게 한다.

2) 복잡한 쿼리를 단순화 시켜 줄 수 있다.

 

뷰의 실체는 select문이다. 뷰에 접근하게 되면 뷰생성시에 입력한 select문이 작동한다.

 

복잡한 쿼리를 하나의 테이블에서 조회가 가능하다.

7. 뷰 수정 alter view

 

뷰 삭제

 

Create view는 기존에 뷰가 있으면 오류가 발생하지 않지만, create or replace view는 기존에 뷰가 있어도 덮어쓰는 효과를 내기 때문에 오류가 발생하지 않는다. Drop viewcreate view를 연속해서 쓴 효과를 갖는다.

 

1. describe : 뷰테이블의 정보 확인 테이블과 동일하나 primary key 등의 정보는 확인되지 않음.

3. show create view v_usertbl : 뷰의 소스 코드를 확인 가능하다.

 

뷰테이블을 수정(update하면) 뷰테이블 뿐만 아니라, 기존에 있던 테이블의 데이터도 수정된다.

 

뷰테이블에 삽입하려하면 에러가 난다. 왜냐하면 뷰테이블이 참조하는 usertblbirthYear 컬럼이 not null이므로 현재의 뷰테이블에 birthYear를 포함하도록 재정의하거나, birthYearNull 또는 default 값을 지정해줘야한다.

 

10. 시스템 데이터베이스 중 하나인 information_schemaviews 테이블에서 전체 시스템에 저장된 뷰에 대한 다양한 정보를 가지고 있다.

* IS_UPDATEABLE : NO로 되어 있는 경우 데이터를 변경(insert, update, delete)을 할 수 없다.

* 뷰를 통해서 데이터의 수정이나 삭제를 할 수 없는 경우

> 집계함수를 사용한 뷰

> union all, join 등을 사용한 뷰

> distict, group by 등을 사용한 뷰

 

1~3. 키가 177이상인 뷰를 생성.

7. 키가 177 미만인 데이터를 삭제하면 데이터가 없으므로 삭제될 것이 없다.

 

9. 위에서 언급한 뷰는 키 177이상인 사람인 뷰테이블이므로 158인 김병만은 삽입해도 들어가지 않는다. 하지만 뷰테이블의 부모인 usertbl에는 정상적으로 삽입된다.

> 177이상인 뷰에 158을 삽입하는건 바람직해보이지 않는다. , 예상치 못한 경로를 통해서 입력되지 말아야할 데이터가 입력된 듯한 느낌이 든다. 이럴 때 사용하는 것이 with check option을 사용하면 된다.

 

4. with check option 문을 이용하면 조건에 따라 177이상인 데이터만 입력된다.

 

7. join을 통해 생성된 뷰는 데이터 수정이 안된다.

11. 9라인에서 부모테이블이 삭제되었다면 조회되지 않는다.