오늘은 DATABASE VIEW에 대한 개념정리입니다 😊
SELECT 쿼리의 실행 결과를 화면에 저장한 논리적 가상 테이블
실제 테이블과는 다르게 실질적 데이터를 저장하고 있진 않지만
사용자는 테이블을 사용하는 것과 동일하게 사용 가능
- 표현법
CREATE VIEW VIEW이름 AS SELECT문
☑️ 예시1
CREATE OR REPLACE VIEW V_EMPLOYEE
AS SELECT EMP_ID, EMP_NAME, DEPT_TITLE, NATIONAL_NAME
FROM EMPLOYEE
LEFT JOIN DEPARTMENT ON(DEPT_ID = DEPT_CODE)
LEFT JOIN LOCATION ON(LOCATION_ID = LOCAL_CODE)
LEFT JOIN NATIONAL USING(NATIONAL_CODE);
SELECT * FROM V_EMPLOYEE;
⤵️

☑️ 예시2
CREATE OR REPLACE VIEW V_EMP_JOB(사번, 이름, 직급, 성별, 근무년수)
AS SELECT EMP_ID, EMP_NAME, JOB_NAME,
DECODE(SUBSTR(EMP_NO, 8, 1), 1, ‘남’, 2, ‘여’),
EXTRACT(YEAR FROM SYSDATE) – EXTRACT(YEAR FROM HIRE_DATE)
FROM EMPLOYEE
JOIN JOB USING(JOB_CODE);
➡️ 서브쿼리의 SELECT절에 함수가 사용된 경우 반드시 별칭 지정

☑️ 예시3
1.
SELECT*FROM JOB;

CREATE OR REPLACE VIEW V_JOB(사번, 이름, 직급, 성별, 근무년수)
AS SELECT JOB_NAME, JOB_NAME
FROM JOB
JOIN JOB USING(JOB_CODE);
INSERT INTO V_JOB VALUES(‘J8’, ‘인턴’);
SELECT * FROM V_JOB;

➡️ 생성된 뷰를 가지고 DML구문(INSERT, UPDATE, DELETE) 사용 가능
➡️ 생성된 뷰에 요청한 DML구문이 베이스 테이블도 변경함
- 뷰 정의에 포함되지 않은 컬럼을 조작하는 경우
- 뷰에 포함되지 않은 컬럼 중에 베이스가 되는 컬럼이
NOT NULL 제약조건이 지정된 경우- 산술 표현식으로 정의된 경우
- 그룹함수나 GROUP BY절을 포함한 경우
- DISTINCT를 포함한 경우
- JOIN을 이용해 여러 테이블을 연결한 경우
CREATE OR REPLACE VIEW V_JOB2
AS SELECT JOB_CODE
FROM JOB;
INSERT INTO V_JOB2 VALUES(‘J8’, ‘인턴’);
➡️ 뷰 정의에 포함되지 않은 컬럼을 INSERT/UPDATE하는 경우 에러 발생
➡️ 단 DELETE는 가능
CREATE OR REPLACE VIEW V_JOB3
AS SELECT JOB_NAME
FROM JOB;
INSERT INTO V_JOB3 VALUES(‘인턴’);
➡️ 뷰에 포함되지 않은 NOT NULL제약조건이 있는 컬럼이 존재하면
➡️ INSERT/UPDATE 시 에러 발생
➡️단 DELETE는 가능
CREATE OR REPLACE VIEW EMP_SAL
AS SELECT EMP_ID, EMP_NAME, SALARY,
(SALARY + (SALARY*NVL(BONUS, 0)))*12 연봉
FROM EMPLOYEE;
INSERT INTO EMP_SAL VALUES(800, ‘정진훈’, 3000000, 4000000);
➡️ 뷰에 산술 계산식이 포함된 경우 INSERT/UPDATE 시 에러 발생
➡️ 단 DELETE는 가능
CREATE OR REPLACE VIEW V_GROUPDEPT
AS SELECT DEPT_CODE, SUM(SALARY) 합계, AVG(SALARY) 평균
FROM EMPLOYEE
GROUP BY DEPT_CODE;
INSERT INTO V_GROUPDEPT VALUES(‘D10’, 6000000, 4000000);
DELETE FROM V_GROUPDEPT WHERE DEPT_CODE = ‘D1’;
➡️ 그룹함수 또는 GROUP BY를 사용한 경우 INSERT/UPDATE/DELETE 시 에러 발생
CREATE OR REPLACE VIEW V_DT_EMP
AS SELECT DISTINCT JOB_CODE
FROM EMPLOYEE;
INSERT INTO V_DT_EMP VALUES(‘J9’);
DELETE FROM V_DT_EMP WHERE JOB_CODE = ‘J1’;
➡️ DISTINCT를 사용한 경우 INSERT/UPDATE/DELETE 시 에러 발생
CREATE OR REPLACE VIEW V_JOINEMP
AS SELECT EMP_ID, EMP_NAME, DEPT_TITLE
FROM EMPLOYEE
JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID);
INSERT INTO V_JOINEMP VALUES(888, ‘조세오’, ‘인사관리부’);
➡️ 뷰 정의 시 JOIN을 사용한 경우 INSERT/UPDATE 시 에러 발생
➡️ 단 DELETE는 가능
뷰 정의 시 사용한 쿼리 문장이 TEXT컬럼에 저장되어 있으며
뷰가 실행할 때는 TEXT에 기록된 SELECT에 문장이 다시 실행되면서
결과를 보여주는 구조SELECT * FROM USER_VIEWS;
1. OR REPLACE 옵션
생성한 뷰가 존재하면 뷰를 갱신함
2. FORCE/NOFORCE 옵션
FORCE옵션은 기본 테이블이 존재하지 않더라도 뷰 생성
NOFORCE 옵션이 기본 값으로 지정되어 있음
3. WITH CHECK OPTION 옵션
옵션을 설정한 컬럼의 값을 수정 불가능하게 함
4. WITH READ ONLY 옵션
뷰에 대해 조회만 가능하고 삽입, 수정, 삭제 등은 불가능하게 함
일반적으로 FROM절에 사용된 서브쿼리의 결과 화면에
별칭을 붙인 것을 말함
FROM절에 서브쿼리를 직접 사용해도 되고 따로 뷰를 생성 후
FROM절에 생성한 뷰를 사용해도 됨
VIEW에 대한 간단한 개념정리를 마치겠습니다 !
