# Table of Contents
# DDL
DDL(Data Definition Lauguage)
의 약자로 데이터베이스의 구조(Schema)를 정의하는 기능이다.
- CREATE
- ALTER
- DROP
- TRUNCATE
# CREATE
CREATE TABLE member (
id BIGINT NOT NULL AUTO_INCREMENT,
name VARCHAR(255),
email VARCHAR(255),
age INT,
nation VARCHAR(255),
gender VARCHAR(255),
PRIMARY KEY (id),
UNIQUE KEY (email)
);
CREATE TABLE post (
id BIGINT NOT NULL AUTO_INCREMENT,
content LONGTEXT,
writer_id BIGINT,
violating BOOLEAN DEFAULT false,
PRIMARY KEY (id),
FOREIGN KEY (writer_id) REFERENCES member (id) ON UPDATE CASCADE ON DELETE SET NULL
);
테이블이 이미 존재하는 경우 삭제 후 다시 생성할 수 있다.
DROP TABLE IF EXISTS member;
CREATE TABLE member(
-- 생략 ...
);
테이블이 존재하지 않는 경우에만 생성할 수도 있따.
CREATE TABLE IF NOT EXISTS member (
-- 생략 ...
);
# MySQL의 자료형
자주 사용하는 MySQL
자료형은 다음과 같다.
# 정수형 숫자
이름 | 설명 | 바이트 | 부호 있는 수 범위 | 부호 없는 수 범위 |
---|---|---|---|---|
TINYINT | 아주 작은 정수 | 1 바이트 | -128 ~ 127 | 0 ~ 255 |
SMALLINT | 작은 정수 | 2 바이트 | -32768 ~ 32767 | 0 ~ 65535 |
MEDIUMINT | 중간 정수 | 3 바이트 | -8388608 ~ 8388607 | 0 ~ 16777215 |
INT | 정수 | 4 바이트 | 0 ~ | |
BIGINT | 큰 정수 | 8 바이트 | 0 ~ |
예제는 다음과 같다.
CREATE TABLE person (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
age INT
...
);
# 실수형 숫자
이름 | 설명 | 범위 |
---|---|---|
DECIMAL | 고정 소수점 | DECIMAL(3, 1)의 경우 -999.9 ~ 999.9 |
FLOAT | 유동 소수점 | 소수점 아래 7자리까지 표현 |
DOUBLE | 유동 소수점 | 소수점 아래 15자리까지 표현 |
예제는 다음과 같다.
CREATE TABLE person (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
age INT,
height FLOAT,
weight DECIMAL(3, 1)
);
# 불리언
이름 | 설명 | 범위 |
---|---|---|
BOOLEAN | TINYINT(1)로 저장된다. | 0은 false, 1은 true |
CREATE TABLE person (
is_married BOOLEAN
...
);
INSERT INTO person(is_married, ...) VALUES(true, ...);
# 문자
이름 | 범위 | 설명 |
---|---|---|
CHAR(M) (M=문자 수) | 최대 길이 255의 문자열을 저장할 수 있다. | 실제 문자열 길이와 상관없이 고정된 디스크 공간을 차지한다. 예를 들어 문자 수를 200으로 지정했는데 문자 수 100인 문자열이 저장되면 나머지는 패딩값으로 채우기 때문에 저장 공간을 낭비할 수 있다. |
VARCHAR(M) | 최대 길이 65,535의 문자열을 저장할 수 있다. | 실제 문자열 길이에 따라 가변적인 디스크 공간을 차지한다. |
TEXT | 최대 길이 65,535의 문자열을 저장할 수 있다. | |
MEDIUMTEXT | 최대 길이 16,777,215의 문자열을 저장할 수 있다. | |
LONGTEXT | 최대 길이 429,496,729의 문자열을 저장할 수 있다. |
예제는 다음과 같다.
CREATE TABLE post (
....
name VARCHAR(255) NOT NULL,
content TEXT
);
# 바이너리
이름 | 설명 |
---|---|
BLOB | Binary Large Object. 이미지, 동영상 같은 바이너리 데이터를 저장할 수 있다. |
예제는 다음과 같다.
CREATE TABLE person (
...
avatar_image BLOB
);
# 시간, 날짜
이름 | 설명 |
---|---|
TIME | 시간을 표현 |
DATE | 날짜를 표현 |
DATETIME | 날짜와 시간을 같이 표현 |
TIMESTAMP | 날짜와 시간을 같이 표현. 데이터베이스의 time_zone에 의존한다. |
YEAR | 연도를 표현 |
예제는 다음과 같다.
CREATE TABLE person (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
# 기본값 설정
DEFAULT
키워드로 기본값을 설정할 수 있다.
CREATE TABLE person (
...
name VARCHAR(255) DEFAULT "Anonymous"
);
# ON UPDATE, ON DELETE
외래키를 생성할 때 ON UPDATE
, ON DELETE
를 설정할 수 있다. 이를 통해 참조되는 테이블의 데이터를 삭제하거나 수정하면, 참조하는 테이블에서 어떻게 처리할지 설정할 수 있다.
CASCADE
: 참조되는 테이블에서 데이터를 삭제하거나 수정하면, 참조하는 테이블에서도 삭제와 수정된다.SET NULL
: 참조되는 테이블에서 데이터를 삭제하거나 수정하면, 참조하는 테이블의 데이터는 NULL로 변경된다.SET DEFAULT
: 참조되는 테이블에서 데이터를 삭제하거나 수정하면, 참조하는 테이블의 데이터는 필드의 기본값으로 설정된다.RESTRICT
: 참조하는 테이블에 데이터가 남아 있으면, 참조되는 테이블의 데이터를 삭제하거나 수정할 수 없다.NO ACTION
: 참조되는 테이블에서 데이터를 삭제하거나 수정해도, 참조하는 테이블의 데이터는 변경되지 않는다.
# ALTER
# 컬럼 추가
ALTER TABLE member ADD COLUMN school VARCHAR(255);
# 컬럼 변경
ALTER TABLE post MODIFY COLUMN content VARCHAR(1000);
# 컬럼 이름 변경
ALTER TABLE member CHANGE COLUMN gender sex VARCHAR(255);
# 컬럼 삭제
ALTER TABLE member DROP COLUMN sex;
# 테이블 이름 변경
ALTER TABLE post RENAME posts;
# DROP
DROP TABLE member;
# TRUCATE
TRUNCATE TABLE member;
# TRIGGER
테이블에 INSERT
, UPDATE
, DETELE
같은 DML
이 수행될 때 특정 작업을 실행시킨다.
CREATE TRIGGER trigger_account_on_deleted
AFTER DELETE
ON member
FOR EACH ROW
BEGIN
INSERT INTO deleted_account
VALUES (OLD.id, OLD.email, OLD.name, CURDATE());
END