[Oracle] View
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
;