뷰(view)
Q. 월간 인터뷰 연재를 시작하게 된 동기는 무엇인가.
사실 본인은 구글에서 블로그를 운영중이다. 하지만 방문자가 본인 밖에 없기에(웃음) 독자들을 만들어 보고자 연재를 시작했다.
Q.뷰(View)는 무엇인가? 설명해주시라.
뷰는 테이블이다. 다만 실질적으로 데이터를 저장하고 있지 않는다.
뷰는 기본 테이블에서 파생된 객체. 기본 테이블에 대한 하나의 쿼리문(select).*
*뷰 = SELECT로 도출된 결과 테이블
Q.그럼 굳이 뷰를 쓰는 이유는 무엇인가?
복잡한 테이블에서 데이터를 간단하게 도출하고 싶어서. 보안문제.
Q.뷰를 정의해 보아라. 어떻게 사용하는 지 도저히 이해가 가지 않는다.
CREATE [OR REPLACE] [FORCE* | NOFORCE] VIEW view_name [(alias, alias, alias, ...)]
AS subquery
[WITH CHECK OPTION]*
[WITH READ ONLY]*;
보기엔 복잡할 것이다. 요약하면 다음과 같다.
CREATE VIEW emp_view
AS
SELECT * FROM EMP;
*OR REPLACE: 이 부분은 본인이 이해하지 못하였다(웃음).
*FORCE: 기본 테이블의 존재 여부 상관없이 뷰 생성.
*WITH CHECK OPTION: 이 옵션 사용하면, 해당 뷰를 통해서 볼 수 있는 범위 내에서만 UPDATE/INSERT가 가능함. NOT NULL, PK 설정은 선택 사항 .
*WITH READ ONLY: 이 옵션에서는 오직 SELECT만 사용 가능.
ex) 30번 부서에 소속된 사원들의 사번과 이름과 부서번호를 자주 검색
SELECT EMPNO, ENAME, DEPTNO
FROM EMP_COPY
WHERE DEPTNO=30;
이 쿼리를 여러번 검색하면 귀찮지 않은가. 그래서 VIEW를 만드는 것.
CREATE VIEW EMP_VIEW30
AS
SELECT EMPNO, ENAME, DEPTNO
FROM EMP_COPY
WHERE DEPTNO=30;
이제 뷰 패키지에서 EMP_VIEW30을 필요할 때마다 열어볼 수 있다.
Q. 그렇다면 뷰를 열 수 있는 사람은 누구인가?
디폴트는 데이터를 가진 본인이 열 수 있다.
또, 사용자 편집에 들어가면 ‘시스템 권한’ 설정이 있다.
내가 타 계정을 선택하고 권한을 부여하면, 그 계정으로도 뷰를 열 수 있다.
이 때 주의점은, 타 계정에서도 약간의 설정이 필요하다.
하지만 설정 방법은 본인이 기억을 하지 못 하니 구글링 하시라.
Q. 추가적으로 하고 싶은 말이 있는가?
앞으로 뷰를 배우는 공부쟁이들에게 뷰에 관해 이 말은 해주고 싶다.
뷰를 만든 후, 뷰 안에서 SELECT를 사용하여 테이블을 도출해 볼 수 있다.
예를 들면,
SELECT VIEW_NAME, TEXT
FROM USER_VIEWS;
요로코롬 말이다.
Q. 굳이 알아야 할까 싶지만, 뷰의 동작원리는 무엇인가?
1. 사용자가 뷰에 대해서 질의를 하면 USER_VIEWS에서 뷰에 대한 정의를 조회합니다.(바로 윗 질문을 참고하시라(웃음))
2 기본 테이블에 대한 뷰의 접근 권한을 살핀다.
3. 뷰에 대한 질의를 기본 테이블에 대한 질의로 변환합니다.
4. 기본 테이블에 대한 질의를 통해 데이터를 검색합니다.
5. 검색된 결과를 출력합니다.
Q. 앞에서 뷰를 생성하는 법을 배웠다. 이제 삭제하는 법을 알려주시라.
DROP VIEW VIEW_SAL;
삭제 문법은 언제나 그렇듯 간단하다.
Q. 그렇다면 실제로 적용해보자. 사원 중에서 입사일이 빠른 사람 5명(TOP-5)만 뽑아보아라.
귀찮다. 하지만 시작했으니까 어쩌겠는가. 달려야지 뭐 어떡해.
TOP-N을 구하기 위해서는 ROWNUM과 인라인 뷰가 사용된다.
(1)
CREATE OR REPLACE VIEW VIEW_HIRE
AS
SELECT EMPNO, ENAME, HIREDATE
FROM EMP
ORDER BY HIREDATE;
(2)
SELECT ROWNUM, EMPNO, ENAME, HIREDATE
FROM VIEW_HIRE;
(3)
SELECT ROWNUM, EMPNO, ENAME, HIREDATE
FROM VIEW_HIRE
WHERE ROWNUM<=5;
ROWNUM은 INDEX 개념과 상당히 유사하다. HIREDATE로 정렬한 다음, ROWNUM을 주면 TOP-N을 구할 수 있다. 그 다음 TOP-5를 구하는 방법은 다들 알지 않는가(웃음).
Q. 인라인 뷰에 대해 설명을 빠뜨렸다.
인라인 뷰란, 메인 쿼리의 SELECT 문의 FROM 절 내부에 사용된 서브 쿼리문이다.
우리는 지금까지 CREATE 명령어로 뷰를 생성했다. 인라인 뷰는 이와 다르게 SQL문 내부에 (FROM 절)안에 뷰를 정의하고 이를 테이블 처럼 활용한다.
예를 들면,
SELECT ROWNUM, EMPNO, ENAME, HIREDATE
FROM ( SELECT EMPNO, ENAME, HIREDATE
FROM EMP
ORDER BY HIREDATE)
WHERE ROWNUM<=5;
또 다른 테이블이 메인 쿼리의 라인(line) 안(in)에 있지 않은가. 그래서 인라인이다.
댓글 없음:
댓글 쓰기