1. View의 정의
    VIEW의 동작 원리
    VIEW를 사용하는 이유

    VIEW의 특징

2. VIEW생성,
3. View 옵션
      VIEW 삭제
      VIEW목록 조회
      OR RELPACE VIEW

      FORCE
      WITH CHECK OPTION
      WITH READ ONLY

4. View 종류
    1.단순 VIEW
       1.  INSERT/UPDATE/DELETE 사용
       2. 별칭 부여
       3. 그룹 함수를 사용

    2.복합 VIEW
       1. JOIN을이용해 두개 이상의 테이블을 씀
5. View 활용

 

 

1. Concept of View

  • VIEW는 한마디로 물리적인 테이블을 근거한 논리적인 가상 테이블이라고 정의할 수 있다.
  • VIEW는 기본 테이블에서 파생된 객체로서 기본 테이블에 대한 하나의 쿼리문이다
  • 실제 테이블에 저장된 데이터를 VIEW를 통해 볼 수 있다
  • VIEW는 물리적인 구조인 테이블과 달리 데이터 저장 공간이 없다. VIEW는 단지 쿼리문을 저장하고 잇는 객체라고 표현 할 수 있다

 

 VIEW의 동작 원리

① 사용자가 뷰에 대해서 질의를 하면 USER_VIEWS에서 VIEW에 대한 정의를 조회한다

② 기본 테이블에 대한 VIEW의 접근 권한을 살펴본다

③ VIEW에 대한 질의를 기본테이블에 대한 질의로 변환한다

④ 검색된 결과를 출력한다

 

 VIEW를 사용하는 이유

  • 보안성: 직접적인 테이블 접근을 제한하기 위해서 사용된다.
  • 편의성: 복잡한 질의 쉽게 만들기 위해 사용된다

 VIEW의 특징

  • VIEW는 테이블에 대한 제한을 가지고 테이블의 일정한 부분만 보일 수 있는 가상의 테이블이다
  • VIEW는 실제 자료를 갖지는 않지만, VIEW를 통해 테이블을 관리 할 수 있다.
  • 하나의 테이블에 VIEW의 갯수는 제한이 없다.
  • VIEW통해서 작업하는건 보통 조회할때 사용한다 (연산식에 제한이 많아서)

 

 

 

2. VIEW 생성과 조회

 일단 VIEW는 권한부여를 해야 사용할 수 있다 SYS로 접근하여 권한을 부여한다.

GRANT CREATE VIEW TO hr;

 

기본 테이블 준비 (HR로 접속

: VIEW에 의해 제한적으로 접근해서 사용하는 물리적인 테이블(실질적으로 데이터를 저장하고 있음)

--예제2) VIEW 컬럼을 4개로 한정해보자
CREATE TABLE EMP01
AS
SELECT EMPLOYEE_ID , FIRST_NAME , SALARY, DEPARTMENT_ID
FROM EMPLOYEES;

--예제2) EMPLOYEES만큼 컬럼이 있음
CREATE TABLE EMP02
AS
SELECT EMPLOYEE_ID , FIRST_NAME , SALARY, DEPARTMENT_ID
FROM EMPLOYEES;

 

 VIEW 생성과 조회

: 가상 테이블 View_EMP01를 통해 칼럼을 2개로 선정하고 부서번호가30인 사원만 나오도록 조건도 걸어보자

CREATE OR REPLACE VIEW View_EMP01
AS
SELECT EMPLOYEE_ID, DEPARTMENT_ID
FROM EMP01
WHERE DEPARTMENT_ID=30;
SELECT*FROM View_EMP01;

 

 

3. VIEW 옵션

 VIEW 삭제

: VIEW는 실체가 없는 가상 테이블이기 때문에 뷰를 삭제한다는 것은 USER_VIEWS 데이터 딕셔너리에 저장되어 있는 VIEW의 정의를 삭제하는 것을 의미한다.

DROP VIEW VIEW_EMP01;

 

• VIEW : 생성한 뷰 목록들 조회

: 사용자가 생성한 모든 뷰에 대한 정의가 저장되어 있다

