이름을 가지고 있는 select 문장
-- emp50이라는 이름으로 뷰 생성
CREATE VIEW emp50
AS
SELECT employee_id, last_name, salary, department_id
FROM employees
WHERE department_id = 50 ;
-- 검색가능
SELECT * FROM emp50 ;
-- emp60이라는 이름으로 뷰 생성
CREATE VIEW emp60
AS
SELECT employee_id, last_name, salary, department_id
FROM employees
WHERE department_id = 60 ;
-- 검색가능
SELECT * FROM emp60 ;
-- emp50과 emp60이 검색됨
SELECT *
FROM user_views ;
-- 아래 두 문장은 같은 내용이 검색됨
SELECT * FROM emp50 ;
SELECT *
FROM (SELECT employee_id, last_name, salary, department_id
FROM employees
WHERE department_id = 50) ;
sub-query = view
의 영역
SELECT *
FROM (SELECT employee_id, last_name, salary, department_id
FROM employees
WHERE department_id = 50) ;
-- 실제 데이터가 저장되지 않을 뿐, 갱신은 가능
UPDATE emp50
SET salary = 9000
,department_id = 60
WHERE employee_id = 120 ;
-- employee_id = 120이 검색되지 않음
SELECT *
FROM emp50 ;
-- salary = 9000, department_id = 60으로 조회됨
SELECT *
FROM employees
WHERE employee_id = 120 ;
- 데이터 액세스 제한
- 복합 query를 단순화
- 데이터 독립성 제공
- 동일한 데이터의 다른 뷰 제공
CREATE |OR REPLACE| |FORCE|NOFORCE| VIEW view
[ (alias[, alias]...) ]
AS subquery
[WITH CHECK OPTION [CONSTRAINT constraint]]
[WITH READ ONLY [CONSTRAINT constraint]];
FORCE
: 뷰를 강제적으로 테이블보다 먼저 만들고 싶을 때 사용-- 둘다 가능
describe emp50
desc emp50
CREATE VIEW emp50
AS SELECT employee_id, last_name, salary*12 AS ANNSAL,
department_id
FROM employees
WHERE department_id = 50 ;
📌 salary*12
: *
은 컬럼명으로 사용 불가하기 때문에 별칭 필수!
✔️ CREATE OR REPLACE VIEW
절
CREATE OR REPLACE VIEW emp50
AS
SELECT employee_id, last_name, salary*12 AS ANNSAL, department_id
FROM employees
WHERE department_id = 50 ;
그룹함수를 포함하는 복합 뷰 생성
-- 예제
CREATE OR REPLACE VIEW dept_sum_vu (name, minsal, maxsal, avgsal)
AS
SELECT d.department_name, MIN(e.salary), MAX(e.salary),AVG(e.salary)
FROM employees e JOIN departments d
USING (department_id)
GROUP BY d.department_name ;
단순 뷰에서는 대개 DML 작업 수행 가능
✔️ 뷰에 다음 항목이 포함되어 있으면, 행 제거(delete) 불가능
- 그룹 함수
GROUP BY
절DISTINCT
키워드- pseudocolumn
ROWNUM
키워드
ROWNUM
: 행 번호. 각각의 행마다 순차적으로 증가되는 번호
✔️ 뷰의 데이터 수정(update) 불가능
- 그룹 함수
GROUP BY
절DISTINCT
키워드- pseudocolumn
ROWNUM
키워드- 표현식
✔️ 데이터 추가(insert) 불가능
- 그룹 함수
GROUP BY
절DISTINCT
키워드- pseudocolumn
ROWNUM
키워드표현식
으로 정의된 열- 뷰에서 선택되지 않은 기본 테이블에서 기본값이 없는
NOT NULL
열
- 뷰를 생성할 때 일부만 데이터를 추출해서 생성할 수 있으므로
제약이 있는 경우 DML문이 실행되지 않을 수 있음
-- 오류발생
DELETE dept_sum_vu
WHERE name = 'Administration' ;
-- 가능
DELETE emp50
WHERE employee_id = 125 ;
-- 오류발생: 표현식 포함. update 불가능
UPDATE emp50
SET annsal = annsal * 1.2
WHERE employee_id = 120 ;
제약조건 정의 가능 (제약을 걸 수 있음)
뷰에 수행된 DML 작업이 뷰 영역에만 적용되도록 할 수 있음
-- 제약조건 정의됨
-- department_id가 60이 아닌 행을 INSERT하거나
-- 뷰에 있는 임의의 행에서 부서번호를 UPDATE하려는 시도는
-- WITH CHECK OPTION을 위반하므로 실패함
CREATE OR REPLACE VIEW emp60
AS
SELECT employee_id, last_name, salary, department_id
FROM employees
WHERE department_id = 60
WITH CHECK OPTION CONSTRAINT emp60_ck ;
-- 갱신됨
UPDATE emp60
SET department_id = 70
WHERE employee_id = 103 ;
WITH READ ONLY
를 사용해서 읽기 전용 모드로 만들어줌
CREATE OR REPLACE VIEW emp60
AS
SELECT employee_id, last_name, salary, department_id
FROM employees
WHERE department_id = 60
WITH READ ONLY ;
DROP VIEW view;