데이터베이스와 테이블의 생성, 수정, 삭제 등 DDL(Data Definition Language) 명령어를 정리합니다.
데이터베이스 관리
데이터베이스 생성
-- 기본 생성
CREATE DATABASE mydb;
-- 문자셋 지정 (권장)
CREATE DATABASE mydb
DEFAULT CHARACTER SET utf8mb4
DEFAULT COLLATE utf8mb4_unicode_ci;
-- 이미 존재하면 무시
CREATE DATABASE IF NOT EXISTS mydb;
데이터베이스 조회
-- 전체 데이터베이스 목록
SHOW DATABASES;
-- 데이터베이스 생성 정보 확인
SHOW CREATE DATABASE mydb;
데이터베이스 선택 및 삭제
-- 사용할 데이터베이스 선택
USE mydb;
-- 현재 선택된 데이터베이스 확인
SELECT DATABASE();
-- 데이터베이스 삭제
DROP DATABASE mydb;
DROP DATABASE IF EXISTS mydb;
테이블 관리
테이블 생성
CREATE TABLE users (
id INT NOT NULL AUTO_INCREMENT,
username VARCHAR(50) NOT NULL,
email VARCHAR(100) NOT NULL,
password VARCHAR(255) NOT NULL,
age INT DEFAULT 0,
is_active TINYINT(1) DEFAULT 1,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (id),
UNIQUE KEY uk_email (email),
INDEX idx_username (username)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
주요 데이터 타입
숫자형
| 타입 |
크기 |
범위 (SIGNED) |
용도 |
| TINYINT |
1byte |
-128 ~ 127 |
불리언, 상태값 |
| SMALLINT |
2byte |
-32,768 ~ 32,767 |
작은 정수 |
| INT |
4byte |
-21억 ~ 21억 |
일반 정수 |
| BIGINT |
8byte |
-922경 ~ 922경 |
대용량 ID, 금액 |
| DECIMAL(M,D) |
가변 |
정밀 소수 |
금액 계산 (정확도 보장) |
| FLOAT |
4byte |
근사 소수 |
과학 계산 |
| DOUBLE |
8byte |
근사 소수 |
과학 계산 |
문자형
| 타입 |
최대 크기 |
특징 |
| CHAR(n) |
255자 |
고정 길이, 빠른 검색 |
| VARCHAR(n) |
65,535자 |
가변 길이, 공간 효율적 |
| TEXT |
65,535자 |
긴 텍스트 |
| MEDIUMTEXT |
16MB |
중간 크기 텍스트 |
| LONGTEXT |
4GB |
대용량 텍스트 |
날짜/시간형
| 타입 |
형식 |
범위 |
| DATE |
YYYY-MM-DD |
1000-01-01 ~ 9999-12-31 |
| TIME |
HH:MM:SS |
-838:59:59 ~ 838:59:59 |
| DATETIME |
YYYY-MM-DD HH:MM:SS |
1000 ~ 9999년 |
| TIMESTAMP |
YYYY-MM-DD HH:MM:SS |
1970 ~ 2038년 (UTC 자동 변환) |
테이블 조회
-- 테이블 목록
SHOW TABLES;
-- 테이블 구조 확인
DESC users;
DESCRIBE users;
SHOW COLUMNS FROM users;
-- 테이블 생성 SQL 확인
SHOW CREATE TABLE users;
테이블 수정 (ALTER TABLE)
-- 컬럼 추가
ALTER TABLE users ADD COLUMN phone VARCHAR(20) AFTER email;
-- 컬럼 수정
ALTER TABLE users MODIFY COLUMN phone VARCHAR(30) NOT NULL;
-- 컬럼 이름 변경
ALTER TABLE users CHANGE COLUMN phone mobile VARCHAR(30);
-- 컬럼 삭제
ALTER TABLE users DROP COLUMN mobile;
-- 인덱스 추가
ALTER TABLE users ADD INDEX idx_age (age);
-- 유니크 제약 추가
ALTER TABLE users ADD UNIQUE KEY uk_username (username);
-- 테이블 이름 변경
ALTER TABLE users RENAME TO members;
RENAME TABLE members TO users;
테이블 삭제 및 초기화
-- 테이블 삭제 (구조 + 데이터 모두 삭제)
DROP TABLE users;
DROP TABLE IF EXISTS users;
-- 테이블 데이터만 초기화 (구조 유지, AUTO_INCREMENT 리셋)
TRUNCATE TABLE users;
제약 조건 (Constraints)
| 제약 조건 |
설명 |
예시 |
| PRIMARY KEY |
기본키, NOT NULL + UNIQUE |
PRIMARY KEY (id) |
| UNIQUE |
중복 불가 |
UNIQUE KEY uk_email (email) |
| NOT NULL |
NULL 불가 |
username VARCHAR(50) NOT NULL |
| DEFAULT |
기본값 설정 |
age INT DEFAULT 0 |
| CHECK |
값 범위 제한 (MySQL 8.0+) |
CHECK (age >= 0) |
| FOREIGN KEY |
외래키 참조 |
아래 예시 참고 |
외래키 설정
CREATE TABLE orders (
id INT NOT NULL AUTO_INCREMENT,
user_id INT NOT NULL,
product VARCHAR(100) NOT NULL,
amount DECIMAL(10,2) NOT NULL,
ordered_at DATETIME DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id),
FOREIGN KEY (user_id) REFERENCES users(id)
ON DELETE CASCADE
ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
ON DELETE / ON UPDATE 옵션
| 옵션 |
설명 |
| CASCADE |
부모 삭제/수정 시 자식도 함께 삭제/수정 |
| SET NULL |
부모 삭제/수정 시 자식의 FK를 NULL로 설정 |
| RESTRICT |
자식이 있으면 부모 삭제/수정 불가 (기본값) |
| NO ACTION |
RESTRICT와 동일 |
| SET DEFAULT |
기본값으로 설정 (InnoDB 미지원) |
관련된 글 (mysql > lecture-mysql)