<뷰>
-
뷰: 가상의 테이블. 직접 테이블에 접근하는 것이 아니라 테이블에서 사용자가 필요로 하는 부분만 선택하여 만들어놓은 데이터의 집합. 가상의 테이블
-
원본 테이블에 직접 접근하지 않아도 사용자가 임의의 뷰를 구성하여 별도의 이름을 붙이거나 접근 가능한 사람들 지정할 수 있음 -> 데이터의 보안 유지
-
복잡한 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 (200, 4, 5000, 1000);
|
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 |