티스토리 뷰
VIEW 란?
-뷰는 데이터베이스에서 하나 이상의 테이블에서 가져온 데이터를 저장한 가상테이블이다. 특정 데이터나 조건에 맞는 데이터들을 가상으로 가져와 볼 수 있으며 테이블과 유사한 구조를 가지고있기때문에 테이블을 안정성있게 표시할 수 있고, 편리하게 사용할 수 있다.
뷰의 특징
- 데이터 보안성
-사용자가 직접 테이블에 접근하지 않고 뷰를 통해서 데이터를 확인 할 수 있어 데이터 보안을 강화할 수 있음. - 민감한 데이터 보호
-테이블에 있는 데이터중 일반 사용자에게 공개되면 안되는 민감한 데이터들을 뷰를 이용해 숨겨서 나머지데이터만을 공개할 수 있어 민감한 데이터 보호를 할 수 있다. - 복잡성 간소화
-뷰를 사용해 복잡한 쿼리를 간단하게 작성할 수 있다. 여러개의 조인 쿼리나 서브쿼리를 이용해야 하는경우 뷰를이용해 좀 더 간편한 쿼리 작성을 할 수 있다. - 최신 데이터 보유
-뷰는 실제 데이터가 아니라 일반테이블에서 가져와 가상화한 데이터집합이다. 따라서 뷰는 항상 이 가상화를 사용하여 테이블에서 가져와 최신데이터처럼 보여지게한다. - 제약
-뷰는 일반 데이터 테이블들과 다른 특성을 가지고 있어 테이블에있는 색인(index)를 가지지 못하고, 키속성, 무결성 제약등은 할 수 없습니다.
뷰 정의 쿼리
Create view (View 이름) as (쿼리)
VIEW 확장
-뷰를 기반으로 뷰를 생성하는 것, 뷰 확장은 기존의 뷰를 기반으로 새로운 뷰를 만드는 것으로 데이터를 보다 효율적으로관리 할수 있습니다.
VIEW 변경
-뷰에 대한 검색 연산외에 뷰를 변경하는 연산도 가능합니다. 예를들어 뷰에 INSERT문을 실행해 튜플을 삽입할 수 있는데 이러한 연산을 뷰뿐만아니라 뷰가 가리키고있는 테이블내에서도 실행 하는것이 뷰 변경입니다.
VIEW 변경불가 조건
- 집계함수를 사용한 뷰
-AVG, COUNT , MAX ,MIN, SUM등과 같은 집계함수를 사용한 뷰는 수정할 수 없습니다. 집계함수는 그룹화된 결과를 계산하기때문에 이러한 그룹화된 뷰는 테이블과 다르기 때문에 변경이 불가 합니다. - DISTINCT, GROUP BY HAVING 뷰
-이조건들도 테이블을 그룹화하여 생성하기 때문에 원래 테이블의 속성과달라 수정할 수 없습니다. - 두개 이상의 테이블이 조인된 뷰
-두개 이상의 테이블이 조인된 뷰는 뷰에 데이터가 삽입이 될때 어느 테이블에 튜플을 삽입해야하는지 모호합니다. 이러한 모호성때문에 뷰를 변경불가 합니다
With Check Option
-뷰에서 삽입,갱신할때 지정된 조건식을 만족하지않으면 차단하는 옵션, 뷰를 통해 업데이트를 할때 해당 데이터가 뷰정의에 맞는지 검사하여 조건식에 맞지않으면 아예 변경을 할 수 없게 차단을합니다.
CREATE VIEW high_salary_employees AS
SELECT *
FROM employees
WHERE salary >= 3000;
예를들어 위와 같은 뷰가 있다고 가정할때 해당 뷰에 salary가 3000미만인 employee 튜플을 삽입할 수 있습니다. 하지만 이러한 튜플을 삽입해도 view에서는 조건식에 맞지가 않아 테이블엔 삽입이 되어도 뷰에는 보이지않아 확인하지 못하는 경우가 생길 수 있습니다. 이러한 경우를 아예 배제하기 위해 with check option을 통해 조건에 맞지않는 식은 차단을 하는 옵션입니다.
순환뷰(Recursive View)
-다른 뷰 또는 테이블에 자기자신을 참조하는 뷰. 즉, 하나 이상의 뷰가 순환적으로 반복해 참조되는 경우를 말하며,재귀적인 관계를 가지고 있습니다. 순환뷰는 계층 구조를 가지는 데이터를 처리할 때 유용하며 WITH recursive 구문을 사용하는데 이 구문은 초기 쿼리와 재귀쿼리를 결합하는 방식으로 사용됩니다.
예를들어 다음과 같은 테이블이 있다고 가정하겠습니다.
id | name | parent_id |
1 | CEO | null |
2 | CTO | 1 |
3 | CFO | 1 |
4 | Manager 1 | 2 |
5 | Manager 2 | 2 |
6 | Engineer 1-1 | 4 |
7 | Engineer 1-2 | 4 |
8 | Engineer 2-1 | 5 |
9 | Engineer 2-2 | 5 |
이러한 테이블이 있을때 다음과같은 recursive view로 작성을 할 수 있습니다.
WITH RECURSIVE org_chart (id, name, parent_id, level) AS (
SELECT id, name, parent_id, 0
FROM employees
WHERE name = 'CTO' // 초기 쿼리
UNION ALL
SELECT e.id, e.name, e.parent_id, org_chart.level + 1
FROM employees e
JOIN org_chart ON e.parent_id = org_chart.id // 재귀 쿼리
)
SELECT * FROM org_chart;
초기쿼리를 보면, name='CTO'인 사람을 찾아 선택합니다.
그리고 아래 재귀쿼리로 가 초기쿼리에 있는 값들의 id중에서 employee 테이블의 parent_id값과 같은 값들을 선택하고 level을 증가시켜 선택합니다
초기쿼리와 재귀쿼리를 union 연산을하여 테이블을합칩니다.
재귀쿼리에서 만족하는 것이 없을때까지 반복을합니다.
'DB' 카테고리의 다른 글
트리거(Triggers) (0) | 2023.05.04 |
---|---|
무결성 제약 (0) | 2023.05.04 |
SELECT 기본구조 (0) | 2023.04.21 |
SQL 언어 종류 (DML , DDL, DCL) (0) | 2023.03.27 |
추가 관계 대수 (0) | 2023.03.27 |