# 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