✅ VIEW 특징
✅ VIEW 장단점
장점
단점
✅ VIEW 종류
많은 테이블들을 조인한 복합 뷰 형태
CREATE OR REPLACE VIEW emp_view // 뷰 생성
AS
SELECT employee_id, first_name, last_name, email
FROM employees;
-- 모든 정보들을 주는것이 아닌, 필요한 데이터만 요구했을 때, 필요한 데이터만 만들어서 뷰를 만듬
💡 VIEW와 WITH의 차이점
-> VIEW는 한번 생성하면 DROP할 때까지 계속 존재하며 WITH는 단일사용할 쿼리내에 정의되어 있는경우, 해당 쿼리문안에서만 실행된다.
✅ 뷰 DML, DDL 적용
CREATE [옵션] VIEW VIEW명칭 AS SELECT문
// 관리자 계정으로 계정에다가 CREATE 권한을 먼저 줘야한다!
GRANT CREATE VIEW TO 계정이름;
// 다시 권한받은 계정으로 돌아와서
CREATE VIEW V_EMP // V_EMP라는 뷰 생성 (이미 있는 테이블 안의 내용을 복사)
AS SELECT * FROM EMPLOYEE JOIN DEPARTMENT ON DEPT_CODE = DEPT_ID;
// 부서별 직책별 급여의 평균을 구하는 SELECT 문
CREATE VIEW V_AVG_DEPTJOB
AS
SELECT DEPT_CODE, AVG(SALARY) AS AVG_SALARY FROM EMPLOYEE GROUP BY ROLLUP(DEPT_CODE)
UNION
SELECT JOB_CODE, AVG(SALARY) FROM EMPLOYEE GROUP BY ROLLUP(JOB_CODE);
SELECT * FROM V_AVG_DEPTJOB
WHERE AVG_SALARY >= 3000000 AND DEPT_CODE IS NOT NULL;
// 평균연봉이 300만원이상이고 부서코드가 있는 것들만 출력
// VEMP 테이블은 DEPARTMENT와 EMPLOYEE 테이블이 연결되어있어서 그 테이블의 컬럼들을 수정가능
UPDATE V_EMP SET DEPT_CODE='D3' WHERE EMP_NAME = '월드컵';
UPDATE V_EMP SET EMP_NAME = '최주영' WHERE EMP_NAME = '월드컵';
SELECT * FROM EMPLOYEE; // VIEW가 수정됬으면 실제 테이블도 수정됨
UPDATE V_AVG_DEPTJOB SET AVG_SALARY = 10000000; // 가상 컬럼(AVG_SALARY)은 수정 불가능함
CREATE VIEW V_EMPTEST // EMPLOYEE 단일 테이블만 이용해서 VIEW 만들기
AS SELECT EMP_ID, EMP_NO, EMP_NAME, EMAIL, PHONE, JOB_CODE, SAL_LEVEL FROM EMPLOYEE;
// 단일 테이블이므로 INSERT 가능함
INSERT INTO V_EMPTEST VALUES('997','981011-1234123','홍길동','HONG@HONG.COM','12341234','J1','S1');
// V_EMP 테이블은 DEPARTMENT와 EMPLOYEE가 JOIN 된 뷰 테이블이며
// 단일테이블이 아니므로 값 삽입 불가능!
INSERT INTO V_EMP VALUES('996','홍길동','980110-1234567','HONG@HONG.COM','12345','D5','J1','S1',100
,0.2,206,SYSDATE,NULL,'N','D0','되니','L3');
DELETE FROM V_EMPTEST WHERE EMP_ID = '997';
DELETE FROM V_EMP WHERE EMP_NAME = '방명수';
DROP VIEW emp_view; // emp_view 뷰 삭제
✅ 뷰 만들 때 선택옵션
CREATE OR REPLACE VIEW V_EMP // 테이블이 덮여쓰이게됨 (조심해서 사용해야함)
AS SELECT * FROM EMPLOYEE;
// TT 테이블이 없는 상태로 VIEW 테이블만 생성
CREATE FORCE VIEW V_TT AS SELECT * FROM TT;
// VIEW 테이블과 연결할 비어있는 TT 테이블 생성
CREATE TABLE TT(
TTNO NUMBER,
TTNAME VARCHAR2(200)
);
CREATE OR REPLACE VIEW V_CHECK
AS SELECT EMP_ID, EMP_NAME, SALARY, DEPT_CODE
FROM EMPLOYEE
WHERE DEPT_CODE = 'D5' WITH CHECK OPTION; // DEPT_CODE 컬럼은 수정하지 못함
UPDATE V_CHECK SET DEPT_CODE = 'D6' WHERE EMP_NAME = '하이유'; // 수정못함
// 하지만 다른 컬럼들은 수정 가능함!
CREATE OR REPLACE VIEW V_CHECK
AS SELECT EMP_ID, EMP_NAME, SALARY, DEPT_CODE
FROM EMPLOYEE
WHERE DEPT_CODE = 'D5' WITH READ ONLY; // 이 VIEW 테이블에서 모든 컬럼 수정 불가능함!