Daily coding

Oracle day 7 - View 뷰 & 테이블 본문

DB/Oracle

Oracle day 7 - View 뷰 & 테이블

sunnnkim 2019. 12. 19. 12:38

VIEW

    view : 가상 테이블
    - 실체가 없는 테이블 
    - 실제 저장되는 것이 아님 => c언어 포인터와 비슷한 개념
    - table <- view 로 접근
    - 창문의 역할 : 뷰를 통해 테이블을 볼 수 있음
    - 원하는 것만 뽑아서 볼 수 있음
    - 한개의 뷰로 여러개의 테이블의 데이터를 검색하는 것이 가능
    - 처리 속도가 빠름
    - 제한을 설정할 수 있음 (READ ONLY)
    - 데이터를 삽입할 때 무결성을 주의해서 데이터를 넣어야 함
    - 검색용으로 많이 쓰임
   

 

 

1. View 생성하기

 

 

-- 기존 테이블의 데이터를 뽑아 카피한다
CREATE VIEW UB_TEST_01(
        JOB_ID ,
        JOB_TITLE,
        MIN_SALARY
AS
SELECT job_id, job_title, min_salary
FROM jobs;

-- 결과 테스트
SELECT * FROM ub_test_01; -- 창문을 통해서 검색함

 

2. View에 데이터 삽입하기


INSERT INTO ub_test_01
VALUES ('DEVELOPER', '개발자', 10000); -- 뷰에 데이터 삽입


-- 데이터를 삽입할 수는 있지만 실체가 없어서
-- 삽입된 데이터는 JOBS 테이블에 저장된다
-- 아래의 코드를 실행하면 방금 삽입한 데이터가 들어가있는 것을 알 수 있다

 


SELECT * FROM JOBS;

 


ROLLBACK; -- 커밋전에 수정하려면 롤백을 실행하면 된다.
COMMIT; -- 커밋후에 수정하려면 MODIFY나 UPDATE 예약어 또는 view 로  수정해야함

 

-- 테이블과 View 생성하기


CREATE TABLE TB_TEST02(
        KEY_01 VARCHAR2(10),
        KEY_02 VARCHAR2(10),
        COL_01 VARCHAR2(20),
        COL_02 VARCHAR2(20),
        CONSTRAINT PK_TEST_02 PRIMARY KEY (KEY_01, KEY_02)  

        -- 프라이머리 키를 생성하여 
);

 


CREATE VIEW UB_TEST_02(
        KEY_01, 
        KEY_02,
        COL_01,
        CONSTRAINT PK_UB_TEST_02 PRIMARY KEY (KEY_01, KEY_02)
                DISABLE NOVALIDATE          -- 제약조건 ( CONSTRAINT )이 없는것과 동일한 결과
AS
SELECT KEY_01, KEY_02, COL_01
FROM TB_TEST02;

 


-- 데이터보기
SELECT * FROM TB_TEST02;

 

 

-- 뷰에 데이터를 삽입할 수 있음

INSERT INTO UB_TEST_02( KEY_01, KEY_02, COL_01)
VALUES ('AAA', 'aaa', '111');

 

-- 뷰에 저장되어있는 듯 보이지만 실제로는 뷰는 존재하지 않고 원본테이블에 데이터가 저장됨

SELECT * FROM UB_TEST_02;


 

 

 

3. READ ONLY

-- 뷰를 읽기 전용으로 만들 수 있음

 

*  OR REPLACE : 이미 있는 뷰에 새로운 테이블을 덮어씌움 
CREATE OR REPLACE VIEW EMPVIEW ( 
        "사원번호" , 
        "성" ,
        "이메일",
        "입사일",
        "업무",
        CONSTRAINT PK_UB_EMP PRIMARY KEY ("사원번호")
        DISABLE NOVALIDATE
)
AS
SELECT employee_id, last_name,email, hire_date, job_id FROM employees
WITH READ ONLY; -- 데이터 삽입이 불가능(오류발생함)

 

-- 확인
SELECT  *  FROM empview;

 

 


INSERT INTO empview
VALUES (400,'KIM','MIN@NAVER.COM', SYSDATE, 'IT_PROG');
-- 에러발생 ( READ ONLY이기 때문 )

 

 


< 참고 >

* 두개의 테이블을 뷰를 통해 한꺼번에 취득이 가능

CREATE OR REPLACE VIEW DEPT_EMP_VIEW
AS 
SELECT e.employee_id, e.first_name, d.department_id,    
                d.department_name, d.location_id
FROM  employees e, departments d
WHERE e.department_id = d.department_id
WITH READ ONLY;