본문 바로가기

Learning/SQL

<뷰>

 

  • 뷰: 가상의 테이블. 직접 테이블에 접근하는 것이 아니라 테이블에서 사용자가 필요로 하는 부분만 선택하여 만들어놓은 데이터의 집합. 가상의 테이블

  • 원본 테이블에 직접 접근하지 않아도 사용자가 임의의 뷰를 구성하여 별도의 이름을 붙이거나 접근 가능한 사람들 지정할 수 있음 -> 데이터의 보안 유지

  • 복잡한 SQL문을 매번 작성하지 않도록 할 수 있음

 

 

<뷰의 특징>

 

  • 기본테이블로부터 유도된 테이블이기 때문에 기본 테이블과 같은 형태의 구조를 사용. 조작도 거의 비슷

  • 가상 테이블이기 때문에 물리적으로 구현되어 있지 않음

  • 필요한 데이터만 뷰로 정의해서 처리하여 관리가 용이

  • 뷰를 통해서만 데이터에 접근하게 하면 뷰에 나타나지 않는 데이터를 안전하게 보호가능

 

 


 

  • 단순한 view 만들기 EMP_V1 (하나의 원본테이블 사용, 함수나 그룹 사용 안함, DML 사용가능)

1
2
3
4
5
6
7
8
9
DROP VIEW EMP_V1; --미리 뷰 삭제 명령
 
--employees 테이블에서 필요한 열들을 골라서 뷰로 생성
CREATE VIEW EMP_V1
AS
SELECT employee_id, last_name, email, hire_date, job_id
FROM employees;
 
SELECT * FROM emp_v1;
cs

 

 

 

 


 

1
2
3
4
5
6
7
--테이블처럼 DML 사용가능 (뷰는 가상의 테이블=>원본 테이블에 입력됨)
INSERT INTO EMP_V1
    (employee_id, last_name, email, hire_date, job_id)
VALUES (333'David''DAVID', SYSDATE,'IT_PROG');
 
--뷰에 입력된 데이터 확인
SELECT * FROM emp_v1;

 

 

 

1
SELECT * FROM employees;
cs

뷰를 통해서 입력한 데이터가 employees 테이블에 들어가 있다.

 

 


 

 

  • 뷰 삭제하기

 

DELETE FROM emp_v1

WHERE employee_id = 333;

commit;

 

1
2
3
DELETE FROM emp_v1
WHERE employee_id = 333;
commit;
cs

 

 

 


 

 

  • 뷰 테이블 emp_v2 만들기

1
2
3
4
5
6
7
CREATE VIEW emp_v2
AS
SELECT employee_id 직원번호, last_name 이름,
       email, hire_date, job_id
FROM employees;
 
SELECT * FROM emp_v2;
cs

 

 

 

 


 

 

  • 뷰 테이블 emp_v3 만들기

1
2
3
4
5
6
CREATE VIEW emp_v3 (직원번호, 이름, 이메일, 고용일자, 직종)
AS
SELECT employee_id, last_name, email, hire_date, job_id
FROM employees;
 
SELECT * FROM emp_v3;
cs

 

 

 


 

  • DML 사용 (emp_v3)

1
2
3
4
INSERT INTO emp_v3 (직원번호, 이름, 이메일, 고용일자, 직종)
VALUES (334'LaLa''LaLa', SYSDATE, 'IT_PROG');
 
SELECT * FROM emp_v3;
cs

 

 

 

 

emp_v1, emp_v2, emp_v3, 원본인 employees 테이블에도 334번이 들어가 있음.

 

 

 


 

 

  • 복잡한 뷰 만들기 (그룹함수를 사용한 뷰는 DML 사용 불가)

1
2
3
4
5
6
7
8
CREATE VIEW 부서별_직원_보고서
AS
SELECT department_id 부서번호, count(employee_id) 직원수,
    MAX(salary) 최고급여, MIN(salary) 최저급여
FROM employees
GROUP BY department_id;
 
SELECT * FROM 부서별_직원_보고서;
cs

 

 

 

 


 

1
2
INSERT INTO 부서별_직원_보고서
VALUES (200450001000);
cs

 

 


 

  • 부서번호 기준으로 오름차순 정렬을 하고 싶다면? 이미 만든 테이블을 삭제하고 다시 만들어야 한다. 그럴때 OR REPLACE 명령어를 통해 중복된 테이블이 있다면 삭제할 필요 없이 대체하여 만들 수 있다.

1
2
3
4
5
6
7
CREATE OR REPLACE VIEW 부서별_직원_보고서
AS
SELECT department_id 부서번호, count(employee_id) 직원수,
    MAX(salary) 최고급여, MIN(salary) 최저급여
FROM employees
GROUP BY department_id
ORDER BY 부서번호;
cs

 

 

 

1
2
3
4
5
6
7
8
9
CREATE OR REPLACE VIEW 부서별_직원_보고서
AS
SELECT department_id 부서번호, count(employee_id) 직원수,
    MAX(salary) 최고급여, MIN(salary) 최저급여,
    ROUND(AVG(salary)) 평균급여
FROM employees
GROUP BY department_id
ORDER BY 부서번호;
SELECT * FROM 부서별_직원_보고서;
cs

 

 

 


  • 읽기 전용 뷰 (옵션 WITH READ ONLY)

 

1
2
3
4
5
6
7
8
CREATE OR REPLACE VIEW EMP_V_read
AS
SELECT employee_id, last_name, email,
   hire_date, job_id, department_id
FROM employees
WHERE department_id = 90
WITH READ ONLY; --읽기 전용
SELECT * FROM emp_v_read;
cs

 

 

 

1
2
--DML 사용 불가
DELETE FROM EMP_V_READ; --모든 행 삭제
cs

 

 

 


 

  • 체크 옵션 뷰

1
2
3
4
5
6
7
CREATE OR REPLACE VIEW emp_v_check
AS
SELECT employee_id, last_name, email,
    hire_date, job_id, department_id
FROM employees
WHERE department_id = 90
WITH check option; --where절의 조건에서만 수정 및 입력 가능
cs

 

 

1
SELECT * FROM emp_v_check;
cs

 

 

 


 

  • 90번 부서 일때만 DML 가능

1
2
3
INSERT INTO emp_v_check (employee_id, last_name, email,
    hire_date, job_id, department_id)
VALUES (444'알리''ALI', SYSDATE, 'IT_PROG'10);
cs

 

 

 

1
2
3
INSERT INTO emp_v_check (employee_id, last_name, email,
    hire_date, job_id, department_id)
VALUES (444'알리''ALI', SYSDATE, 'IT_PROG'90);
cs

 

 

 

 

'Learning > SQL' 카테고리의 다른 글

시퀀스  (0) 2020.06.23
인덱스  (0) 2020.06.22
테이블 컬럼(열)의 추가/수정/삭제  (0) 2020.06.22
제약조건의 삭제  (0) 2020.06.22
제약조건의 추가 및 수정  (0) 2020.06.22