1. 뷰(VIEW)의 개념
뷰(VIEW) - 가상 테이블
: 실제 있는 테이블이 아니라 기존의 다른 테이블을 참조한 테이블
- 실제 테이블에 있는 데이터 테이블을 뷰를 통해서 일부 데이터만 보이는 것.
뷰의 기본 테이블
- 실제(↔가상) 테이블을 사용하는 것처럼 동일하게 사용 할 수 있음.
- 뷰 테이블에서 데이터를 '수정'하거나 '변경'하면
원본 테이블도 변경됨. - 뷰 테이블의 강점은, 원본 테이블의 복잡한 SQL문(예를들어 SUB쿼리, 동등조인 등..)을 단순화 할 수 있음.
2. 뷰(VIEW) 사용
뷰 테이블 생성(CREATE)
-- 뷰테이블을 생성
CREATE VIEW TESTVIEW
AS
SELECT EMPNO, ENAME, DEPTNO
FROM EMP_COPY -- 만들어둔 EMP 복사 테이블
WHERE DEPTNO=30;
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에서도 삽입된 데이터 확인 가능함.
- EMP_COPY에서도 삽입된 데이터 확인 가능함.
3. 뷰(VIEW) 종류
단순 뷰
- 단순 뷰는 *DML 명령어를 사용하여 조작이 가능함.
- 하지만, 몇 가지 요인으로 에러를 발생 시킴.
*DML : 데이터 조작어, SELECT INSERT UPDATE DELETE를 말함.
원본 테이블 NOT NULL칼럼에 영향 받는 뷰에 데이터 삽입(INSERT)하기.
- 원본 테이블의 칼럼 중에 NOT NULL 제약 조건이 지정되어 있는 경우
- 뷰 테이블에서 NOT NULL 칼럼에 INSERT로 값을 넣어줄 수 없으면 에러 발생함.
-->> 뷰 칼럼으로 가져오지 않은 원본 칼럼은 원본 테이블에 NULL로 저장되기 때문에 NOT NULL이 있으면 곤란함.
- 뷰 테이블에서 NOT NULL 칼럼에 INSERT로 값을 넣어줄 수 없으면 에러 발생함.
뷰 테이블에 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)을 꼭 설정해 줘야한다는 에러
- error : "must name this expression with a column alias"
GROUP BY(그룹 함수) 선언한 뷰에 데이터 삽입(INSERT)하기.
INSERT INTO EMP_SAL
VALUES(20, 900, 2800);
- ERROR: "table or view does not exist"
-->> "테이블이나 뷰가 존재하지 않음".- 그룹 함수로 선언한 경우 groupping된 원본 테이블이 없음
- 뷰에 삽입(INSERT)된 데이터를 저장할 방법이 없음.
- 그룹 함수로 선언한 경우 groupping된 원본 테이블이 없음
칼럼에 연산 값 선언한 뷰에 데이터 삽입(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 데이터를 저장할 공간이 없음.
- 원본 테이블에 연산된 값인 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;
4. 뷰(VIEW) 삭제
뷰 테이블 삭제(DROP)하기.
DROP VIEW 형식으로 뷰 테이블 삭제할 수 있음.
DROP VIEW VIEW_SAL;
5. 뷰(VIEW) 옵션
FORCE와 NOFORCE 옵션
NOFORCE 옵션 이란?
: 원본 테이블이 없으면 뷰 테이블 생성 불가함.
: default 옵션임.
FORCE 옵션 이란?
: 원본 테이블이 없더라도 뷰 테이블 생성함.
FORCE 옵션 사용하여 뷰 테이블 생성(CREATE)하기.
CREATE에 FORCE 옵션을 선언하여 원본 테이블이 없더라도 뷰 테이블을 만들 수 있음
- 극히 드문 경우지만, 기본 테이블이 없을 때 뷰 테이블을 만들어야 하는 경우 사용할 수 있음.
CREATE OR REPLACE FORCE VIEW NOTABLE_VIEW
AS
SELECT EMPNO, ENAME, DEPTNO
FROM EMPLOYEES
WHERE DEPTNO=30;
- FORCE 옵션으로 뷰 강제 생성 가능함.
🧑🏻🏫 "FORCE로 뷰 테이블 생성은 가능하지만, 실무에서 사용할 일은 거의 없어요. FORCE는 그냥 알아두세요."
출처:https://velog.io/@dingcomiii/%EA%B0%80%EC%83%81-%ED%85%8C%EC%9D%B4%EB%B8%94%EB%B7%B0VIEW-0921
'새싹 DBA > Oracle' 카테고리의 다른 글
[오라클] 프로시저 생성 후 실행시 권한 오류 ORA-06550 (0) | 2024.07.22 |
---|---|
[오라클] CURSOR 개념과 사용법 OPEN CLOSE LOOP (0) | 2024.07.22 |
[오라클] WITH 절 (1) | 2024.07.22 |
[오라클] WITH / VIEW 개념과 차이 (0) | 2024.07.22 |
[오라클] DBLINK로 IMPDP 오류 ORA-31631, ORA-39149 (0) | 2024.07.05 |