오라클 데이터베이스 테이블은 사용자 테이블과 데이터 사전으로 나뉜다.
데이터 사전에는 데이터베이스 메모리·성능·사용자·권한·객체 등 데이터베이스 운영에 중요한 데이터가 보관되어 있다.
따라서 오라클 데이터베이스는 사용자가 데이터 사전 정보에 직접 접근하거나 작업하는 것을 허용하지 않는다.
그 대신 데이터 사전 뷰를 제공하여 SELECT문으로 정보 열람을 할 수 있게 해 두었다.
데이터 사전 뷰는 용도에 따라 접두어를 지정하여 분류한다.
-- SCOTT 계정에서 사용 가능한 데이터 사전
SELECT * FROM DICT;
SELECT * FROM DICTIONARY;
-- USER_ 접두어를 가진 데이터 사전
SELECT TABLE_NAME FROM USER_TABLES;
-- ALL_ 접두어를 가진 데이터 사전
SELECT OWNER, TABLE_NAME FROM ALL_TABLES;
-- DBA_ 접두어를 가진 데이터 사전(SYSTEM 계정)
SELECT * FROM DBA_TABLES;
-- DBA_USERS 사용
SELECT *
FROM DBA_USERS
WHERE USERNAME = 'SCOTT';
인덱스: 오라클 데이터베이스에서 데이터 검색 성능의 향상을 위해 테이블 옆에 사용하는 객체
-- 인덱스
-- SCOTT 계정이 소유한 인덱스 정보
SELECT * FROM USER_INDEXES;
-- SCOTT 계정이 소유한 인덱스 컬럼 정보
SELECT * FROM USER_IND_COLUMNS;
-- 인덱스 생성
CREATE INDEX IDX_EMP_SAL ON EMP(SAL);
SELECT * FROM USER_IND_COLUMNS;
-- 인덱스 삭제
DROP INDEX IDX_EMP_SAL;
뷰: 하나 이상의 테이블을 조회하는 SELECT문을 저장한 객체
SELECT문을 저장하기 때문에 물리적 데이터를 따로 저장하지는 않는다.
따라서 뷰를 SELECT문의 FROM절에 사용하면 특정 테이블을 조회하는 것과 같은 효과를 얻을 수 있다.
뷰의 목적은 다음과 같다.
-- 뷰 생성
CREATE VIEW VW_EMP20 AS
(
SELECT EMPNO, ENAME, JOB, DEPTNO
FROM EMP
WHERE DEPTNO = 20);
SELECT * FROM USER_VIEWS;
SELECT * FROM VW_EMP20;
-- 뷰 삭제
DROP VIEW VW_EMP20;
CREATE문을 통해 객체로 만들어지는 뷰 외에 SQL문에서 일회성으로 만들어서 사용하는 뷰를 인라인 뷰라고 한다.
SELECT문에서 사용되는 서브쿼리, WITH절에서 미리 이름을 정의해 두고 사용하는 SELECT문 등이 이에 해당한다.
-- 의사 열: 데이터가 저장되는 실제 테이블에 존재하지는 않지만
-- 특정 목적을 위해 테이블에 저장되어 있는 열처럼 사용 가능한 특수 열
-- ROWNUM
SELECT ROWNUM, E.* FROM EMP E ORDER BY SAL DESC;
-- 인라인 뷰(서브쿼리)
SELECT ROWNUM, E.*
FROM (SELECT * FROM EMP E ORDER BY SAL DESC) E;
-- 인라인 뷰(WITH절)
WITH E AS (SELECT * FROM EMP ORDER BY SAL DESC)
SELECT ROWNUM, E.*
FROM E;
-- 인라인 뷰로 TOP-N 추출(서브쿼리)
SELECT ROWNUM, E.*
FROM (SELECT * FROM EMP E ORDER BY SAL DESC) E
WHERE ROWNUM <= 3;
-- 인라인 뷰로 TOP-N 추출(WITH절)
WITH E AS (SELECT * FROM EMP ORDER BY SAL DESC)
SELECT ROWNUM, E.*
FROM E
WHERE ROWNUM <= 3;
시퀀스: 오라클 데이터베이스에서 특정 규칙에 맞는 연속 숫자를 생성하는 객체
-- 시퀀스
CREATE TABLE DEPT_SEQUENCE AS SELECT * FROM DEPT WHERE 1<>1;
CREATE SEQUENCE SEQ_DEPT_SEQUENCE INCREMENT BY 10 START WITH 10 MAXVALUE 90 MINVALUE 0 NOCYCLE CACHE 2;
-- NEXTVAL: 다음 번호를 생성
INSERT INTO DEPT_SEQUENCE (DEPTNO, DNAME, LOC)
VALUES (SEQ_DEPT_SEQUENCE.NEXTVAL, 'DATABASE', 'SEOUL');
SELECT * FROM DEPT_SEQUENCE ORDER BY DEPTNO;
-- CURRVAL: 시퀀스에서 마지막으로 생성한 번호를 반환
SELECT SEQ_DEPT_SEQUENCE.CURRVAL FROM DUAL;
-- 시퀀스 수정
ALTER SEQUENCE SEQ_DEPT_SEQUENCE INCREMENT BY 3 MAXVALUE 99 CYCLE;
INSERT INTO DEPT_SEQUENCE (DEPTNO, DNAME, LOC)
VALUES (SEQ_DEPT_SEQUENCE.NEXTVAL, 'DATABASE', 'SEOUL');
SELECT * FROM DEPT_SEQUENCE ORDER BY DEPTNO;
-- 시퀀스 삭제(시퀀스를 사용하여 추가된 데이터는 삭제되지 않음)
DROP SEQUENCE SEQ_DEPT_SEQUENCE;
동의어: 테이블·뷰·시퀀스 등 객체 이름 대신 사용할 수 있는 다른 이름을 부여하는 객체, 주로 테이블 이름이 너무 길어 불편할 때 좀더 간단하고 짧은 이름을 하나 더 만들어 주기 위해 사용
-- 동의어
CREATE SYNONYM E FOR EMP;
SELECT * FROM E;
-- 동의어 삭제
DROP SYNONYM E;