가상 테이블; 뷰(VIEW) - 0921

안씅👩🏻‍💻·2022년 9월 21일
0
post-thumbnail

1. 뷰(VIEW)의 개념


뷰(VIEW) - 가상 테이블

: 실제 있는 테이블이 아니라 기존의 다른 테이블을 참조한 테이블

  • 실제 테이블에 있는 데이터 테이블을 뷰를 통해서 일부 데이터만 보이는 것.
    ex) USER_CONSTRAINT,,,




뷰의 기본 테이블

  • 실제(↔가상) 테이블을 사용하는 것처럼 동일하게 사용 할 수 있음.

  • 뷰 테이블에서 데이터를 '수정'하거나 '변경'하면
    원본 테이블도 변경됨.

  • 뷰 테이블의 강점은, 원본 테이블의 복잡한 SQL문(예를들어 SUB쿼리, 동등조인 등..)을 단순화 할 수 있음.




2. 뷰(VIEW) 사용


뷰 테이블 생성(CREATE)


CREATE VIEW로 뷰 테이블 생성하기.

-- 뷰테이블을 생성
CREATE VIEW EMP_VIEW30 함.
AS
SELECT EMPNO, ENAME, DEPTNO
FROM EMP_COPY -- 만들어둔 EMP 복사 테이블
WHERE DEPTNO=30;

CREATE VIEW로 뷰 테이블을 생성 할 수 있음.




CREATE OR REPLACE VIEW로 뷰 테이블 생성하기.

CREATE OR REPLACE VIEW 로 뷰 테이블을 생성하면,

  • 생성하려는 이름의 테이블이 없는 경우 : CREATE
    • 선언한 조건으로 뷰 테이블을 생성(CREATE)함.
  • 생성하려는 이름의 테이블이 있을 경우 : REPLACE
    • 해당 뷰 테이블을 삭제(DROP)하고, 선언된 조건으로 다시 생성(CREATE)함.

뷰 테이블 속성명을 별명(alias)으로 지정

CREATE OR REPLACE VIEW EMP_VIEW(사원번호, 사원명, 급여, 부서번호)
AS
SELECT EMPNO, ENAME, SAL, DEPTNO
FROM EMP_COPY;

뷰 테이블을 생성할 때, 속성명을 별명(alias)으로 지정 가능함.


별명(alias) 설정 후, 데이터 검색 애러 발생히는 경우

  • WHERE 조건절에 별명으로 조건절을 생성하지 않았을 때 에러 발생함.
SELECT * FROM EMP_VIEW
WHERE deptno=30;
-- error :  "DEPTNO": invalid identifier 부서번호라는 별칭을 설정 했으면 별칭으로 검색해야함.

-- 올바른 예시
SELECT * FROM EMP_VIEW 
WHERE 부서번호=30; 




SELECT로 뷰 테이블 데이터 검색하기.

  • 뷰 테이블은 일반 테이블 처럼 데이터를 추출해 사용할 수 있음.
SELECT ENAME FROM EMP_VIEW30;
  • 뷰 테이블에서 일부 데이터만 뽑아서 사용할 수 있음.



뷰 테이블 전체 검색은 해당 뷰 테이블의 생성조건을 검색하는 것과 같은 결과를 갖음.

SELECT * FROM EMP_VIEW30; 

SELECT EMPNO, ENAME, DEPTNO 
FROM EMP_COPY 
WHERE DEPTNO=30; -- EMP_VIEW30의 생성 조건
  • SELECT식은 EMP_VIEW30 뷰 테이블의 생성 조건을 출력하는 것과 같은 결과를 갖음.




뷰 테이블 삽입(INSERT)


INSERT로 원본 테이블에서 데이터 삽입하기.

  • 뷰 테이블은 원본 테이블의 일부만 골라서 보는 것.
    • 뷰는 가상의 테이블로 실제하는 테이블이 아님.
      • 뷰에서 특정 데이터가 보이기 원해서 삽입(INSERT)해야 한다면,
      • 원본 테이블에 삽입(INSERT)해야 함.

INSERT INTO EMP_COPY (EMPNO, ENAME, JOB, DEPTNO)
VALUES(8200,'TEST','TEST',30);
-->> 테스트 데이터를 뷰의 원본 데이터에 삽입해보기.
  • 'EMP_COPY'에 새로운 데이터 삽입 완료
    • 뷰 테이블 생성 조건에 성립하면, 뷰 테이블에 추가되어 있음.




INSERT로 뷰 테이블에서 데이터 삽입하기.

INSERT INTO EMP_VIEW30
VALUES(1111, 'AAAA', 30); -- 뷰 테이블에 데이터 값 추가하기.

SELECT * FROM EMP_VIEW30; -- 뷰 테이블에 추가됨.
SELECT * FROM EMP_COPY; -- 뷰 테이블의 부모 테이블에도 추가됨.
  • 뷰 테이블 출력
    • EMP_COPY에서도 삽입된 데이터 확인 가능함.

🧑🏻‍🏫 : " 원본 테이블과 뷰 테이블 사이 관계성을 주목하세요!"




