: 가상 릴레이션
기본 릴레이션에 대한 SELECT
문의 형태로 정의
=> 데이터 검색, 갱신할 수 있는 동적인 창
CREATE VIEW EMP_DNO3 (EMO, ENAME, TITLE)
AS SELECT EMPNO, EMPNAME, TITLE // 중첩 select, 여러 relation 참조 select 가능
FROM EMPLOYEE
WHERE DNO = 3;
CREATE VIEW EMP_PLANNING
AS SELECT E.EMPNAME, E.TITLE, E.SALARY
FROM EMPLOYEE E, DEPARTMENT D
WHERE E.DNO = D.DEPTNO
AND D.DEPTNAME = '기획';
SELECT E.EMPNAME, E.SALARY
FROM EMPLOYEE E, DEPARTMENT D
WHERE D.DEPTNAME = '기획'
AND D.DEPTNO = E.DNO
AND E.TITLE = '부장';
SELECT EMPNAME, SALARY
FROM EMP_PLANNING
WHERE TITLE = '부장';
UPDATE EMP_DNO3
SET DNO = 2
WHERE ENO = 3427;
// WITH CHECK OPTION 명시 X: DNO가 2로 업데이트 되었기 때문에 DNO가 3인 사원을 명시한 뷰에서 사라짐
// WITH CHECK OPTION 명시 O: 위의 UPDATE문 실행 불가. 데이터 무결성 유지
CREATE VIEW EMPLOYEE
AS SELECT E1.EMPNO, E1.EMPNAME, E2.TITLE, E2.MANAGER, E1.SALARY, E2.DNO
FROM EMP1 E1, EMP2 E2
WHERE E1.EMPNO = E2.EMPNO;
INSERT INTO EMP_DNO3
VALUES (4293, '김정수', '사원');
INSERT INTO EMPLOYEE
VALUES (4293, '김정수', '사원',,,);
INSERT INTO EMP_PLANNING
VALUES ('박지선', '대리', 2500000);
INSERT INTO EMPLOYEE
VALUES (,'박지선', '대리', ,2500000, );
CREATE VIEW EMP_AVGSAL (DNO, AVGSAL)
AS SELECT DNO, AVG(SALARY) // 집단 함수를 사용한 view 갱신
FROM EMPLOYEE
GROUP BY DNO;
// 거절
UPDATE EMP_AVGSAL
SET AVGSAL = 3000000
WHERE DNO = 2;
// 거절
INSERT INTO EMP_AVGSAL
VALUES (3, 3200000);
시스템 카탈로그
: 데이터베이스의 객체(사용자, 릴레이션, 뷰, 인덱스, 권한 등)와 구조들에 관한 모든 데이터
= 메타데이터 (데이터에 관한 데이터)
질의 최적화 모듈 등 DBMS 구성요소에 의해 사용.
관계 DBMS마다 서로 다른 형태로 시스템 카탈로그 기능 제공
데이터 사전, 시스템 테이블과 동일한 의미
시스템 카탈로그가 질의 처리에 활용되는 방식
SELECT EMPNAME, SALARY, SALARY * 1.1
FROM EMPLOYEE
WHERE TITLE = '과장' AND DNO = 2;
SYS_RELATION: RelId(릴레이션 id), RelOwner(릴레이션 관리자), RelTups(튜플 수), RelAtts(애트리뷰트 수), RelWidth(튜플 길이)
SYS_ATTRIBUTE: AttreId(애트리뷰트의 릴레이션 id), AttId(애트리뷰트 id), AttName(애트리뷰트 이름), AttOff, AttType(애트리뷰트 유형), AttLen(애트리뷰트 길이), PkorFk(기본키 or 외래키)
ALTER TABLE EMPLOYEE DROP COLUMN MANGER;
// DBMS가 거절
DELETE FROM SYS_ATTRIBUTE
WHERE AttRelId = 'EMPLOYEE' AND AttName = 'MANAGER';
오라클 시스템 카탈로그: 데이터 사전
- 시스템 테이블스페이스에 저장.
- 기본 테이블, 데이터 사전 뷰로 구성.
- 사용자: 기본 테이블의 정보 암호화된 형태로 저장, 직접 접근 X. 데이터 사전 뷰 접근.
데이터 사전 뷰
- DBA_xxx 뷰: 데이터베이스 내의 모든 객체들에 관한 정보
- ALL_xxx 뷰: 현재의 사용자가 접근할 수 있는 객체들에 관한 정보
- USER_xxx 뷰: 현재의 사용자가 소유하고 있는 객체들에 관한 정보
질의 방식
SELECT *
FROM ALL_CATALOG
WHERE OWNER = 'KIM';
// OWNER: 사용자 이름, TABLE_NAME: 테이블이나 뷰 이름, TABLE_TYPE: 테이블 유형. 테이블, 뷰
SELECT TABLE_NAME, COLUMN_NAME, DATA_TYPE // 테이블 이름, 애트리뷰트 이름, 애트리뷰트 타입
FROM USER_TAB_COLUMNS // 뷰. 애트리뷰트 길이, 널값 허용 여부, 디폴트값 등 검색 가능
WHERE TABLE_NAME = 'EMPLOYEE';
SELECT VIEW_NAME, TEXT // 뷰 이름, 뷰 정의한 SQL문
FROM USER_VIEWS;
CREATE INDEX EMPDNO_IDX ON EMPLOYEE(DNO);
SELECT INDEX_NAME, INITIAL_EXTENT, DISTINCT_KEYS, NUM_ROWS, SAMPLE_SIZE, LAST_ANALYZED
FROM USER_INDEXES
WHERE INDEX_NAME = 'EMPDNO_IDX';
// 테이블 통계 정보 갱신: ANALYZE TABLE, 인덱스 통계 정보 갱신: ANALYZE INDEX
ANALYZE INDEX EMPNO_IDX
COMPUTE STATISTICS;
ANALAYZE 명령
ANALYZE 객체_유형 객체_이름 연산 STATISTICS;
- 객체_유형: 테이블, 인덱스
- 객체_이름: 객체 이름
- 연산: COMPUTE 전체 테이블 접근, ESTIMATE 데이터 표본 추출
=> 주기적으로 ANALYZE 작업 수행 (다량 데이터 일괄 작업 처리 시, 바로 ANALYZE 작업 필요)
SELECT *
FROM USER_IND_COLUMNS
WHERE TABLE_NAME = 'EMPLOYEE';
// INDEX_NAME: 인덱스 이름, TABLE_NAME: 인덱스 정의된 테이블 이름,
// COLUMN_NAME: 인덱스 정의된 애트리뷰트 이름, COLUMN_POSITION: 인덱스 정의된 애트리뷰트 위치
// COLUMN_LENGTH: 인덱스 정의된 애트리뷰트 길이, DESCEND: 정렬 방식(오름차순 또는 내림차순)