Chapter 12: Working with Database Objects
참조 : 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
주키 설정하기
- 주키 이름 설정하고 싶을 때
Name VARCHAR(50) NOT NULL,
PhoneNo VARCHAR(15) DEFAULT 'Unknown Phone' NOT NULL,
CONSTRAINT MyPrimaryKey PRIMARY KEY (Name));
- 주키 이름에 관심없을 때
Name VARCHAR(50) NOT NULL,
PhoneNo VARCHAR(15) DEFAULT 'Unknown Phone' NOT NULL,
PRIMARY KEY (Name));
- 이것을 좀 더 간단하게
Name VARCHAR(50) PRIMARY KEY NOT NULL,
PhoneNo VARCHAR(15) DEFAULT 'Unknown Phone' NOT NULL);
- 주키 제약을 설정하면 자동으로 고유한 인덱스가 생성된다.
UNIQUE 설정
- 오라클에서는 기본으로 UNIQUE 속성의 컬럼에 다수의 NULL 넣을 수 있슴.
컬럼 제약 설정
- CHECK 사용하기
Name VARCHAR(50) PRIMARY KEY NOT NULL,
PhoneNo VARCHAR(15) DEFAULT 'Unknown Phone',
Age INT,
CONSTRAINT CheckAge CHECK (Age BETWEEN 10 and 100));
- 제약 사항의 이름이 필요 없다면
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;
자동 증가 사용하기
- 오라클에서는 트리거를 이용해야 함.
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;
참조 무결성
- 외례키 제약 설정하기
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));