티스토리 뷰

DB

데이터베이스 뷰(VIEW)

tioon 2023. 5. 3. 02:50
VIEW 란?

-뷰는 데이터베이스에서 하나 이상의 테이블에서 가져온 데이터를 저장한 가상테이블이다. 특정 데이터나 조건에 맞는 데이터들을 가상으로 가져와 볼 수 있으며 테이블과 유사한 구조를 가지고있기때문에 테이블을 안정성있게 표시할 수 있고, 편리하게 사용할 수 있다. 

 

뷰의 특징
  1. 데이터 보안성
    -사용자가 직접 테이블에 접근하지 않고 뷰를 통해서 데이터를 확인 할 수 있어 데이터 보안을 강화할 수 있음.

  2. 민감한 데이터 보호
    -테이블에 있는 데이터중 일반 사용자에게 공개되면 안되는 민감한 데이터들을 뷰를 이용해 숨겨서 나머지데이터만을 공개할 수 있어 민감한 데이터 보호를 할 수 있다.

  3. 복잡성 간소화
    -뷰를 사용해 복잡한 쿼리를 간단하게 작성할 수 있다. 여러개의 조인 쿼리나 서브쿼리를 이용해야 하는경우 뷰를이용해 좀 더 간편한 쿼리 작성을 할 수 있다.

  4. 최신 데이터 보유
    -뷰는 실제 데이터가 아니라 일반테이블에서 가져와 가상화한 데이터집합이다. 따라서 뷰는 항상 이 가상화를 사용하여 테이블에서 가져와 최신데이터처럼 보여지게한다.

  5. 제약
    -뷰는 일반 데이터 테이블들과 다른 특성을 가지고 있어 테이블에있는 색인(index)를 가지지 못하고, 키속성, 무결성 제약등은 할 수 없습니다.

 

뷰 정의 쿼리

Create view (View 이름)  as (쿼리)

 

 

 

VIEW 확장

-뷰를 기반으로 뷰를 생성하는 것, 뷰 확장은 기존의 뷰를 기반으로 새로운 뷰를 만드는 것으로 데이터를 보다 효율적으로관리 할수 있습니다.

 

 

VIEW 변경

-뷰에 대한 검색 연산외에 뷰를 변경하는 연산도 가능합니다. 예를들어 뷰에  INSERT문을 실행해 튜플을 삽입할 수 있는데  이러한 연산을 뷰뿐만아니라 뷰가 가리키고있는 테이블내에서도 실행 하는것이 뷰 변경입니다.

 

 

 

 

VIEW 변경불가 조건
  1. 집계함수를 사용한 뷰
    -AVG, COUNT , MAX ,MIN, SUM등과 같은 집계함수를 사용한 뷰는 수정할 수 없습니다. 집계함수는 그룹화된 결과를 계산하기때문에 이러한 그룹화된 뷰는 테이블과 다르기 때문에 변경이 불가 합니다.

  2. DISTINCT, GROUP BY HAVING 뷰 
    -이조건들도 테이블을 그룹화하여 생성하기 때문에 원래 테이블의 속성과달라 수정할 수 없습니다.

  3. 두개 이상의 테이블이 조인된 뷰
    -두개 이상의 테이블이 조인된 뷰는 뷰에 데이터가 삽입이 될때 어느 테이블에 튜플을 삽입해야하는지 모호합니다. 이러한 모호성때문에 뷰를 변경불가 합니다

 

 

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
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
글 보관함