SELECT VIEW_NAME, TEXT
FROM USER_VIEWS;

 

• OR RELPACE VIEW : 뷰 생성,수정

: 존재하지 않은 VIEW이면 새로운 VIEW를 생성하고 기존에 존재하는 VIEW이면 그 내용을 변경한다.

CREATE OR REPLACE VIEW VIEW_EMP01
AS
/*SELECT EMPLOYEE_ID, FIRST_NAME, SALARY, DEPARTMENT_ID > */ SELECT FIRST_NAME, SALARY	
FROM EMP01
/*WHERE DEPARTMENT_ID=30; > */ WHERE SALARY=2500;

 

FORCE : 기본테이블 없이 뷰생성

: FORCE 을 VIEW앞에 추가하면 기본 테이블의 존재 여부에 상관없이 뷰를 생성한다

CREATE OR REPLACE FORCE VIEW VIEW_NOTABLE (사원번호,사원명,급여,부서번호)
AS
SELECT EMPLOYEE_ID , FIRST_NAME , SALARY, DEPARTMENT_ID
FROM EMP01;
SELECT*FROM VIEW_NOTABLE;

 

WITH CHECK OPTION : 지정한 컬럼값을 변경하지 못하게 함

: WITH CHECK OPTION 옵션은 뷰 생성시 조건으로 지정한 칼럼 값을 변경하지 못하도록 한다.

CREATE OR REPLACE VIEW VIEW_CHK
AS 
SELECT EMPLOYEE_ID, FIRST_NAME, SALARY, DEPARTMENT_ID 
FROM EMP01 
WHERE DEPARTMENT_ID=20 WITH CHECK OPTION;
UPDATE VIEW_CHK 
SET DEPARTMENT_ID =10  --급여가 5000이상인 사원을 10번 부서로 이동하는 쿼리문
WHERE SALARY>=5000;  --부서번호에 옵션을지정하였으므로 이 뷰를 통해서는 부서번호를 변경할수 없다

 

WITH READ ONLY : 뷰를 이용해서 칼럼값 바꾸지 못하게 함

: 뷰를 통해서는 기본 테이블의 컬럼의 내용을 절대 변경할 수 없도록 한다. 

CREATE OR REPLACE VIEW VIEW_READ
AS 
SELECT EMPLOYEE_ID, FIRST_NAME, SALARY, DEPARTMENT_ID
FROM EMP01
WHERE DEPARTMENT_ID=30 WITH READ ONLY;
UPDATE VIEW_READ 
SET DEPARTMENT_ID=1000; -- 오류발생

 

4. VIEW의 종류

단순 VIEW 복합 VIEW
하나의 TABLE로 생성 여러 개의 TABLE로 생성
그룹 함수의 사용이 불가능 그룹 함수의 사용이 가능
DISTINCT 사용이 불가능 DISTINCT 사용이 가능
DML(INSERT/UPDATE/DELETE) 사용 가능
DML(INSERT/UPDATE/DELETE) 사용 불가능

 

※ 단순 뷰에 DML 명령어로 조작 불가능한 경우

  • VIEW정의에 포함되지 않은 칼럼 중에 기본 테이블의 칼럼이 NOT NULL 제약 조건이 지정되어 있는 경우 INSERT문이 사용 불가능하다
  • SALARY*12 와 같이 산술 표현식으로 정의된 가상 칼럼이 뷰에 정의되면 INSERT나 UPDATE가 불가능하다
  • DISTINCT을 포함한 경우에도 DML 명령을 사용할 수 없다.
  • 그룹 함수나 GROUP BY절을 포함한 경우에도 DML명령을 사용할 수 없다

 

1) VIEW에 대한 데이터 조작

: 단순 VIEW에서는 INSERT/UPDATE/DELETE사용 가능

더보기
CREATE OR REPLACE VIEW View_EMP01
AS
SELECT EMPLOYEE_ID , FIRST_NAME , SALARY, DEPARTMENT_ID
FROM EMP01
WHERE DEPARTMENT_ID=30;
SELECT * FROM VIEW_EMP01;
INSERT INTO VIEW_EMP01
VALUES(250,'ANGER',7000,30);

