본문 바로가기
SQL

뷰(View)

by hj_it 2024. 2. 26.

-  뷰는 실제로 데이터를 저장하고 있지 않으며, 논리적으로만 존재.

 

- 뷰 생성

CREATE [OR REPLACE][FORCE | NOFORCE] VIEW 뷰 (컬럼 ... )
AS (SELECT 문장 : sub query)
[WITH CHECK OPTION [CONSTRAINT constrant_name]]
[WITH READ ONLY [CONSTRAINT constrant_name]];

- OR REPLACE: ALTER VIEW를 대체한다.

                         : SEGMENT가 아님

‐ FORCE: 기반 테이블 없이 뷰를 생성한다.

‐ WITH CHECK OPTION: 뷰에 의해서 검색 가능한 행만 DML 작업이 가능하도록 제약한다.

‐ WITH READ ONLY: 뷰를 통해서는 SELECT만 가능하도록 제한한다.

 

- 뷰 삭제 및 확인

DROP VIEW 뷰;

SELECT view_name, text FROM user_views;

- text: 뷰 생성 서브 쿼리

        : LONG 타입으로 설정이 필요하다.

 

 

- 인라인 뷰(Inline View)

SELECT ...                               
FROM  (SELECT 문장 : sub query)  [별명]

‐ 인라인 뷰는 FROM절에 쓰인 서브쿼리다.

‐ 인라인 뷰는 문장이 실행되는 동안만 존재하는 뷰이다.

‐ 인라인 뷰는 일반 뷰와 동일하게 조인이나 검색에 이용된다.

 

 

실습

1. 사원의 년봉을 검색할 수 있는 뷰를 생성한다.

CREATE VIEW v_1 (사번, 이름, 연봉)
AS SELECT eno, ename, TO_CHAR(sal*12+NVL(comm,0),'999,999')
   FROM emp;

2. 학생의 학점 4.5 만점으로 환산된 정보를 검색할 수 있는 뷰를 생성한다.

CREATE VIEW v_2 (학번, 이름, 학점)
AS SELECT sno, sname, TO_CHAR(avr*4.5/4.0, '9.00')
   FROM student;

3. 각 과목별 평균 점수를 검색할 수 있는 뷰를 생성한다.

CREATE VIEW v_3 (과목번호, 과목명, 점수)
AS SELECT c.cno, cname, TO_CHAR(avg(result), '99.0')
   FROM course c, score sc
   WHERE c.cno = sc.cno
   GROUP BY c.cno, cname;

4. 각 직원과 관리자의 이름을 검색할 수 있는 뷰를 생성한다.

CREATE VIEW v_4 (사번, 이름, 관리자사번, 관리자이름)
AS SELECT e1.eno, e1.ename, e1.mgr, e2.ename
   FROM emp e1, emp e2
   WHERE e1.mgr = e2.eno;

5. 각 과목별로 평가 점수가 F인 학생을 검색할 뷰를 생성한다.

CREATE VIEW v_5 (과목번호, 과목명, 학번, 이름, 등급)
AS SELECT c.cno, cname, s.sno, sname, grade
  FROM course c, student s, score sc, scgrade g
  WHERE c.cno = sc.cno AND s.sno = sc.sno AND result BETWEEN loscore AND hiscore
  AND grade = 'F'
  ORDER BY c.cno;

6. 각 과목별로 기말고사가 일등인 학생의 명단을 검색할 뷰를 생성한다.

CREATE VIEW v_6 (과목번호, 과목명, 학번, 이름, 점수)
AS SELECT c.cno, cname, s.sno, sname, TO_CHAR(result, '999')
  FROM course c, score sc, student s
  WHERE c.cno = sc.cno AND s.sno = sc.sno
  AND (result, c.cno) IN (SELECT MAX(result),c.cno FROM score sc, course c 
                        WHERE c.cno = sc.cno GROUP BY c.cno)
  ORDER BY c.cno;

7. 물리학과 교수의 과목을 수강하는 학생의 명단을 검색할 뷰를 생성한다.

CREATE VIEW v_7 (교수학과, 교수명, 과목명, 학번, 이름)
AS SELECT section, pname, cname, s.sno, sname
  FROM student s, professor p, course c, score sc
  WHERE s.sno = sc.sno AND p.pno = c.pno AND c.cno = sc.cno
  AND section = '물리'
  ORDER BY c.cno;

'SQL' 카테고리의 다른 글

시퀀스(Sequence)  (0) 2024.02.26
Top-N 분석과 RANK  (1) 2024.02.26
인덱스 구조와 이해  (0) 2024.02.26
제약 조건 UK, NOT NULL, CHECK  (0) 2024.02.26
제약 조건 PK, FK  (0) 2024.02.26