참조 : The Programmer's Guide to SQL

데이터베이스 만들기
    - CREATE DATABASE db이름
    - 오라클은 보통 DB를 한 개만 사용하고 스키마를 이용해서 관련있는 테이블들과 다른 객체를 그룹핑한다.
데이터베이스 제거
    - 오라클에서는DROP DATABASE가 아니라 CREATE DATABASE 로 제거

테이블 만들기
    - CREATE TABLE <table name>
   (<column name> <column data type> [<column constraints>]);
테이블 제거
    - DROP TABLE <table name>
    - FOREIGN KEY 제약으로 인해 참조 되고 있는 테이블이면 제거가 되지 않는다. 제거하기 전에 이 제약부터 제거해야 한다.

컬럼에 기본값 주기
    - DEFAULT <기본값>
    - 컬럼 기본값을 함수나 키워드를 사용할 수 있다.
    GETDATE() = SYSDATE = CURRENT_DATE
주키 설정하기
    - 주키 이름 설정하고 싶을 때

  CREATE TABLE Friend (
   Name    VARCHAR(50) NOT NULL,
   PhoneNo VARCHAR(15) DEFAULT 'Unknown Phone' NOT NULL,
   CONSTRAINT MyPrimaryKey PRIMARY KEY (Name));

    - 주키 이름에 관심없을 때

   CREATE TABLE Friend (
   Name    VARCHAR(50) NOT NULL,
   PhoneNo VARCHAR(15) DEFAULT 'Unknown Phone' NOT NULL,
   PRIMARY KEY (Name));

    - 이것을 좀 더 간단하게

  CREATE TABLE Friend (
   Name    VARCHAR(50) PRIMARY KEY NOT NULL,
   PhoneNo VARCHAR(15) DEFAULT 'Unknown Phone' NOT NULL);

    - 주키 제약을 설정하면 자동으로 고유한 인덱스가 생성된다.
UNIQUE 설정
    - 오라클에서는 기본으로 UNIQUE 속성의 컬럼에 다수의 NULL 넣을 수 있슴.
컬럼 제약 설정
    - CHECK 사용하기

    CREATE TABLE Friend (
   Name    VARCHAR(50) PRIMARY KEY NOT NULL,
   PhoneNo VARCHAR(15) DEFAULT 'Unknown Phone',
   Age     INT,
   CONSTRAINT CheckAge CHECK (Age BETWEEN 10 and 100));

    - 제약 사항의 이름이 필요 없다면

    CREATE TABLE Friend (
   Name    VARCHAR(50) PRIMARY KEY NOT NULL,
   PhoneNo VARCHAR(15) DEFAULT 'Unknown Phone',
   Age     INT CHECK (Age BETWEEN 10 and 100));

테이블 복사 하기
    - CREATE TABLE My_Friends AS SELECT * FROM Friend;
    - 단 제약 사항들(주키나 유니크 같은 것들)은 복사 되지 않는다. 그렇기 때문에 테이블을 만들 때는 기본 구조만 정의하고 Alter Table로 실행할 스크립트를 만들어 두는 것이 유용하다.
    - 데이터는 빼고 구조만 복사하고 싶다면 WHERE 절에 false가 되도록 설정해준다.
    CREATE TABLE My_Friends AS SELECT * FROM Friend
    WHERE 1=0;

테이블 변경하기
    - 컬럼 추가하기 : ALTER TABLE Friend ADD (EMail VARCHAR(25), ICQ VARCHAR(15));

        - NOT NULL 인 컬럼을 추가하려면, 테이블에 데이터가 들어있지 않아야 한다.
    - 컬럼 없애기 : ALTER TABLE Friend DROP COLUMN PhoneNo;

    - 제약 사항 삭제 : ALTER TABLE Friend DROP CONSTRAINT unq_name;
    - 제약 사항 추가 : ALTER TABLE Friend ADD CONSTRAINT PK_FriendName PRIMARY KEY (Name);

시퀀스 사용하기
    - CREATE SEQUENCE FriendIDSeq INCREMENT BY 1 START WITH 1000;
    - 테이블에서 사용하기
    INSERT INTO Friend (FriendID, Name, PhoneNo)
             VALUES (FriendIDSeq.NextVal, 'Mike', '123');
    - 시퀀즈 제거하기 : DROP SEQUENCE FriendIDSeq;
    - 현재 시퀀스 값 가져오기 : SELECT FriendIDSeq.CurrVal FROM DUAL;

자동 증가 사용하기
    - 오라클에서는 트리거를 이용해야 함.

    CREATE OR REPLACE TRIGGER AUTONUMBER
    BEFORE INSERT ON Friend
    FOR EACH ROW
    BEGIN
       SELECT FriendIDSeq .NEXTVAL
       INTO :NEW.FriendID FROM DUAL;
    END;
    /

    - 시퀀스에서 값을 가져온 다음 새로운 row 생성 될 때 주키에 값을 집어넣는 트리거인듯.

인덱스 사용하기
    - 인덱스를 사용하면 SELECT 문의 속도는 증가하지만, INSERT, DELELTE, UPDATE의 속도는 느려진다.
    - 조회가 자주 발생하는 테이블의 경우 인덱스를 사용하는 것이 단점에 비해 눈에띄게 좋다.
    - 따라서 WHERE 나 ORDER BY 절에서 자주 사용하는 컬럼의 인덱스를 만들어 두는 것이 좋다.
    - 제약사항(주키나 유니크) 때문에 자동으로 생성된 인덱스는 제약사항이 제거 되면 같이 제거 된다.
    - 인덱스에는 유니크 인덱스와 논 유니크 인덱스 두 종류가 있다.
    - 인덱스 만들기 : CREATE UNIQUE INDEX NameIndex ON Friend (Name);
    - 유니크 인덱스를 사용하는 컬럼에 중복되는 값을 넣을 수 없다.
    - 텍스트에 인덱스는 단어의 왼쪽 글자부터 오른쪽 글자순으로 찾는다. 따라서 '%기선' 과 같은 검색어는 데이블의 모든 데이터를 찾아보게 한다.
    - 인덱스 삭제하기 : DROP INDEX NameIndex;

참조 무결성
    - 외례키 제약 설정하기

    CREATE TABLE Friend (FriendID INT PRIMARY KEY NOT NULL,
                      Name VARCHAR(50));

    CREATE TABLE Phone (
       PhoneID INT PRIMARY KEY NOT NULL,
       FriendID INT,
       PhoneNo VARCHAR(20),
       CONSTRAINT FID_FK FOREIGN KEY(FriendID)
          REFERENCES Friend(FriendID));