database/Oracle

[Oracle] View

솧이 2022. 9. 4. 14:35

View

가상의 테이블.

실제 table에는 데이터가 있지만 view에는 데이터는 없고 SQL만 저장한다

view에 접근할 때는 view에 들어있던 SQL의 수행된 결과를 가져오는 것이다

view를 사용하는 목적 : 특정 테이블의 특정 column이 보여지면 안되는 경우

                                     편의성 : 여러 개 테이블을 join하는 게 매번 귀찮을 때 아예 그것을 view로 만들어 놓으면 편하다

 

 

-오라클의 경우 View 를 생성하려면 권한이 부여 되어야 한다.  시스템 계정으로 아래와 같이 하자.
-grant create view to [USER] 

-grant create procedure to [USER]

 

 

view 종류

단순 view (simple view)

복합 view (complex view)

인라인 view (inline view)

 

단순 view (simple view)

view를 생성할 sub query에 join 조건이 들어가지 않고 1개의 테이블로 만들어지는 간단한 view이다

구문 : CREATE [OR REPLACE] VIEW 뷰명 [컬럼명] AS (sub query)

 

[실습] #8101*

sub query 내용으로 view를 생성한다

v_prof은 테이블처럼 동작한다

* OR REPLAVE VIEW 를 하면 기존에 있는 걸 덮어씌기 한다

  CREATE VIEW로 하면 SQL Error [955] [42000]: ORA-00955: name is already used by an existing object 에러가 뜬다

CREATE OR REPLACE VIEW v_prof
AS 
SELECT profno, name, email, hpage
FROM t_professor;

-- 실제로 물리적으로 테이블이 존재하는 것은 아니다
SELECT * FROM v_prof;

 

* view 생성 시 별도의 column 이름을 지정할 수 있다

CREATE OR REPLACE VIEW v_prof(pfno, nm, em, hp)
AS 
SELECT pfno, nm, em, hp
FROM t_professor;

SELECT * FROM v_prof;

--테이블과 같이 어깨를 견주어 나온다
SELECT tname FROM tab;

 

* 어떤 select문도 view로 만들 수 있다

*  특정 table이 외부로 노출되는 걸 꺼릴 때 view를 만들고 자주 사용하는 query문이 길 때 view로 정의하면

  편리하게 사용할 수 있다

 

[실습] #8102

CREATE OR REPLAVE VIEW v_prof_dept
AS 
SELECT p.profno "교수번호", p.name "교수이름", d.dname "소속학과명"
FROM t_professor p, t_department d
WHERE p.profno = d.deptno

 

view 삭제

DROP VIEW v_prof;

view 확인

view도 table처럼 확인한다

SELECT tname FROM tab;

특정 사용자가 가진 view 확인

SELECT owner AS schema_name, view_name 
FROM sys.all_views 
WHERE owner = '사용자이름(대문자)'
ORDER BY owner, view_name;

 

inline view

view는 한번 만들어놓으면 계속 사용할 수 있다

그러나 1회용으로만 사용할 경우에는 from절의 sub query 형태로 만들 수 있다

 

[실습] #8103

t_student, t_department 테이블

학과별로 학생들의 최대 키와 최대 몸무게, 학과 이름을 출력하세요

* SQL Error [904] [42000]: ORA-00904: "S"."MAX_HEIGHT": invalid identifier

  sub query select문의 별명과 main query select문의 column 값이 같아야 한다! 안그럼 error!

SELECT
	d.dname "학과명",
	s.max_height "최대키",
	s.max_weight "최대몸무게"
FROM (
	SELECT deptno1, MAX(height) max_height, MAX(weight) max_weight
	FROM t_student
	GROUP BY deptno1
) s, t_department d
WHERE s.deptno1 = d.deptno
;