뷰(view)

9mond·2023년 7월 26일
0
post-thumbnail
post-custom-banner
  • 하나의 가상 테이블
  • 작업을 하다보면 자주 조회하는 데이터들이 있다. 또 한 테이블에 데이터가 있으면 조회하기 편하겠지만 그렇지 않은 경우가 있다. 여러 테이블들을 JOIN해서 가져오고 쿼리가 복잡한 경우도 있다. 이러한 경우 쿼리로 뷰를 만들어 놓고 사용하면 편리하다.
  • 뷰는 보안에 유리하다.
  • 테이블에 데이터를 노출시키고 싶지 않을 때, 뷰를 사용하여 보여줄 데이터만 뷰로 제공할 수 있다.

1. 뷰의 특징

  • 원천 데이터가 변경되면 view 데이터도 자동 변경
  • 뷰의 검색은 자유로우나, 삽입, 수정, 삭제는 제약이 있다.
  • 뷰 생성 쿼리에 함수를 사용하면 반드시 alias를 지정
  • view는 table과 유사하며, table처럼 사용한다.
  • table과는 달리 데이터를 저장하기 위한 물리적인 공간이 필요하지 않은 가상 테이블이다.
  • 데이터를 물리적으로 갖지 않지만, 논리적인 집합을 갖는다.
  • table과 마찬가지로 select, insert, update, delete명령이 가능하다.
 /* view */
CREATE VIEW v_emp( emp_id, first_name, job_id, hiredate, dept_id )
AS
SELECT EMPLOYEE_ID , FIRST_NAME , JOB_ID , HIRE_DATE , DEPARTMENT_ID 
FROM EMPLOYEES e 
WHERE  JOB_ID = 'ST_CLERK'
;

SELECT * FROM v_emp;

-- view 삭제
DROP VIEW V_EMP ;

---------------------------------------
CREATE OR REPLACE VIEW v_emp(emp_id, first_name, job_id, hiredate, dept_id)
AS
SELECT NVL(EMPLOYEE_ID, ''), NVL(FIRST_NAME, '') , JOB_ID , HIRE_DATE , DEPARTMENT_ID  
FROM EMPLOYEES e 
;
SELECT * FROM v_emp;

-- 102 Lex
-- 함수로 작성된 부분은 수정 불가
UPDATE V_EMP SET FIRST_NAME = 'kim'
WHERE FIRST_NAME  = 'Lex';

----------------------------------------------------------------------------
CREATE OR REPLACE VIEW v_emp2(emp_id, first_name, job_id, hiredate, dept_id)
AS
SELECT NVL(EMPLOYEE_ID, ''), FIRST_NAME, JOB_ID , HIRE_DATE , DEPARTMENT_ID  
FROM EMPLOYEES e 
;
SELECT * FROM v_emp2;

-- 102 Lex
-- 함수로 작성된 부분은 수정 불가
UPDATE V_EMP2 SET FIRST_NAME = 'kim'
WHERE FIRST_NAME  = 'Lex';
SELECT * FROM EMPLOYEES e WHERE EMPLOYEE_ID = 102;

--UPDATE EMPLOYEES SET FIRST_NAME = 'Lex'
SELECT * FROM EMPLOYEES e 
WHERE EMPLOYEE_ID = 102;

/*
 * view  : v_emp_salary
 * 		   emp_id, last_name, salary, annual_sal
 * annual_sal	: (급여 + 급여 * commition_pct) * 12
 */
CREATE OR REPLACE VIEW v_emp_salary(emp_id, last_name, salary, annual_sal)
AS 
SELECT EMPLOYEE_ID , LAST_NAME , SALARY
	, (SALARY + (SALARY * nvl(COMMISSION_PCT, 0))) * 12
FROM EMPLOYEES e 
;
SELECT * FROM V_EMP_SALARY ves  ;


CREATE OR REPLACE VIEW v_emp_salary2(emp_id, last_name, salary, annual_sal)
AS 
SELECT EMPLOYEE_ID , LAST_NAME , SALARY
	, (SALARY + (SALARY * nvl(COMMISSION_PCT, 0))) * 12
FROM EMPLOYEES e 
WITH READ ONLY
;
SELECT * FROM V_EMP_SALARY2 ves  ;
UPDATE V_EMP_SALARY2 SET last_name = 'Kim'
WHERE last_name = 'Austin';

/*
 *  1.
 *  view		: v_samp1
 * 			: employee_id, last_name, department_id, hire_date
 * 	조건		: 급여가 4000이상이고, 50번 부서, job_id가 'ST_MAN'
 */
CREATE OR REPLACE VIEW v_samp1(employee_id, last_name, department_id, hire_date)
AS
SELECT EMPLOYEE_ID , LAST_NAME , DEPARTMENT_ID , HIRE_DATE 
FROM EMPLOYEES e 
WHERE SALARY >= 4000
AND DEPARTMENT_ID = 50
AND JOB_ID = 'ST_MAN'
;
SELECT * FROM V_SAMP1 vs ;

/*
 *  2.
 *  view	: v_samp2
 * 			: emp_id, name, department_id, hire_date
 * 조건		: 50번 부서, name 출력시 first_name + ' ' + last_name
 */
CREATE OR REPLACE VIEW v_samp2(emp_id, name, department_id, hire_date)
AS
SELECT EMPLOYEE_ID , FIRST_NAME || ' ' || LAST_NAME , DEPARTMENT_ID , HIRE_DATE 
FROM EMPLOYEES e 
WHERE DEPARTMENT_ID = 50
;
SELECT * FROM V_SAMP2 vs ;



/*
 *  3.
 *  view	: v_samp3
 * 			: 사번, 이름, 부서번호, 부서명, 입사일
 * 조건		: 이름 first_name + ' ' + last_name
 */
CREATE OR REPLACE VIEW v_samp3(사번, 이름, 부서번호, 부서명, 입사일)
AS
SELECT e.EMPLOYEE_ID , e.FIRST_NAME || ' ' || e.LAST_NAME , d.DEPARTMENT_ID ,d.DEPARTMENT_NAME,  e.HIRE_DATE  
FROM EMPLOYEES e 
	LEFT OUTER JOIN DEPARTMENTS d 
	ON e.DEPARTMENT_ID  = d.DEPARTMENT_ID 
;
SELECT * FROM V_SAMP3;
 
profile
개발자
post-custom-banner

0개의 댓글