2. 뷰(VIEW) 종류


단순 뷰

  • 단순 뷰는 *DML 명령어를 사용하여 조작이 가능함.

    • 하지만, 몇 가지 요인으로 에러를 발생 시킴.

*DML : 데이터 조작어, SELECT INSERT UPDATE DELETE를 말함.




원본 테이블 NOT NULL칼럼에 영향 받는 뷰에 데이터 삽입(INSERT)하기.

  • 원본 테이블의 칼럼 중에 NOT NULL 제약 조건이 지정되어 있는 경우
    • 뷰 테이블에서 NOT NULL 칼럼에 INSERT로 값을 넣어줄 수 없으면 에러 발생함.
      -->> 뷰 칼럼으로 가져오지 않은 원본 칼럼원본 테이블에 NULL로 저장되기 때문에 NOT NULL이 있으면 곤란함.




뷰 테이블에 GROUP BY(그룹 함수) 사용하기.

  • GROUP BY를 사용하여 뷰 테이블을 만들 때, 반드시 별명(alias)을 지정해줘야함.
CREATE VIEW VIEW_SAL
AS
SELECT DEPTNO, SUM(SAL) AS "SalSum", AVG(SAL) AS "SalAvg"
FROM EMP_COPY
GROUP BY DEPTNO;
  • 별명을 지정해주지 않았을 경우
    • error : "must name this expression with a column alias"
      -->> 별명(alias)을 꼭 설정해 줘야한다는 에러




GROUP BY(그룹 함수) 선언한 뷰에 데이터 삽입(INSERT)하기.

INSERT INTO EMP_SAL
VALUES(20, 900, 2800);
  • ERROR: "table or view does not exist"
    -->> "테이블이나 뷰가 존재하지 않음".
    • 그룹 함수로 선언한 경우 groupping된 원본 테이블이 없음
      • 뷰에 삽입(INSERT)된 데이터를 저장할 방법이 없음.




칼럼에 연산 값 선언한 뷰에 데이터 삽입(INSERT)하기.

CREATE OR REPLACE VIEW EMP_ANNUALSAL
AS
SELECT EMPNO, ENAME, SAL*12 AS AnnualSal
					-- AnnualSal은 SAL 연산 값
FROM EMP_COPY;
INSERT INTO EMP_ANNUALSAL
VALUES(222, 'BBBB', 18000);
  • ERROR : "virtual column not allowed here"
    -->> 뷰의 칼럼이 허용되지 않았음
    • 원본 테이블에 연산된 값인 AnnualSal 칼럼은 없음.
      • AnnualSal 데이터를 저장할 공간이 없음.




뷰 테이블에서 DISTINCT로 데이터 검색(SELECT)하기.

SELECT DISTINCT(JOB) FROM EMP_VIEW;
  • ERROR: "JOB": invalid identifier
    -->> "JOB" 칼럼은 유효하지 않은 식별자임.
    • 뷰 테이블에서 DISTINCT를 포함한 *DML은 사용할 수 없음.

*DML : 데이터 조작어, SELECT INSERT UPDATE DELETE를 말함.




복합 뷰


복합 뷰 생성(CREATE)하기.

복합 테이블을 만드는 형식으로 복합 뷰를 생성할 수 있음.

CREATE VIEW EMP_VIEW_DEPT
AS
SELECT E.EMPNO, E.ENAME, E.SAL, E.DEPTNO, D.DNAME, D.LOC
FROM EMP E, DEPT D
WHERE E.DEPTNO = D.DEPTNO
ORDER BY EMPNO DESC;




3. 뷰(VIEW) 삭제

뷰 테이블 삭제(DROP)하기.

DROP VIEW 형식으로 뷰 테이블 삭제할 수 있음.

DROP VIEW VIEW_SAL;




4. 뷰(VIEW) 옵션


FORCE와 NOFORCE 옵션

NOFORCE 옵션 이란?

: 원본 테이블이 없으면 뷰 테이블 생성 불가함.
: default 옵션임.

FORCE 옵션 이란?

: 원본 테이블이 없더라도 뷰 테이블 생성함.



FORCE 옵션 사용하여 뷰 테이블 생성(CREATE)하기.

CREATEFORCE 옵션을 선언하여 원본 테이블이 없더라도 뷰 테이블을 만들 수 있음

  • 극히 드문 경우지만, 기본 테이블이 없을 때 뷰 테이블을 만들어야 하는 경우 사용할 수 있음.

CREATE OR REPLACE FORCE VIEW NOTABLE_VIEW
AS
SELECT EMPNO, ENAME, DEPTNO
FROM EMPLOYEES
WHERE DEPTNO=30;
  • FORCE 옵션으로 뷰 강제 생성 가능함.

🧑🏻‍🏫 "FORCE로 뷰 테이블 생성은 가능하지만, 실무에서 사용할 일은 거의 없어요. FORCE는 그냥 알아두세요."




profile
그냥 은근슬쩍 살다 가긴 싫어

0개의 댓글