SELECT*FROM VIEW_EMP01;

단순 VIEW를 대상으로 실행한 DML 명령문의 결과는 뷰를 정의할 때 사용한 기본 테이블을 적용한다

 

 

2) VIEW의 컬럼에 별칭 부여하기

더보기
CREATE OR REPLACE VIEW VIEW_EMP02
AS
SELECT EMPLOYEE_ID 사원번호, FIRST_NAME 사원명, SALARY 급여, DEPARTMENT_ID 부서번호
FROM EMPLOYEES;

CREATE OR REPLACE VIEW VIEW_EMP02 (사원번호,사원명,급여,부서번호)
AS
SELECT EMPLOYEE_ID , FIRST_NAME , SALARY, DEPARTMENT_ID
FROM EMP01;
SELECT * 
FROM VIEW_EMP02
WHERE 부서번호 =10;	--> EMPLOYEE_ID는 못쓴다

칼럼의 별칭을 사용해서 뷰를 생성하면 VIEW_EMP02의 칼럼 이름만 별칭으로 데이터 구조에 반영되서

EMP01 테이블의 원래 칼럼 이름에는 전혀 영향을 주지 못한다.

 

3) 그룹 함수를 사용한 단순 VIEW

: 함수를 사용하여 얻은 컬럼은 반드시 이름을 설정해 주어야 한다.

CREATE OR REPLACE VIEW VIEW_SALARY
AS
SELECT DEPARTMENT_ID , SUM(SALARY) AS "SalarySum",TRUNC(AVG(SALARY)) "SalaryAvg"
FROM EMP01
GROUP BY DEPARTMENT_ID
ORDER BY DEPARTMENT_ID;
SELECT * FROM VIEW_SALARY;

 

4) 복합 VIEW (JOIN)

: 두 개 이상의 기본 테이블(JOIN)에 의해 정의된 뷰

CREATE VIEW VIEW_EMP_DEPT
AS
SELECT E.EMPLOYEE_ID,E. FIRST_NAME, E.SALARY, E.DEPARTMENT_ID, D.DEPARTMENT_NAME
FROM EMPLOYEES E INNER JOIN DEPARTMENTS D	--> USE INNER JOIN 
ON E.DEPARTMENT_ID=D.DEPARTMENT_ID
ORDER BY DEPARTMENT_ID DESC;
SELECT * FROM VIEW_EMP_DEPT;

 

 

 

5. VIEW 활용

ROWNUM 칼럼 이용

: 오라클에서 지원하는 가상컬럼(Pseudo Column)으로 쿼리의 결과에 가상으로 행번호를 1부터 부여한다.

주로 페이징처리, TOP-N QUERY에 사용한다

 

ROWNUM 주의사항

ROWNUM은 첫번째 값이 할당 된 이후부터 증가한다.

그러므로 다음과 같은 쿼리는 아무것도 반환하지 않는다

SELECT * FROM EMP WHERE ROWNUM > 1;	--(X)

--ROWNUM이 1보다 큰값을 추출하고싶다면
SELECT * FROM (SELECT E.*, ROWNUM R FROM EMP E) WHERE R > 1;	--(O)
/* 이렇게서브쿼리에서 별칭을 붙여서 가상컬럼인 ROWNUM을 진짜 컬럼으로 만들어줬다.
테이블에서 조건을 판별하기위해 행을 가져올때마다 ROWNUM을 부여하지 않고 서브쿼리가 만들어질때 고정된 값을 가지게된다.
그리고 R이라는 별칭을 부여해서 바깥에서 조건을 걸 수 있게 된다. */

 

 

 

SELECT ROWNUM, EMPLOYEE_ID, FIRST_NAME, HIRE_DATE
FROM EMPLOYEES;

 

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

PL / SQL  (0) 2022.04.03
시퀀스  (0) 2022.04.03
Sub Query  (0) 2022.04.03
JOIN  (0) 2022.04.03
무결성 제약 조건 *  (0) 2022.04.03