[ 가상 테이블인 뷰 목차 ]
1. 뷰의 기본 다루기
1) 뷰의 기본 테이블
2) 뷰 정의하기
2. 뷰 고급 다루기
1) 뷰 사용하는 이유
2) 단순 뷰와 복합 뷰
3) 뷰 삭제 알아보기
3. 뷰 생성에 사용되는 다양한 옵션
1) OR REPLACE 옵션
2) FORCE 옵션
3) WITH CHECK OPTION
4) WITH READ ONLY 옵션
4. 뷰 활용하여 Top-N 구하기
1) ROWNUM 칼럼
2) Top-N 개념
[ 1 ] 뷰의 기본 다루기
- 뷰(View)
: 물리적인 테이블을 근거한 논리적인 가상 테이블
- 가상이란 단어는 실질적으로 데이터를 저장하고 있지 않기 때문에 붙인 것이고,
테이블이란 단어는 실질적으로 데이터를 저장하고 있지 않더라도
사용자는 마치 테이블을 사용하는 것과 동일하게 뷰를 사용할 수 있기 때문에 붙인 것이다.
- 뷰는 기본 테이블에서 파생된 객체로서 기본 테이블에 대한 하나의 쿼리문이다.
- 뷰(View)란 '보다'란 의미를 갖고 있는 점을 감안해 보면 알 수 있듯이
실제 테이블에 저장된 데이터를 뷰를 통해서 볼 수 있도록 한다.
사용자에게 주어진 뷰를 통해서 기본 테이블을 제한적으로 사용하게 된다.
* 메인테이블을 바탕으로 일부의 칼럼이라던지
특정 ROW 데이터의 값을 가져오는,,
-- 2개의 칼럼을 가져와서 보이는 것
SELECT * FROM EMP;
SELECT EMPNO, ENAME FROM EMP;
-- 특정 ROW의 데이터만 가져오는 것
SELECT * FROM EMP
WHERE DEPTNO = 10;
1. 뷰의 기본 테이블
- 뷰는 이미 존재하고 있는 테이블에 제한적으로 접근하도록 한다.
- 뷰를 생성하기 위해서는 실질적으로 데이터를 저장하고 있는
물리적인 테이블이 존재해야 하는데 이 테이블을
기본 테이블이라고 한다.
-- 뷰의 기본 테이블 생성하기
DROP TABLE DEPT_COPY;
CREATE TABLE DEPT_COPY
AS
SELECT * FROM DEPT;
DROP TABLE EMP_COPY;
CREATE TABLE EMP_COPY
AS
SELECT * FROM EMP;
SELECT * FROM DEPT_COPY;
SELECT * FROM EMP_COPY;
-- 아래 쉅 내용 코드 --
DROP TABLE DEPT_COPY;
CREATE TABLE DEPT_COPY
AS
SELECT * FROM DEPT;
SELECT * FROM DEPT_COPY; -- 뷰의 기본 테이블 1
DROP TABLE EMP_COPY;
CREATE TABLE EMP_COPY
AS
SELECT * FROM EMP;
SELECT * FROM EMP_COPY; -- 뷰의 기본 테이블 2
2. 뷰 정의하기
- 테이블을 생성하기 위해서 CREATE TABLE로 시작하지만,
뷰를 생성하기 위해서는 CREATE VIEW로 시작한다.
AS 다음은 마치 서브 쿼리 문과 유사하다.
* 뷰는 마치 테이블과 같이 사용한다.
칼럼이 많아지고 복잡해지면 SELECT 다음으로 나오는 서브 쿼리들을
뷰로 만들어서 간편하게 테이블처럼 사용할 수 있다.
-- 형식
CREATE [OR REPLACE] [FORCE | NOFORCE] VIEW view_name
[(alias, alias, alias, ...)]
AS subquery
[WITH CHECK OPTION]
[WITH READ ONLY];
-- 뷰를 생성할 권한이 불충분한 경우
CREATE OR REPLACE VIEW EMP_VIEW30
AS
SELECT EMPNO, ENAME, SAL, DEPTNO
FROM EMP_COPY
WHERE DEPTNO=30; -- SQL Error: ORA-01031: insufficient privileges
CONN system/sys
GRANT CREATE VIEW TO scott; -- system계정으로 로그인하여 뷰를 생성할 수 있는 권한을 부여한다.
CONN scott/tiger
SELECT * FROM EMP_VIEW30;
-- 뷰 정의하기
DROP VIEW EMP_VIEW30;
CREATE VIEW EMP_VIEW30
AS
SELECT EMPNO, ENAME, DEPTNO
FROM EMP_COPY
WHERE DEPTNO=30;
DESC EMP_VIEW30;
SELECT * FROM EMP_VIEW30;
-- 아래 쉅 내용 코드 --
-- 뷰 정의하기
-- 뷰는 마치 테이블과 같이 사용한다.
-- 칼럼이 많아지고 복잡해지면 SELECT 다음으로 나오는 서브쿼리들을
-- 뷰로 만들어서 간편하게 테이블처럼 사용할 수 있다.
CREATE VIEW EMP_VIEW30
AS
SELECT EMPNO, ENAME, SAL, DEPTNO FROM EMP_COPY
WHERE DEPTNO=30;
-- EMP_COPY 테이블에서 EMPNO, ENAM, SAL, DEPTNO 칼럼을 가져오는데
-- DEPTNO=30인 데이터만 가져와서 뷰를 만드는 것
SELECT * FROM EMP_VIEW30;
[ 2 ] 뷰 고급 다루기
1. 뷰를 사용하는 이유
- 뷰를 사용하는 이유 두 가지
- 복잡하고 긴 쿼리문을 뷰로 정의하면 접근을 단순화시킬 수 있다.
- 보안에 유리하다.
- 사용자마다 특정 객체만 조회할 수 있도록 권한을 부여를 할 수 있기에
동일한 테이블을 접 근하는 사용자마다에 따라 서로 다르게 보도록
여러 개의 뷰를 정의해 놓고 특정 사용자만이 해당 뷰에 접근할 수 있도록 한다.
2. 단순 뷰와 복합 뷰
- 뷰는 뷰를 정의하기 위해서 사용되는 기본 테이블의 수에 따라
단순 뷰(Simple View)와 복합 뷰(Complex View)로 나뉜다.
단순 뷰 | 복합 뷰 |
하나의 테이블로 생성된다. | 여러개의 테이블로 생성된다. |
그룹 함수의 사용이 불가능하다. | 그룹 함수의 사용이 가능하다. |
DISTINCT 사용이 불가능 | DISTINCT 사용이 가능 |
DML 사용 가능 | DML 사용 불가능 |
-- 14-2-2. 단순 뷰와 복합 뷰
-- 각 부서마다 봐야하는 칼럼들이 다르다.
-- 그래서 데이터를 제한시켜서 특정 칼럼의 데이터만 가져와서 뷰로 만들어
-- 필요한 사람이 볼 수 있도록 하는 것,,
-- 여러개의 테이블을 조인해서 만드는 뷰 : 복합 뷰
-- 하나의 테이블을 가지고 만드는 뷰 : 단순 뷰
-- 단순 뷰의 칼럼에 별칭 부여하기
DESC EMP_VIEW30;
CREATE OR REPLACE
VIEW EMP_VIEW (사원번호, 사원명, 부서번호) -- 칼럼의 별칭을 각각 사원번호, 사원명, 부서번호로 지정해줬다.
AS
SELECT EMPNO, ENAME, DEPTNO
FROM EMP_COPY;
SELECT * FROM EMP_VIEW;
-- 복합 뷰 만들기
CREATE VIEW EMP_VIEW_DEPT
AS
SELECT E.EMPNO, E.ENAME, E.SAL, E.DEPTNO, D.DNAME, D.LOC
FROM EMP E, DEPT D
WHERE E.DEPTNO = D.DEPTNO
ORDER BY EMPNO DESC;
-- 다음의 코드는 서브쿼리
SELECT E.EMPNO, E.ENAME, E.SAL, E.DEPTNO, D.DNAME, D.LOC
FROM EMP E, DEPT D
WHERE E.DEPTNO = D.DEPTNO
ORDER BY EMPNO DESC;
SELECT * FROM EMP_VIEW_DEPT;
-- EMP와 DEPT 테이블을 조인하여 특정한 칼럼만 가져와서 뷰를 만든 것
-- 복잡한 쿼리문장을 뷰로 만들어서 필요한 데이터만 골라서 가져오는,, 뷰의 장점,,?
3. 뷰 삭제 알아보기
-- 뷰 삭제하기
SELECT VIEW_NAME, TEXT
FROM USER_VIEWS;
SELECT * FROM EMP_VIEW;
DROP VIEW EMP_VIEW;
SELECT * FROM EMP_VIEW;
[ 3 ] 뷰 생성에 사용되는 다양한 옵션
1. 뷰 수정을 위한 OR REPLACE 옵션
- CREATE OR REPLACE VIEW를 사용하면
존재하지 않은 뷰이면 새로운 뷰를 생성하고
기존에 존 재하는 뷰이면 그 내용을 변경한다.
* 뷰를 수정하려면 기존에 있던 뷰를 DROP 해서 지운 후
수정한 뷰를 다시 새로 만들어줘야 한다. --> 너무 번거로움,,
OR REPLACE VIEW를 사용하면
기존에 있는 뷰인 경우에는 내용을 변경해주고
없는 뷰인 경우에는 뷰를 새로 만들어주는 역할을 한다.
CREATE OR REPLACE VIEW EMP_VIEW30
AS
SELECT EMPNO, ENAME, SAL, COMM, DEPTNO
FROM EMP_COPY
WHERE DEPTNO=30;
-- 아래 쉅 내용 코드 --
-- 14-3-1. 뷰 수정 : OR REPLACE 옵션
-- 뷰를 수정하려면 기존에 있던 뷰를 DROP 해서 지운 후
-- 수정한 뷰를 다시 새로 만들어줘야 한다. --> 너무 번거로움,,
-- OR REPLACE VIEW를 사용하면 기존에 있는 뷰면 내용을 변경해주고
-- 없는 뷰이면 새로 만들어주는 역할을 한다.
CREATE OR REPLACE VIEW EMP_VIEW_DEPT
AS
SELECT EMPNO, ENAME, D.DNAME, D.LOC
FROM EMP E, DEPT D
WHERE E.DEPTNO = D.DEPTNO
ORDER BY EMPNO DESC;
2. 기본 테이블 없이 뷰를 생성하기 위한 FORCE 옵션
- 뷰를 생성하는 경우에 일반적으로 기본 테이블이 존재한다는
가정 하에서 쿼리문을 작성한다.
- 극히 드물기는 하지만, 기본 테이블이 존재하지 않는 경우에도
뷰를 생성해야 할 경우가 있습니다.
이럴 경우에 사용하는 것이 FORCE 옵션이다.
- FORCE 옵션과 반대로 동작하는 것으로서 NOFORCE 옵션이 있다.
- NOFORCE 옵션은 반드시 기본 테이블이 존재해야 할 경우에만 뷰가 생성된다.
- 특별한 설정이 없으면 디폴트로 NOFORCE 옵션이 지정된 것이므로 간주한다.
-- FORCE 옵션으로 기본 테이블 없이 뷰 생성하기
DESC EMPLOYEES
CREATE OR REPLACE VIEW EMPLOYEES_VIEW
AS
SELECT EMPNO, ENAME, DEPTNO
FROM EMPLOYEES
WHERE DEPTNO=30; -- SQL Error: ORA-00942: table or view does not exist
CREATE OR REPLACE FORCE VIEW NOTABLE_VIEW
AS
SELECT EMPNO, ENAME, DEPTNO
FROM EMPLOYEES
WHERE DEPTNO=30;
SELECT VIEW_NAME, TEXT
FROM USER_VIEWS;
-- NOFORCE는 뷰 생성의 디폴트값으로 FORCE의 반대 기능을 가진 옵션이다.
CREATE OR REPLACE NOFORCE VIEW EXISTTABLE_VIEW
AS
SELECT EMPNO, ENAME, DEPTNO
FROM EMPLOYEES
WHERE DEPTNO=30; -- SQL Error: ORA-00942: table or view does not exist
SELECT VIEW_NAME, TEXT
FROM USER_VIEWS;
CREATE OR REPLACE VIEW EXISTTABLE_VIEW
AS
SELECT EMPNO, ENAME, DEPTNO
FROM EMPLOYEES
WHERE DEPTNO=30;
-- 아래 쉅 내용 코드 --
-- 14.3.2 기본 테이블 없이 뷰를 생성 : FORCE 옵션
DESC EMPLOYEES;
CREATE OR REPLACE FORCE VIEW EMPLOYEES_VIEW
AS
SELECT EMPNO, ENAME, DEPTNO
FROM EMPLOYEES
WHERE DEPTNO=30;
-- EMPLOYEES 라는 기본테이블이 없는 상태에서 EMPLOYEES_VIEW 뷰를 만들려고 함 --> 원래는 뷰 생성안됨
-- 하지만 FORCE 키워드를 적어서 옵션을 해주면 경고와 함께 뷰가 생성된다,,
SELECT VIEW_NAME, TEXT
FROM USER_VIEWS;
-- EMPLOYEES_VIEW 뷰가 생성된것을 볼 수 있다.
3. 조건 칼럼값을 변경하지 못하게 하는 WITH CHECK OPTION
- WITH CHECK OPTION
: 뷰를 생성할 때 조건 제시에 사용된 컬럼 값을
변경 못하도록 하는 기능을 제공한다.
CREATE OR REPLACE VIEW VIEW_CHK30
AS
SELECT EMPNO, ENAME, SAL, COMM, DEPTNO
FROM EMP_COPY
WHERE DEPTNO=30 WITH CHECK OPTION;
UPDATE VIEW_CHK30 SET DEPTNO=20
WHERE SAL>=1200;
SELECT * FROM VIEW_CHK30;
-- 아래 쉅 내용 코드 --
-- 14-3-3. WITH CHECK OPTION
-- 뷰 생성할 때 조건 제시에 사용된 컬럼 값을 변경 못하도록 하는 기능
CREATE OR REPLACE VIEW VIEW_CHK30
AS
SELECT EMPNO, ENAME, SAL, COMM, DEPTNO
FROM EMP_COPY
WHERE DEPTNO=30 WITH CHECK OPTION;
SELECT * FROM VIEW_CHK30;
-- EMP_COPY 테이블에서 DEPTNO=30인 EMPNO, ENAME, SAL, COMM, DEPTNO 칼럼들을 가져와서 VIEW_CHK30 뷰를 생성한다.
SELECT * FROM VIEW_CHK30
WHERE DEPTNO=20;
-- VIEW_CHK30 뷰는 DEPTNO=30인 애들밖에 없어서 DEPTNO=20인 데이터를 찾으려고 하면 아무것도 안나온다.
UPDATE VIEW_CHK30
SET DEPTNO=20
WHERE SAL>=1200;
-- 데이터를 업데이트 하는데 SAL 값이 1200일때 DEPTNO 값을 20으로 바꾸라는 것.
-- 그런데 위에서 VIEW_CHK30을 만들때 WITH CHECK OPTION 옵션을 적어줘서
-- DEPTNO=30을 DEPTNO=20으로 변경하는 것을 바꾸지 못하게 막혀있기 때문에 실행이 안된다.
[ WITH CHECK OPTION 옵션 추가 안 하고 뷰 생성하게 되는 경우 ]
* WITH CHECK OPTION 옵션을 추가 안하고 뷰를 생성해서
뷰의 조건 제시 WHERE 절인 DEPTNO=30을 DEPTNO=20으로
변경하여 업데이트가 가능한 것이다!
4. 기본 테이블 변경을 막는 WITH READ ONLY 옵션 WITH CHECK OPTION 비교
- WITH READ ONLY 옵션
: 뷰를 통해서는 기본 테이블의 어떤 칼럼에 대해서도
내용을 절대 변경할 수 없도록 하는 것이다.
* 보완적인 이유로
A라는 시스템에서 B라는 시스템에
데이터를 볼 때 데이터를 수정 못하게 제약하는 것
<-- WITH READ ONLY 사용
만일, WITH READ ONLY를 사용 안 하면
뷰를 수정하게 되면 뷰 생성될 때 사용한 메인테이블의 데이터도 같이 수정되게 된다.
UPDATE VIEW_CHK30 SET COMM=1000;
SELECT * FROM VIEW_CHK30;
CREATE OR REPLACE VIEW VIEW_READ30
AS
SELECT EMPNO, ENAME, SAL, COMM, DEPTNO
FROM EMP_COPY
WHERE DEPTNO=30 WITH READ ONLY;
UPDATE VIEW_READ30 SET COMM=1000;
SELECT * FROM VIEW_READ30;
-- 아래 쉅 내용 코드 --
-- WITH READ ONLY 옵션
CREATE OR REPLACE VIEW VIEW_CHK30
AS
SELECT EMPNO, ENAME, SAL, COMM, DEPTNO
FROM EMP_COPY
WHERE DEPTNO=30;
UPDATE VIEW_CHK30
SET DEPTNO=20;
SELECT * FROM VIEW_CHK30;
SELECT * FROM EMP_COPY;
-- VIEW_CHK30 뷰를 바꾼건데 EMP_COPY테이블의 데이터 값도 같이 수정이 되었다.
-- EMP_COPY에서 DEPTNO=30이 다 DEPTNO=20으로 바뀌었다.
-- 우리는 이걸 원치 않는다!! 뷰를 통해서 테이블이 변경되지 않도록 하고 싶다!!
CREATE OR REPLACE VIEW VIEW_READ30
AS
SELECT EMPNO, ENAME, SAL, COMM, DEPTNO
FROM EMP_COPY
WHERE DEPTNO=30 WITH READ ONLY;
SELECT * FROM VIEW_READ30;
UPDATE VIEW_READ30
SET DEPTNO=20;
-- cannot perform a DML operation on a read-only view 오류 발생
SELECT EMPNO, ENAME, SAL, COMM, DEPTNO
FROM EMP_COPY
WHERE DEPTNO=30;
-- 아무것도 안나온다.
-- 위에서 DEPTNO=30이 다 DEPTNO=20으로 바뀌었기 때문에 아무것도 안나온다.
[ 4 ] 뷰 활용하여 Top-N 구하기 ( 매우 매우 중요함!! )
- TOP-N을 구하기 위해서는 ROWNUM과 인라인 뷰가 사용된다.
* ROWNUM : ROW 행에 NUM 번호가 있다는 것
ROWNUM의 순서는 해당 테이블에 데이터가
입력이 된 순서이다.
1. ROWNUM 칼럼 성격 파악하기
SELECT ROWNUM, EMPNO, ENAME, HIREDATE
FROM EMP;
SELECT EMPNO, ENAME, HIREDATE
FROM EMP
ORDER BY HIREDATE;
SELECT ROWNUM, EMPNO, ENAME, HIREDATE
FROM EMP
ORDER BY HIREDATE;
-- 아래 쉅 내용 코드 --
-- 14-4-1. ROWNUM 컬럼의 성격 파악하기
-- 해당 테이블에 데이터가 입력된 순서를 나타낸다.
SELECT ROWNUM, EMPNO, ENAME, HIREDATE
FROM EMP;
-- ENAME으로 정렬을 해보면 ROWNUM 값이 순서대로 안나온다.
SELECT ROWNUM, EMPNO, ENAME, HIREDATE
FROM EMP
ORDER BY ENAME ASC;
-- SMITH 는 ROWNUM 1번이다.
2. 인라인 뷰로 구하는 TOP-N의 개념
- 인라인 뷰
: 메인 쿼리의 SELECT 문의 FROM 절 내부에 사용된 서브 쿼리문
- 우리가 지금까지 생성한 뷰는 CREATE 명령어로 뷰를 생성했지만,
인라인 뷰는 SQL 문 내부에 뷰를 정의하고 이를 테이블처럼 사용한다.
-- 급여(SAL)를 많이 받는 6~10째 사원을 출력하기 위해서는 인라인 뷰안에 또 다른 인라인 뷰를 사용해야 한다.
-- 또한 ROWNUM 칼럼에 별칭을 부여해야 검색이 가능하다.
SELECT ROWNUM, RNUM, ENAME, SAL FROM
(SELECT ROWNUM RNUM, ENAME, SAL FROM
(SELECT * FROM EMP ORDER BY SAL DESC))
WHERE RNUM BETWEEN 6 AND 10;
-- 아래 쉅 내용 코드 --
--14-4-2. 인라인 뷰로 구하는 TOP-N 의 개념
-- 급여(SAL)를 많이 받는 6~10째 사원을 출력하기
SELECT * FROM EMP ORDER BY SAL DESC; -- 얘를 서브 쿼리로 사용해서 출력한다!
-- KING 이 1번이다.
SELECT ROWNUM, ENAME, SAL
FROM (SELECT * FROM EMP ORDER BY SAL DESC); -- SMITH는 ROWNUM 5번이다.
-- (SELECT * FROM EMP ORDER BY SAL DESC)로부터 새로운 가상의 테이블을 만든 것이다.
SELECT RNUM, ENAME, SAL
FROM (SELECT ROWNUM RNUM, ENAME, SAL
FROM (SELECT * FROM EMP ORDER BY SAL DESC))
WHERE RNUM BETWEEN 6 AND 10;
-- RNUM이 일종의 칼럼이 되는 것이다
(SELECT ROWNUM RNUM, ENAME, SAL
FROM (SELECT * FROM EMP ORDER BY SAL DESC));
[ Tip : MySQL에서 ROW COUNT 방법 ]
SELECT @no:=@no+1 AS no, article_no, writer_id, title, regdate
FROM article, (SELECT @no:=0) article
ORDER BY article_no DESC;
[ 과제 - 14 - 01. TXT ]
Q. 사원 테이블(EMP)에서 가장 최근에 입사한 사원들 중에 3~5번째의 사번과 사원명을 출력하는 SQL문을 작성하세요.
A.
* 주의할 점!
--> ROWNUM 칼럼에 별칭을 부여해야만 검색이 가능하다..
별칭 부여 안해주고 ROWNUM으로 검색하면 아무것도 안나온다,,
'DataBase' 카테고리의 다른 글
15_시퀀스 (0) | 2022.12.20 |
---|---|
13_ 데이터 무결성을 위한 제약 조건 (0) | 2022.12.19 |
12_ 데이터 읽기 일관성과 락 (0) | 2022.12.16 |
11_ 트랜잭션 관리 (0) | 2022.12.16 |
10_ DML (0) | 2022.12.15 |