SQL 이것저것

[SQL] View(뷰)

agingcurve 2022. 9. 10. 15:53
반응형

VIEW

뷰는 다른 테이블에서 파생된 테이블이다. 물리적으로 데이터가 저장되는 것이 아니라, 
논리적으로만 존재하며 뷰를 사용한 질의 시에는 DBMS에서 뷰 정의에 따라 질의를 재작성하여 수행한다.

 

VIEW의 장점

 독립성 : 테이블 구조가 변경되어도 뷰를 사용하고 있는 응용 프로그램은 변경하지 않아도 된다

 편리성 : 자주 사용되는 복잡한 쿼리를 미리 뷰로 정의해 놓으면, 추후 쿼리는 간단한 형태로 표현할 수 있다

 보안성 : 사용자의 권한에 따라 열람 가능한 데이터를 다르게할 수 있다. 권한에 따라 확인 가능한 컬럼을 정의하여 뷰를 생성하면, 기본 테이블 노출 없이 접근 제어를 할 수 있다

 

뷰를 사용한다면 복잡한 쿼리도 별칭으로 관리하여 쉽게 관리할 수 있다.

VIEW의 특징

 - 생성된 뷰는 또 다른 뷰를 생성하는데 사용될 수 있다 (뷰 테이블을 만든다면 추후 다른테이블에도 재사용 가능)

 - 뷰의 정의는 변경할 수 없으며, 삭제 후 재생성이 필요하다 (뷰는 UPDATE가 불가하고, CREATE, UPDATE만 가능하다, REPLACE를 사용하면 DELETE 후 CREATE를 실행해 준다)

 - 뷰를 통한 갱신에는 제약이 따른다. 갱신을 위해서는 기본적으로 원천 테이블의 기본키가 포함되어야 한다

 - 원천이 되는 테이블이나 뷰가 삭제되면 이를 기반으로 하는 뷰도 함께 삭제된다.

 

VIEW 쿼리

# 같은 이름의 뷰가 존재하면 기존 뷰를 무시하고 대체
CREATE [OR REPLACE] VIEW view_name AS
# 뷰를 생성할 쿼리 구문
SELECT column1, column2, … FROM table_name
WHERE condition;

 

예시

이러한 테이블이 있다고 한다면

CREATE VIEW MEMBER_NAME AS  # VIEW 정의
(SELECT ID, NAME # 진행되는 쿼리
FROM MEMBER);

EMPOLYEE 테이블과 DEPARTMENT 테이블이 있다면, 이 둘을 통해 함께 볼 수 있는 쿼리를 작성하고 뷰로 작성함

CREATE VIEW EMPLOYEE_FULL AS 
(
SELECT E.ID AS EMPLOYEE_ID, 
E.NAME AS EMPLOYEE_NAME, E.SALARY, 
E.DEPARTMENT_ID,
D.NAME AS DEPARTMENT_NAME
FROM EMPLOYEE E
LEFT OUTER JOIN
DEPARTMENT D
ON E.DEPARTMENT_ID = D.ID );

 

VIEW 문제 풀이

EMPLOYEE 테이블을 이용하여 부서 이름이 ‘개발’인 직원들의 직원 ID, 급여 정보를 가진 뷰(EMPLOYEE_DEV) 를 만드는 쿼리를 작성

 

EMPLOYEE 테이블의 구조

  1. EMPLOYEE테이블에서 부서 이름(department_name)이 ‘개발’ 인 직원들의 직원 ID(employee_id), 급여(salary) 정보를 가지는 EMPLOYEE_DEV 뷰(View) 를 만드는 쿼리를 작성
  2. 1번에서 만든 EMPLOYEE_DEV 뷰에 대하여 뷰의 모든 데이터를 출력하는 쿼리를 작성

 

EMPOLYEE 테이블 구조

+-------------+-----------------+--------+
| employee_id | department_name | salary |
+-------------+-----------------+--------+
|       10000 | 영업            |   9000 |
|       10001 | 개발            |   8500 |
|       10002 | 개발            |   9000 |
|       10003 | 운영            |   7000 |
|       10004 | 기획            |   9500 |
|       10005 | 사업            |   7500 |
|       10006 | 영업            |   6000 |
|       10007 | 기획            |  10000 |
|       10008 | 사업            |   8000 |
|       10009 | 개발            |   9000 |
|       10010 | 개발            |   7500 |
+-------------+-----------------+--------+

 

-- 1. 부서이름이 '개발'인 직원의 직원ID, 급여 정보를 가지는 뷰(EMPLOYEE_DEV)를 만드는 쿼리를 작성
CREATE VIEW EMPLOYEE_DEV AS(
    SELECT EMPLOYEE_id, salary
    FROM EMPLOYEE
    WHERE department_name = "개발"
);

-- 2. 위에서 만든 뷰(EMPLOYEE_DEV)의 모든 데이터를 조회하는 쿼리를 작성
SELECT * FROM EMPLOYEE_DEV;

'SQL 이것저것' 카테고리의 다른 글

[SQL] 그룹 함수  (0) 2022.09.16
[SQL] 윈도우 함수  (0) 2022.09.14
[SQL] 서브쿼리  (0) 2022.09.10
[SQL] JOIN  (0) 2022.08.30
[SQL] 계층형 질의  (0) 2022.08.30