본문 바로가기

프로그래밍&IT/MySQL, Oracle, DB 공통

[Oracle] View에 대해서 알아보자

이제 오라클을 공부할 때가 온것같다.

원래 UI위주 개발자지만, 사실 데이터베이스는 필수로 해야하는게 맞지만.

이상하게 오라클하고는 잘 맞지않지만

 

이번에 View에 대해서 알아봐야하는데,

오라클에 맞춰 조회를 해봤다.

View란?

View는 데이터를 조회하거나 구조를 정의하는 데 도움을 주는 논리적 개체

 

1. Simple View (단순 뷰)

  • 하나의 테이블에서만 데이터를 조회하는 View입니다.
  • 데이터 조작 작업(DML: Insert, Update, Delete)을 지원하며, 기본 테이블의 데이터 변경에 영향을 미칩니다.
-- 예시 테이블: EMPLOYEES
CREATE TABLE EMPLOYEES (
    EMP_ID NUMBER PRIMARY KEY,
    NAME VARCHAR2(50),
    DEPARTMENT_ID NUMBER,
    SALARY NUMBER
);

-- 단순 뷰 생성
CREATE VIEW EMPLOYEE_SALARY_VIEW AS 
SELECT EMP_ID, NAME, SALARY 
FROM EMPLOYEES 
WHERE SALARY > 5000;

-- 단순 뷰 조회
SELECT * FROM EMPLOYEE_SALARY_VIEW;

2. Complex View (복합 뷰)

  • 여러 테이블의 조인, 함수, 그룹핑 등을 포함하는 View입니다.
  • 일반적으로 DML 작업을 지원하지 않지만, 기본 테이블의 데이터 조회에 유용합니다.
  • 대신 INSTEAD OF 트리거를 사용하면 복합 뷰에서도 DML 작업을 일부 지원할 수 있습니다.
- 예시 테이블: DEPARTMENTS
CREATE TABLE DEPARTMENTS (
    DEPARTMENT_ID NUMBER PRIMARY KEY,
    DEPARTMENT_NAME VARCHAR2(50)
);

-- 복합 뷰 생성
CREATE VIEW DEPARTMENT_SALARY_VIEW AS 
SELECT D.DEPARTMENT_NAME, AVG(E.SALARY) AS AVG_SALARY 
FROM EMPLOYEES E 
JOIN DEPARTMENTS D ON E.DEPARTMENT_ID = D.DEPARTMENT_ID 
GROUP BY D.DEPARTMENT_NAME;

-- 복합 뷰 조회
SELECT * FROM DEPARTMENT_SALARY_VIEW;

3. Materialized View (물리적 뷰)

  • 기본 테이블의 데이터를 물리적으로 저장해 성능을 개선하는 뷰입니다.
  • 주기적으로 데이터를 새로고침할 수 있어 보고서 및 분석용으로 적합합니다.
  • 데이터베이스에서 기본 테이블 변경 시 자동으로 동기화되도록 설정할 수 있습니다.
-- 물리적 뷰 생성
CREATE MATERIALIZED VIEW EMPLOYEE_STATS_VIEW 
BUILD IMMEDIATE
REFRESH FAST ON COMMIT 
AS 
SELECT DEPARTMENT_ID, COUNT(*) AS EMP_COUNT, AVG(SALARY) AS AVG_SALARY 
FROM EMPLOYEES 
GROUP BY DEPARTMENT_ID;

-- 물리적 뷰 조회
SELECT * FROM EMPLOYEE_STATS_VIEW;

4. Inline View (인라인 뷰)

  • SQL 문 내에 일시적으로 정의된 View입니다.
  • 주로 서브쿼리에서 사용되며, 별도의 오브젝트로 저장되지 않고 일회성으로 사용됩니다.
