방대한 데이터의 세계로, JUST DO DBMS!
--PK가 있는 부모 테이블 DADDY
CREATE TABLE DADDY(
IDX NUMBER(10),
MID NUMBER(10) PRIMARY KEY
);
-- 자식 테이블(DAUGHTER)에서 부모 테이블(DADDY) 쪽으로 FK를 걸어준다.
CREATE TABLE DAUGHTER(
IDX NUMBER(10) PRIMARY KEY,
MID NUMBER(10),
-- FK_DA는 제약 조건의 알리아스다.
CONSTRAINTS FK_DA FOREIGN KEY(MID)
REFERENCES DADDY(MID) ON DELETE CASCADE
);
INSERT INTO DADDY VALUES (1, 10);
INSERT INTO DADDY VALUES (2, 20);
INSERT INTO DADDY VALUES (4, 40);
SELECT * FROM DADDY;
INSERT INTO DAUGHTER VALUES (100, 10);
INSERT INTO DAUGHTER VALUES (101, 20);
INSERT INTO DAUGHTER VALUES (200, 20);
INSERT INTO DAUGHTER VALUES (201, 10);
-- 부모테이블에서 정의되어 있지 않은 값으로 인해 제약조건에 오류가 발생했다.
-- INSERT INTO DAUGHTER VALUES (300, 30);
INSERT INTO DAUGHTER VALUES (300, 40);
SELECT * FROM DAUGHTER d ;
DELETE FROM DAUGHTER d WHERE IDX = 100;
SELECT * FROM DAUGHTER d ;
DELETE FROM DAUGHTER d WHERE IDX = 100;
DELETE FROM DADDY d WHERE IDX = 1;
-- ON DELETE CASCADE 이 옵션으로 인해 잘 처리가 되었다.
-- ON DELETE CASCADE - 참조되는 부모 테이블의 행에 대한 DELETE를 허용
SELECT * FROM DAUGHTER d ;
-- VIEW
SELECT * FROM EMP_DETAILS_VIEW edv ;
-- VIEW CREATE
--CREATE VIEW V_EMP2(EMP_ID, FIRST_NAME, JOB_ID, HIREDATE, DEPT_ID)
--AS
--SELECT EMPLOYEE_ID , FIRST_NAME , JOB_ID , HIRE_DATE , DEPARTMENT_ID
--FROM EMPLOYEES e
--WHERE JOB_ID = 'ST_CLERK'
--;
SELECT * FROM V_EMP ve ;
-- 삭제
-- DROP VIEW V_EMP;
-- DROP VIEW V_EMP2;
CREATE VIEW V_EMP2(EMP_ID, COMM_PCT, FIRST_NAME, JOB_ID, HIREDATE, DEPARTMENT_ID)
AS
SELECT EMPLOYEE_ID
, NVL(COMMISSION_PCT, 0)
, FIRST_NAME
, JOB_ID
, HIRE_DATE
, DEPARTMENT_ID
FROM EMPLOYEES e
;
-- 139, John
SELECT *
FROM V_EMP2 ve
WHERE FIRST_NAME = 'John'
AND JOB_ID = 'ST_CLERK'
;
UPDATE V_EMP2 SET FIRST_NAME = 'Kim'
WHERE FIRST_NAME = 'John'
AND JOB_ID = 'ST_CLERK'
;
SELECT *
FROM V_EMP2 ve
WHERE FIRST_NAME = 'John'
AND JOB_ID = 'ST_CLERK'
;
SELECT *
FROM EMPLOYEES e
WHERE EMPLOYEE_ID = 139
;
UPDATE EMPLOYEES SET FIRST_NAME = 'John'
WHERE EMPLOYEE_ID = 139
;
원본 파일에 변화없이 읽기만 가능하게 할 수 있어요.
CREATE VIEW V_EMP3(EMP_ID, COMM_PCT, FIRST_NAME, JOB_ID, HIREDATE, DEPARTMENT_ID)
AS
SELECT EMPLOYEE_ID
, NVL(COMMISSION_PCT, 0)
, FIRST_NAME
, JOB_ID
, HIRE_DATE
, DEPARTMENT_ID
FROM EMPLOYEES e
WITH READ ONLY
;
SELECT *
FROM V_EMP3 ve
;
-- 옵션인 READ ONLY 로 인하여 UPDATE가 불가능하다.
--UPDATE V_EMP3 SET FIRST_NAME = 'Kim'
--WHERE FIRST_NAME = 'John'
--AND JOB_ID = 'ST_CLERK'
--;
CREATE SEQUENCE 시퀀스 이름
INCREMENT BY n -- 증가값을 설정, 2 => 2씩 증가, 기본값 1
START WITH n -- 시작값을 설정, 기본값1
MAXVALUE n -- 시퀀스의 최대값을 설정
MINVALUE n -- 시퀀스의 최소값을 설정
CYCLE / NOCYCLE -- 시퀀스를 반복적으로 사용할지를 설정
CACHE n -- 시퀀스 속도를 개선하기위한 캐싱여부 지정
-- 시퀀스
CREATE SEQUENCE SEQ_SERIAL_NO
INCREMENT BY 1
START WITH 100
MAXVALUE 110
MINVALUE 99
CYCLE
CACHE 2;
CREATE TABLE GOOD(
GOOD_NO NUMBER(3),
GOOD_NAME VARCHAR(10)
);
SELECT *
FROM GOOD
;
-- NEXTVAL : 다음 값 ()
INSERT INTO GOOD VALUES (SEQ_SERIAL_NO.NEXTVAL, '제품5');
-- CURRVAL : 현재 값 (CURRENT VALUE)
INSERT INTO GOOD VALUES (SEQ_SERIAL_NO.CURRVAL, '제품5');
SELECT *
FROM GOOD
;
-- 현재 시퀀스 값이 얼마인지 아래와 같은 방법으로도 알 수 있다.
SELECT SEQ_SERIAL_NO.CURRVAL FROM DUAL;
-- 시퀀스 삭제
DROP SEQUENCE SEQ_SERIAL_NO;
인덱스는 색인이라는 뜻으로 조회속도를 향상시키기 위한 데이터베이스 검색 기술이에요. 즉 인덱스가 필요한 이유는 인덱스를 생성해 줌으로서 조회 속도를 빠르게 할 수 있어요.
CREATE UNIQUE INDEX 인덱스명
ON 테이블명(컬럼);
CREATE INDEX 인덱스명
ON 테이블명(컬럼);
-- INDEX
SELECT * FROM EMPLOYEES3 e ;
CREATE TABLE EMPLOYEESE3
AS
SELECT * FROM EMPLOYEES e
;
INSERT INTO EMPLOYEESE3 (EMPLOYEE_ID, FIRST_NAME, LAST_NAME)
VALUES (100, 'Ismael', 'Kim')
;
SELECT * FROM EMPLOYEESE3 ORDER BY EMPLOYEE_ID;
-- UNIQUE INDEX 생성
CREATE UNIQUE INDEX IDX_EMPLOYEE3_ID
ON EMPLOYEESE3(EMPLOYEE_ID);
DELETE FROM EMPLOYEESE3 e
WHERE FIRST_NAME = 'Ismael'
AND LAST_NAME = 'Kim'
;
-- UNIQUE INDEX가 생성된 테이블에는 동일한 데이터가 입력되지 않는다.
--INSERT INTO EMPLOYEESE3 (EMPLOYEE_ID, FIRST_NAME, LAST_NAME)
--VALUES (100, 'Ismael', 'Kim')
--;
-- NON-UNIQUE INDEX
CREATE INDEX IDX_EMPLOYEE3_FIRST
ON EMPLOYEESE3(FIRST_NAME)
;
INSERT INTO EMPLOYEESE3 (EMPLOYEE_ID, FIRST_NAME, LAST_NAME)
VALUES (500, 'Steven', 'King')
;
SELECT * FROM EMPLOYEESE3 e
WHERE FIRST_NAME = 'Steven';
출처
https://media.giphy.com/media/1hVi7JFFzplHW/giphy.gif
https://media.giphy.com/media/jUwpNzg9IcyrK/giphy.gif