뷰 :
조인 등의 작업을 해서 만든 '결과 테이블' 이 가상으로 저장된 형태
일시적으로 생성한 결과 테이블을 저장해둔 것
뷰(VIEW)는 가상테이블이라고도 한다.
#AS 뒤에 나오는 쿼리문의 결과 테이블을 VIEW 로 저장하라
CREATE VIEW three_tables_joined AS
SELECT i.id, i.name, AVG(star) AS avg_star, COUNT(*) AS count_star
FROM item AS i LEFT OUTER JOIN review AS r ON r.item_id = i.id
LEFT OUTER JOIN member AS m ON r.mem_id = m.id
WHERE m.gender = 'f'
GROUP BY i.id, i.name
HAVING COUNT(*) >= 2
ORDER BY AVG(star) DESC, COUNT(*) DESC;
저장하면 아래와 같이 Views 테이블에 생성된 것 확인 가능
이제 이 three_tables_joined 라는 가상 테이블을 마치 원래 부터 존재했던 테이블인 것 처럼 사용하면 된다.
조인을 하거나 서브쿼리를 중첩해서 써서 복잡하고 길게 쓰던 쿼리문을
이렇게 뷰를 사용함으로 간단하게 테이블 이름만 가져다가 쓸 수 있어서 좋다.
자주 쓰는 결과 테이블이 있다면 '뷰' 로 저장해 두고 사용하면 좋다.
뷰와 그냥 테이블은 무슨 차이가 있는 걸까?
가장 큰 차이는 뷰는 테이블과 달리 데이터가 물리적으로 컴퓨터에 저장되어 있는 건 아니라는 점이다.
뷰는, 우리가 뷰를 사용할 때, DBMS가 그 뷰를 생성하는 SQL 문을 재실행하는 방식으로 가상의 테이블을 만들어준다.
뷰를 사용할 때마다 AS 다음에 있는 SQL문이 재실행 된다는 뜻이다.
뷰의 장점?
1. 뷰를 이용해서 각 직무별 데이터 수요에 알맞은, 다양한 구조의 데이터 분석 기반을 구축해둘 수 있다.
같은 테이블들이 존재하는 상황에서도, 직무에 따라, 상황에 따라, 필요로 하는 데이터의 종류와 그 구조가 사람마다 다를 수 있다. 뷰를 사용하면 각자에게 적합한 구조로 데이터들을 준비해둘 수 있기 때문에 회사 입장에서도 기존의 테이블 구조를 건드리지 않고, 풍부한 데이터 분석 기반을 준비할 수 있게 된다.
2. 뷰는 데이터 보안을 제공한다.
예를 들어, 회사에서 직원들에 관한 정보를 담고 있는 employee라는 테이블이 있고 이 테이블에는 굉장히 민감한 정보가 담긴 컬럼들이 있다고 가정하자. 예를 들어, 주민등록번호나 주소, 연봉 등과 같은 정보가 있다. 그런데 회사 내의 데이터 분석가가 어떤 분석을 하기 위해 이 employee 테이블이 필요할 수도 있다. 이때 분석가에게 민감 정보가 담긴 컬럼을 제외하고 보여줄 수 있는 방법도 바로 '뷰' 이다.
예를 들어, employee 테이블에 id, name, age, department, registration_number(주민등록번호), annual_salary(연봉) 컬럼이 있다고 가정했을 때,
이런 상황에서는 주민번호, 연봉 칼럼은 제외시킨 뷰를 만든다.
CREATE VIEW emp_view AS
SELECT id, name, age, department FROM employee;
같은 SQL 문을 실행해서 테이블과 비슷한 이름의 뷰를 만드는 게 좋다.
특정 column들 뿐만 아니라 특정 row들을 공개하지 않는 것도 가능하다.
예를 들어 department의 값이 'secret'인 직원들의 정보를 공개하지 않아야 한다고 가정해보자.
CREATE VIEW emp_view2 AS
SELECT id, name, age, department FROM employee
WHERE department != 'secret';
이렇게 WHERE 절로 조건을 붙여서, 특정 row들만 보여주는 뷰를 만드는 것도 가능하다.
이런 SQL 문을 사용해서, 공개 가능한 정보만 있는 뷰를 만들고 난 후에는,
데이터 분석가가 employee 테이블에 직접적인 접근을 하지 못하도록 막고(DBMS에서 '사용자별 권한 관리' 기능을 통해 할 수 있다), emp_view 뷰에만 접근할 수 있도록 하면 된다.
'IT > SQL' 카테고리의 다른 글
[MySQL] 데이터베이스 생성하기 (0) | 2022.02.02 |
---|---|
[MySQL] Join (LEFT, RIGHT, INNER) / UNION (0) | 2022.02.01 |
[MySQL] 서브쿼리 사용법 (0) | 2022.02.01 |
[MySQL] SELECT 문 각 절들의 사용 순서, 실제 실행 되는 순서 (0) | 2022.01.26 |
[MySQL] 문자열 관련 함수 (SUBSTRING, LENGTH, UPPER 등) (0) | 2022.01.26 |
댓글