(사용형식)
CREATE [OR REPLACE][FORCE|NOFORCE] VIEW 뷰이름[(컬럼list)]
-->컬럼list에 뷰의 컬럼명 지정할 수 있음
AS
SELECT 문
[WITH CHECK OPTION][WITH READ ONLY];
. REPLACE : 이미 같은 이름의 뷰가 존재하면 대치
. FORCE : 기준 테이블이 없어도 뷰생성, 기본은 NOFORCE
. 컬럼list : 뷰에서 사용할 컬럼명(생략하면 SELECT문의 컬럼별칭이 뷰의 컬럼명의 되고,
컬럼 별칭이 없는 경우 SELECT문의 컬럼명이 뷰의 컬럼명이 됨)
. WITH CHECK OPTION : SELECT 문의 WHERE 절 조건을 위배하는 뷰에 대한 DML 명령은 수행될 수 없음(오류)
. WITH READ ONLY : 읽기전용 뷰 생성
** 뷰에대한 DML 명령이 제한되더라도 원본테이블에 대한 DML명령은 제한없이 사용되고 그 결과는 뷰에 즉시 반영됨
컬럼LIST는 생략가능 -
1순위. 뷰의 컬럼에 붙여질 컬럼명, 뷰에 붙여진 컬럼명
2순위. SELECT 절에 사용된 컬럼별칭
3순위. AS를 사용하지 않으면 SELECT에 사용된 컬럼명 자체가 뷰의 이름이 됨
원본 테이블이 변하면 VIEW 객체는 자동으로 변함
OR REPLACE : 사용자는 사용 불가
CREATE OR REPLACE = 생성 OR 대치시킴
내가 만드는 뷰가 이미 저장된 뷰를 OVERRIDE함
뷰에서 업데이트하면 원본도 업데이트 됨,
WITH READ ONLY 사용하면 뷰에대해서 UPDATE, DELETE, INSERT를 사용 불가
아예 변경 불가
WITH CHECK OPTION - 원본 테이블의 SELECT 절에 의해서 WHERE절의 조건을 위배하는 데이터로
뷰를 고칠 수 없음 -> 원본테이블 자체는 DML명령 다 가능
WHERE절의 조건을 만족하는 쪽은 변경 가능
=> 생성된 뷰에만 적용 / 동시에 두 가지 모두 사용할 수 없음.
사용예)회원테이블에서 마일리지가 10000을 넘는 회원의 회원번호,회원명,마일리지,직업을 조회하여 그 결과를 뷰로 저장하시오.
CREATE OR REPLACE VIEW V_MEM_MILE(MID,MNAME,MILEAGE,MJOB) -- 뷰객체 생성, 테이블과 같이 사용 가능
AS
SELECT MEM_ID AS 회원번호,
MEM_NAME AS 회원명,
MEM_MILEAGE AS 마일리지,
MEM_JOB AS 직업
FROM MEMBER
WHERE MEM_MILEAGE>=10000;
CREATE OR REPLACE VIEW V_MEM_MILE --같은 이름의 뷰객체가 생성되어도 덮어쓰니까 실행가능
AS
SELECT MEM_ID AS 회원번호,
MEM_NAME AS 회원명,
MEM_MILEAGE AS 마일리지,
MEM_JOB AS 직업
FROM MEMBER
WHERE MEM_MILEAGE>=10000;
SELECT * FROM V_MEM_MILE;
사용예)생성된 뷰(V_MEM_MILE)에서 'b001'회원의 마일리지를 5000으로 변경하시오.
UPDATE V_MEM_MILE
SET MEM_MILEAGE=5000 --변경되면 뷰에서 사라짐. / 뷰를 고치면 원본이 고쳐짐
WHERE MEM_ID='b001';
사용예)회원테이블에서 'b001'회원의 마일리지를 15000으로 변경하시오.
UPDATE MEMBER
SET MEM_MILEAGE=15000
WHERE MEM_ID='b001';
사용예)회원테이블에서 마일리지가 20000이상인 회원의 회원번호,회원명,마일리지,연락처(핸드폰번호)로 읽기전용 뷰를 생성하시오
CREATE OR REPLACE VIEW V_MEM_MILE02
AS
SELECT MEM_ID AS 회원번호,
MEM_NAME AS 회원명,
MEM_MILEAGE AS 마일리지,
MEM_HP AS 핸드폰번호
FROM MEMBER
WHERE MEM_MILEAGE>=20000
WITH READ ONLY;
사용예)뷰 V_MEM_MILE02에서 'r001'회원을 삭제하시오 -- 읽기전용 뷰라서 삭제가 안됨(오류)
DELETE V_MEM_MILE02
WHERE 회원번호='r001';
사용예)MEMBER 테이블에서 'r001'회원을 삭제하시오
--CART에서 부모테이블로 사용중이기 때문에 삭제 안 됨
UPDATE MEMBER
SET MEM_MILEAGE=30000
WHERE MEM_ID ='r001';
SELECT * FROM V_MEM_MILE02;
사용예)사원테이블에서 급여가 3000이하인 사원의 사원번호,사원명,부서명,직책명을 WITH CHECK OPTION 뷰로 생성하시오
CREATE OR REPLACE VIEW V_EMP_SAL
AS
SELECT A.EMPLOYEE_ID,
A.EMP_NAME,
B.DEPARTMENT_NAME,
A.SALARY,
C.JOB_TITLE
FROM HR.EMP A, HR.DEPT B, HR.JOBS C
WHERE A.DEPARTMENT_ID=B.DEPARTMENT_ID
AND A.JOB_ID=C.JOB_ID
AND A.SALARY<3000
WITH CHECK OPTION
사용예)뷰 V_EMP_SAL에서 사원번호 130번 사원의 급여를 3100으로 변경하시오
UPDATE V_EMP_SAL
SET SALARY=3100
WHERE EMPLOYEE_ID=130; --숫자는 오른쪽 정렬, 문자는 왼쪽 정렬(오른쪽 정렬되어 숫자사용가능)
--3000보다 높은 값을 주면 V_EMP_SAL 뷰의 WHERE 조건에 위배됨
/ 조건에 위배되었을 때 뷰를 변경 못하게 함 - WITH CHECK OPTION
UPDATE EMP
SET SALARY=3100
WHERE EMPLOYEE_ID=130;
SELECT * FROM V_EMP_SAL; -- 130번의 급여가 3100이 되어 130번 사원의 정보가 뷰에서 사라짐
ROLLBACK;
COMMIT;
(사용형식)
CREATE SEQUENCE 시퀀스명
[START WITH n] --시작 값, 기본은 MIN_VALUE
[INCREMENT BY n] --증감값 (자동으로 10씩 증가시키고싶을 때 n에 10을 대입)
[MAXVALUE n|NOMAXVALUE] --최대값, 기본은 NOMAXVALUE이고 10^27까지 사용
[MINVALUE n|NOMINVALUE] --최소값, 기본은 NOMINVALUE이고 그 값은 1, -10^27까지 사용
[CYCLE|NOCYCLE] --최대(최소)값까지 도달 후 다시 SEQUENCE 생성여부 기본은 NOCYCLE
[CACHE n|NOCACHE] --캐쉬에 미리 만들어 놓고 사용할지 여부 기본은 CACHE 20
[ORDER|NOORDER] --시퀀스 객체 생성을 보증할지 여부 기본은 NOORDER
**시퀀스 객체의 Pseudo Column(의사컬럼) --시스템에서 제공해주는 가상의 컬럼
----------------------------------------------------
Pseudo Column 내용
----------------------------------------------------
시퀀스명.CURRVAL 시퀀스객체의 현재 값
시퀀스명.NEXTVAL 시퀀스객체의 다음 값
----------------------------------------------------
***해당 세션에서 시퀀스 객체는 적어도 한 번 이상의 .NEXTVAL이 수행된 후 CURRVAL에 값이 배정됨
--맨 처음의 명령은 반드시 NEXTVAL(다음 값 생성, 반환)이어야 함, 그래야 값이 배정됨.
사용예)LPROD테이블에 신규 분류코드를 추가 삽입하기 위한 시퀀스를 생성하고 다음 분류코드를 추가 삽입하시오.
시퀀스는 LPROD_ID 데이터로 사용
[자료]
LPROD_GU : 'P501'
LPROD_NM : '농산물'
LPROD_GU : 'P502'
LPROD_NM : '임산물'
(시퀀스 생성)
CREATE SEQUENCE SEQ_LPROD_ID
START WITH 10;
SELECT SEQ_LPROD_ID.NEXTVAL FROM DUAL;
--시퀀스를 처음 만들면 가리키는 주소가 시퀀스명을 가리킴, NEXTVAL을 해줘야 STATR값인 10이 됨.
SELECT SEQ_LPROD_ID.CURRVAL FROM DUAL;
--시퀀스를 만들고 나서 처음 명령은 NEXTVAL여야 함.(오류)
INSERT INTO LPROD
VALUES(SEQ_LPROD_ID.CURRVAL,'P501','농산물');
INSERT INTO LPROD
VALUES(SEQ_LPROD_ID.NEXTVAL,'P502','임산물');
DELETE LPROD WHERE LPROD_GU='P502'
SELECT * FROM LPROD
(사용형식)
CREATE [OR REPLACE] SYNONYM 동의어 FOR 객체명;
. '객체명' : 원본 객체명
. '동의어' : 원본 객체명에 부여할 별칭
사용예)HR 계정의 JOB_HISTORY 테이블을 JOB_HIS로 별칭을 부여하여 생성하시오
CREATE OR REPLACE SYNONYM JOB_HIS FOR HR.JOB_HISTORY;
SELECT * FROM JOB_HIS; --HR계정으로 로그인하지 않아도 별칭만으로 조회 가능
--요약본에서 주소를 찾고 그 주소에서 객체를 찾음
검색의 효율성을 증대시키기 위한 객체
데이터베이스 서버의 성능을 결정하는 요소 중 하나
데이터 검색, 삽입, 변경시 해당 자료의 선택(WHERE 조건)의 효율성을 위해 사용
정렬, 그룹화 등에도 사용
별도의 저장공간 및 처리 프로세스 필요
데이터의 삽입,삭제가 빈번한 경우 인덱스 파일 재구성에 많은 자원 소요됨
인덱스 객체의 종류
1)UNIQUE/NON-UNIQUE INDEX
2)SINGLE/COMPOSITE INDEX
--SINGLE:하나의 컬럼 사용해서 만들어짐 / COMPOSITE:여러 개의 컬럼 사용해서 만들어짐
3)Normal Index --Default 인덱스
4)bitmap Index --bit:이진수(0,1)
5)Function-Based Normal Index
(사용형식)
CREATE [UNIQUE|BITMAP] INDEX 인덱스명
ON 테이블명(컬럼명[,컬럼명,...])([ASC|DESC]) --컬럼명에 들어가는 컬럼을 가지고 인덱스를 만듦
(컬럼이 들어가는 순서 중요!)
-- 기본은 NON-UNIQUE INDEX 임
사용예)
CREATE INDEX IDX_PROD ON PROD(PROD_NAME); --인덱스 이름은 IDX로 시작됨
SELECT *
FROM PROD
WHERE PROD_NAME='삼성 캠코더';
**인덱스 삭제
DROP INDEX 인덱스명;
DROP INDEX IDX_PROD;
사용예)장바구니테이블에서 월/일/순번으로 데이터 검색이 자주 발생됨
이 검색의 효율성을 높이기 위한 인덱스 구성
CREATE INDEX IDX_CART
ON CART(SUBSTR(CART_NO,5)); --5번째자리부터 전부다(연도를 제외)
SELECT *
FROM CART
WHERE SUBSTR(CART_NO,5)='050300002';
DROP INDEX IDX_CART;
2)인덱스의 재구성
(사용형식)
ALTER INDEX 인덱스명 REBUILD;
--인덱스는 수정 불가(컬럼 수를 바꾸거나 컬럼명을 바꾸거나 하는 수정)