CREATE
, ALTER
, DROP
문이 있다.CREATE TABLE 테이블명 (
{[속성명 데이터타입 [NOT NULL],}
[PRIMARY KEY(속성명),]
[UNIQUE(속성명),]
[FOREIGN KEY(속성명) REFERENCES 참조테이블명(참조속성명)
[ON DELETE CASCADE | SET NULL | SET DEFAULT | NO ACTION]
[ON UPDATE CASCADE | SET NULL | SET DEFAULT | NO ACTION]
[CONSTRAINT 제약조건명 제약조건]
);
데이터 타입 | 표현 형식 |
---|---|
정수(integer) | INT |
실수(float) | FLOAT 또는 REL |
고정 길이 문자 | CHAR(문자수) |
가변 길이 문자 | VARCHAR(문자수) |
시간 | TIME |
날짜 | DATE |
CHAR vs VARCHAR
- 고정 길이 문자(
CHAR
)는 지정된 문자수만큼 기억 공간을 항상 차지한다.- 가변 길이 문자(
VARCHAR
)는 지정된 범위 내에서 실제 입력된 자료에 따라 유동적으로 기억공간을 차지한다.- 예를 들어, CHAR(10), VHARCHAR(10)에 각각 “hello” 라는 5개의 문자가 입력된 경우, CHAR(10)은 입력 길이에 관계없이 10개의 기억공간을 고정적으로 사용하지만 VHARCHAR(10)은 최대 10개의 문자열을 저장할 수 있는 기억공간중 문자열 5개를 저장할 공간만 차지하도록 유동적으로 조절한다.
NOT NULL
제약 조건을 설정하는 예시이다. CREATE TABLE 테이블명 (
속성명 데이터_타입 NOT NULL
);
또는
CREATE TABLE 테이블명 (
속성명 데이터타입 CONSTRAINT 제약조건명 NOT NULL
);
UNIQUE
제약 조건을 설정하는 예시이다. CREATE TABLE 테이블명 (
속성명 데이터_타입 UNIQUE
);
또는
CREATE TABLE 테이블명 (
속성명 데이터_타입,
UNIQUE(속성명)
);
**PRIMARY KEY**
)로 지정합니다. 이 제약 조건을 설정하면 해당 속성에는 중복된 값이 없어야 하며, 자동으로 인덱스가 생성된다. 다음은 PRIMARY KEY
제약 조건을 설정하는 예시이다. CREATE TABLE 테이블명 (
속성명 데이터_타입 PRIMARY KEY
);
또는
CREATE TABLE 테이블명 (
속성명 데이터_타입,
PRIMARY KEY(속성명)
);
**PRIMARY KEY**
)를 참조하게 된다. 다음은 FOREIGN KEY
제약 조건을 설정하는 예시이다. CREATE TABLE 테이블명 (
속성명 데이터타입,
FOREIGN KEY(속성명) REFERENCES 참조_테이블명(참조_속성명)
);
CHECK
제약 조건을 설정하는 예시이다. CREATE TABLE 테이블명 (
속성명 데이터타입 CHECK(조건식)
);
또는
CREATE TABLE 테이블명 (
속성명 데이터타입,
CONSTRAINT 제약조건명 CHECK(속성명=범위)
);
CREATE SCHEMA 스키마명 AUTHORIZATION 사용자;
CREATE DOMAIN 도메인명 데이터타입
[DEFUALT 기본값]
[CONSTRAINT 제약조건명 CHECK(VALUE IN(범위))];
CREATE [UNIQUE] INDEX 인덱스명
ON 테이블명(속성명[ASC|DESC])
[CLUSTER];
UNIQUE
: 중복을 허용하지 않도록 인덱스를 생성할 때 사용하며, 생략시 중복이 허용된다.ON 테이블명(속성명)
: 지정된 테이블의 속성으로 인덱스를 만든다.[ASC|DESC]
: 인덱스로 사용될 속성값의 정렬방법을 나타낸다. ASC
는 오름차순, DESC
는 내림차순을 의미한다.CLUSTER
: 인접된 튜플들을 물리적인 그룹으로 묶어서 저장하도록 할 때 사용된다.CREATE VIEW
구문을 통해 생성되고, CREATE OR REPLACE VIEW
구문으로 기존 VIEW가 존재하는 경우 갱신할 수 있다.CREATE VIEW 뷰이름 as
SELECT 속성명1, 속성명2, ... ,
FROM 테이블명
WHERE 조건
ALTER TABLE 테이블명 RENAME TO 바꿀테이블명;
ALTER TABLE 테이블명 ADD 추가할속성명 데이터타입;
ALTER TABLE 테이블명 ALTER COLUMN 속성명 SET DATA TYPE 변경할데이터타입;
ALTER TABLE 테이블명 DROP COLUMN 삭제할속성명;
ALTER TABLE 테이블명 ADD CONSTRAINT 제약조건명 제약조건;
ALTER TABLE 테이블명 ALTER CONSTRAINT 제약조건명 제약조건;
ALTER TABLE 테이블명 DROP CONSTRAINT 제거할제약조건;
ALTER TABLE 테이블명 ADD INDEX 인덱스명(속성명);
ALTER TABLE 테이블 ALTER INDEX 인덱스명 RENAME TO 바꿀인덱스명;
ALTER TABLE 테이블명 DROP INDEX 삭제할인덱스명;
ALTER VIEW 뷰이름 AS
SELECT 속성명1, 속성명2, ... ,
FROM 테이블명
WHERE 조건;
뷰이름
은 변경하려는 뷰의 이름을 지정하는 부분이다. AS
키워드를 사용하여 새로운 뷰의 정의를 수행한다. 그리고 SELECT
문을 사용하여 새로운 뷰의 정의를 작성한다. 이때 원하는 테이블과 조건을 사용하여 데이터를 선택하고, 필요한 속성을 지정할 수 있다.ALTER TABLE 테이블명 ADD PRIMARY KEY (속성명);
ALTER TABLE 테이블명 ADD FOREIGN KEY (속성명) REFERENCES 참조테이블명
DROP TABLE 테이블명 [CASCADE|RESTRICT];
DROP SCHEMA 스키마명 CASECADE|RESTRICT];
DROP DOMAIN 도메인명 [CASECADE|RESTRICT];
DROP INDEX 인덱스명;
DROP VIEW 뷰이름 [CASECADE|RESTRICT];
DROP CONSTRAINT 제약조건명;
DROP vs TRUNCATE
- DROP과 TRUNCATE는 둘 다 데이터베이스에서 테이블을 삭제하는 구문이지만 다음과 같은 차이점이 존재한다.
- 작동 방식:
DROP
: DROP 문은 테이블을 완전히 삭제한다. 즉 테이블과 관련된 데이터, 인덱스, 제약 조건 등 모든 객체가 삭제된다.TRUNCATE
: TRUNCATE 문은 테이블의 모든 데이터를 삭제한다. 테이블 스키마는 그대로 유지되며, 테이블 자체만 비워진다. 데이터의 물리적인 공간은 반환되지만, 테이블 구조는 그대로 유지된다.- 롤백 가능 여부:
DROP
: DROP 문은 테이블을 삭제하므로 롤백할 수 없다. 한 번 실행된 후에는 복구할 수 없으며, 데이터와 구조가 영구적으로 손실된다.TRUNCATE
: TRUNCATE 문은 테이블의 데이터를 삭제하지만 테이블 구조는 그대로 유지된다. 트랜잭션을 사용하는 경우 TRUNCATE 문은 롤백이 가능하다. 롤백되면 삭제된 데이터가 복구된다.- 성능:
DROP
: DROP 문은 테이블과 관련된 모든 객체를 삭제하기 때문에 작업이 더 많이 소요될 수 있다.TRUNCATE
: TRUNCATE 문은 테이블의 데이터를 삭제하고 테이블을 재사용할 수 있도록 공간을 반환하기 때문에 DROP에 비해 더 빠를 수 있다.- 권한:
DROP
: DROP 문은 테이블을 삭제하기 위해 필요한 권한을 요구한다. 테이블의 구조를 변경하는 작업이므로 더 높은 수준의 권한이 필요하다.TRUNCATE
: TRUNCATE 문은 테이블의 데이터를 삭제하는 작업이기 때문에 DROP에 비해 상대적으로 낮은 수준의 권한이 필요하다.
→ DROP 문은 테이블 자체와 모든 관련 객체를 삭제하는 반면 TRUNCATE 문은 테이블의 데이터를 삭제하고 테이블을 재사용할 수 있도록 공간을 반환한다. 롤백 가능 여부와 성능 측면에서도 차이가 있기 때문에 적절한 상황에 맞게 선택해야 한다.