# 테이블 생성
CREATE TABLE 테이블명 (
컬럼명1 데이터타입,
컬럼명2 데이터타입,
컬럼명3 데이터타입
);
CREATE TABLE animal (
name VARCHAR(16),
type VARCHAR(16)
);
CREATE TABLE IF NOT EXISTS 테이블명 (...);
# 테이블 목록 확인
SHOW TABLES;
SHOW TABLES LIKE '패턴';
# 테이블 구조 확인
DESC 테이블명;
DESCRIBE 테이블명;
SHOW COLUMNS FROM 테이블명;
SHOW CREATE TABLE 테이블명; # 생성 쿼리 확인
# 컬럼 추가
ALTER TABLE 테이블명 ADD 컬럼명 데이터타입;
ALTER TABLE animal ADD age INT;
ALTER TABLE animal ADD old INT;
ALTER TABLE 테이블명 ADD 컬럼명 데이터타입 AFTER 기존컬럼명; # 특정 위치에 추가
ALTER TABLE 테이블명 ADD 컬럼명 데이터타입 FIRST; # 첫 번째 위치에 추가
# 컬럼 삭제
ALTER TABLE 테이블명 DROP COLUMN 컬럼명;
ALTER TABLE animal DROP COLUMN age;
# 컬럼 이름 및 데이터 타입 변경
ALTER TABLE 테이블명 CHANGE 기존컬럼명 새컬럼명 새데이터타입;
ALTER TABLE animal CHANGE old sex CHAR(1);
ALTER TABLE 테이블명 MODIFY 컬럼명 새데이터타입; # 타입만 변경
ALTER TABLE 테이블명 RENAME COLUMN 기존컬럼명 TO 새컬럼명; # 이름만 변경 (MySQL 8.0)
# 컬럼 위치 변경
ALTER TABLE 테이블명 MODIFY 컬럼명 데이터타입 AFTER 기존컬럼명;
ALTER TABLE 테이블명 MODIFY 컬럼명 데이터타입 FIRST;
# 테이블 이름 변경
ALTER TABLE 기존테이블명 RENAME TO 새테이블명;
RENAME TABLE 기존테이블명 TO 새테이블명;
# 테이블 삭제
DROP TABLE 테이블명;
DROP TABLE animal;
DROP TABLE IF EXISTS 테이블명;
DROP TABLE 테이블명1, 테이블명2; # 여러 테이블 동시 삭제
# 테이블 구조 복사 (데이터 없이)
CREATE TABLE 새테이블명 LIKE 기존테이블명;
# 테이블 구조 및 데이터 복사
CREATE TABLE 새테이블명 AS SELECT * FROM 기존테이블명;
- INT: 정수 (-2,147,483,648 ~ 2,147,483,647)
- BIGINT: 큰 정수
- TINYINT: 작은 정수 (-128 ~ 127)
- SMALLINT: 작은 정수 (-32,768 ~ 32,767)
- MEDIUMINT: 중간 정수
- FLOAT: 부동소수점
- DOUBLE: 배정밀도 부동소수점
- DECIMAL(M, D): 고정소수점 (M: 전체 자릿수, D: 소수점 자릿수)
- CHAR(N): 고정 길이 문자열 (최대 255)
- VARCHAR(N): 가변 길이 문자열 (최대 65,535)
- TEXT: 긴 텍스트 (최대 65,535)
- MEDIUMTEXT: 중간 텍스트 (최대 16,777,215)
- LONGTEXT: 매우 긴 텍스트 (최대 4,294,967,295)
- DATE: 날짜 (YYYY-MM-DD)
- TIME: 시간 (HH:MM:SS)
- DATETIME: 날짜와 시간 (YYYY-MM-DD HH:MM:SS)
- TIMESTAMP: 타임스탬프 (1970-01-01 00:00:01 ~ 2038-01-19 03:14:07)
- YEAR: 연도
- BOOLEAN / BOOL: 불린 (TINYINT(1)과 동일)
- ENUM: 열거형
- SET: 집합
- JSON: JSON 데이터 (MySQL 5.7.8+)
# PRIMARY KEY (기본 키)
CREATE TABLE 테이블명 (
id INT PRIMARY KEY,
name VARCHAR(50)
);
CREATE TABLE 테이블명 (
id INT,
name VARCHAR(50),
PRIMARY KEY (id)
);
# FOREIGN KEY (외래 키)
CREATE TABLE 테이블명 (
id INT PRIMARY KEY,
user_id INT,
FOREIGN KEY (user_id) REFERENCES users(id)
);
# UNIQUE (고유 제약)
CREATE TABLE 테이블명 (
id INT PRIMARY KEY,
email VARCHAR(100) UNIQUE
);
# NOT NULL (NULL 금지)
CREATE TABLE 테이블명 (
id INT PRIMARY KEY,
name VARCHAR(50) NOT NULL
);
# DEFAULT (기본값)
CREATE TABLE 테이블명 (
id INT PRIMARY KEY,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
# AUTO_INCREMENT (자동 증가)
CREATE TABLE 테이블명 (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50)
);
# CHECK (조건 검사) - MySQL 8.0.16+
CREATE TABLE 테이블명 (
id INT PRIMARY KEY,
age INT CHECK (age >= 0 AND age <= 150)
);
# 제약 조건 추가
ALTER TABLE 테이블명 ADD PRIMARY KEY (컬럼명);
ALTER TABLE 테이블명 ADD UNIQUE (컬럼명);
ALTER TABLE 테이블명 ADD FOREIGN KEY (컬럼명) REFERENCES 참조테이블(참조컬럼);
ALTER TABLE 테이블명 ADD CONSTRAINT 제약조건명 UNIQUE (컬럼명);
# 제약 조건 삭제
ALTER TABLE 테이블명 DROP PRIMARY KEY;
ALTER TABLE 테이블명 DROP INDEX 제약조건명;
ALTER TABLE 테이블명 DROP FOREIGN KEY 제약조건명;
# 인덱스 생성
CREATE INDEX 인덱스명 ON 테이블명 (컬럼명);
CREATE INDEX idx_name ON animal (name);
CREATE UNIQUE INDEX 인덱스명 ON 테이블명 (컬럼명); # 고유 인덱스
CREATE INDEX 인덱스명 ON 테이블명 (컬럼명1, 컬럼명2); # 복합 인덱스
# 인덱스 확인
SHOW INDEX FROM 테이블명;
# 인덱스 삭제
DROP INDEX 인덱스명 ON 테이블명;
ALTER TABLE 테이블명 DROP INDEX 인덱스명;
# animal 테이블 생성 및 확인
CREATE TABLE animal (
name VARCHAR(16),
type VARCHAR(16)
);
DESC animal;
# age 컬럼 추가 및 확인
ALTER TABLE animal ADD age INT;
DESC animal;
# old 컬럼 추가 및 확인
ALTER TABLE animal ADD old INT;
DESC animal;
# age 컬럼 삭제 및 확인
ALTER TABLE animal DROP COLUMN age;
DESC animal;
# old 컬럼을 sex로 변경 및 확인
ALTER TABLE animal CHANGE old sex CHAR(1);
DESC animal;
# 테이블 삭제 및 확인
DROP TABLE animal;
SHOW TABLES;
- 데이터 손실: 컬럼 삭제나 타입 변경 시 데이터가 손실될 수 있음
- 타입 호환성: 데이터 타입 변경 시 기존 데이터와 호환되는지 확인 필요
- 제약 조건: 외래 키가 있는 컬럼은 삭제 전 참조 관계 확인 필요
- 인덱스: 컬럼 삭제 시 해당 컬럼의 인덱스도 함께 삭제됨
- 성능: 대용량 테이블의 구조 변경은 시간이 오래 걸릴 수 있음
- 백업: 구조 변경 전 데이터 백업 권장