-- 인라인 뷰를 사용한 조회
SELECT DEPARTMENT_NAME, AVG_SALARY 
FROM (
    SELECT D.DEPARTMENT_NAME, AVG(E.SALARY) AS AVG_SALARY 
    FROM EMPLOYEES E 
    JOIN DEPARTMENTS D ON E.DEPARTMENT_ID = D.DEPARTMENT_ID 
    GROUP BY D.DEPARTMENT_NAME
) 
WHERE AVG_SALARY > 5000;

5. Partitioned View (파티셔닝 뷰)

  • 파티션된 테이블과 연동하여 사용되는 View입니다.
  • 큰 데이터셋을 분할하여 성능을 개선하는 데 유용합니다.
-- 파티션 테이블: REGION_EMPLOYEES
CREATE TABLE REGION_EMPLOYEES (
    EMP_ID NUMBER,
    REGION VARCHAR2(50),
    SALARY NUMBER
) PARTITION BY LIST (REGION) (
    PARTITION NORTH VALUES ('NORTH'),
    PARTITION SOUTH VALUES ('SOUTH'),
    PARTITION EAST VALUES ('EAST'),
    PARTITION WEST VALUES ('WEST')
);

-- 파티셔닝 뷰 생성
CREATE VIEW REGION_SALARY_VIEW AS 
SELECT REGION, SUM(SALARY) AS TOTAL_SALARY 
FROM REGION_EMPLOYEES 
GROUP BY REGION;

-- 파티셔닝 뷰 조회
SELECT * FROM REGION_SALARY_VIEW;

 

기타

 

  • 구조 확인: DESCRIBE view_name;
  • View 정의 확인: SELECT * FROM USER_VIEWS WHERE VIEW_NAME = 'VIEW_NAME';

 

1. USER_VIEWS

  • 현재 사용자가 소유한 뷰 객체의 정의를 확인할 수 있는 뷰.
  • 뷰는 데이터베이스에서 특정 쿼리를 저장한 논리적인 테이블로, 이를 통해 실제 데이터베이스 테이블을 기반으로 한 가상 테이블을 생성할 수 있습니다.
  • 주요 컬럼
    • VIEW_NAME: 뷰의 이름
    • TEXT_LENGTH: 뷰 정의의 길이
    • TEXT: 뷰의 정의를 포함한 SQL 쿼리
SELECT VIEW_NAME, TEXT_LENGTH, TEXT
FROM USER_VIEWS;

 

 

2. Dictionary View (사전 뷰)

  • 데이터베이스의 메타데이터에 접근할 수 있도록 하는 뷰
  • Oracle Database가 관리하는 시스템 정보와 객체에 대한 데이터를 제공합니다.
  • 일반적으로 DBA_, ALL_, USER_로 시작하며, 각 접두사에 따라 조회할 수 있는 권한이 다릅니다.

주요 Dictionary View 종류

  • USER_: 현재 사용자가 소유한 객체와 관련된 정보
  • ALL_: 현재 사용자가 접근할 수 있는 모든 객체와 관련된 정보
  • DBA_: 데이터베이스 관리자가 모든 객체와 관련된 정보를 확인할 수 있는 뷰

예시

  • USER_TABLES: 현재 사용자가 소유한 테이블에 대한 정보
  • ALL_TAB_COLUMNS: 모든 테이블의 컬럼 정보
  • DBA_OBJECTS: 데이터베이스의 모든 객체에 대한 정보
-- 현재 사용자가 소유한 테이블 확인
SELECT TABLE_NAME, TABLESPACE_NAME, STATUS 
FROM USER_TABLES;

-- 모든 테이블의 컬럼 정보 확인
SELECT TABLE_NAME, COLUMN_NAME, DATA_TYPE
FROM ALL_TAB_COLUMNS;

-- 데이터베이스의 모든 객체 확인
SELECT OBJECT_NAME, OBJECT_TYPE, OWNER
FROM DBA_OBJECTS;

 

당분간 오라클 데이터베이스에 대해서 계속 공부해야 할것같다.