sqlCREATE DATABASE Board;
USE Board;
설명:
CREATE DATABASE: 새로운 데이터베이스를 생성합니다
USE: 작업할 데이터베이스를 선택합니다. 이후 모든 명령은 이 데이터베이스에서 실행됩니다
2. 사용자 테이블 생성
테이블 명명 규칙
복수형 사용 권장: user ❌ → users ✅
이유: 테이블은 여러 레코드를 담는 컨테이너이므로 복수형이 의미상 더 적절
실수 방지 팁
CLI에서 긴 SQL 문 작성 시:
메모장이나 텍스트 에디터에서 먼저 작성
검토 후 복사/붙여넣기
CMD 복붙 설정: 속성 → Ctrl+Shift+C/V 단축키 활성화
users 테이블 생성
CREATE TABLE users (
id INT NOT NULL AUTO_INCREMENT,
name VARCHAR(30) NOT NULL,
job VARCHAR(100),
birth DATE,
PRIMARY KEY (id)
);
컬럼 설명:
id:
name:
VARCHAR(30): 최대 30자 가변 길이 문자열
NOT NULL: 필수 입력 항목
job:
VARCHAR(100): 선택 사항 (NULL 허용)
birth:
DATE: 날짜 형식 (YYYY-MM-DD)
⚠️ 주의사항: 문장 분리 오류
-- ❌ 잘못된 방법 (문장을 나눠서 입력)
INSERT INTO users(name, job, birth) -- 엔터
VALUES ("gongu", "actor", "1980-01-23"); -- 별도 입력
-- ✅ 올바른 방법 (하나의 완전한 문장)
INSERT INTO users (name, job, birth)
VALUES ("gongu", "actor", "1980-01-23");
이유: SQL은 세미콜론(;)을 만나야 문장이 끝났다고 인식합니다. 문장을 나눠 입력하면 첫 번째 줄에서 문법 오류가 발생합니다.
날짜 형식
여러 행 동시 삽입
INSERT INTO users (name, job, birth)
VALUES
("gongu", "actor", "1980-01-23"),
("kim", "developer", "1990-05-15"),
("lee", "designer", "1985-12-30");
4. 게시글 테이블 생성
CREATE TABLE posts (
id INT NOT NULL AUTO_INCREMENT,
title VARCHAR(100) NOT NULL,
content VARCHAR(2000),
created_at TIMESTAMP DEFAULT NOW(),
PRIMARY KEY (id)
);
새로운 요소:
created_at TIMESTAMP DEFAULT NOW():
데이터 삽입 시 자동으로 현재 시간 기록
NOW(): 현재 날짜와 시간을 반환하는 함수
INSERT INTO posts (title, content)
VALUES ("title1", "content1");
참고: created_at은 명시하지 않아도 자동으로 현재 시간이 입력됩니다 (DEFAULT 설정 덕분).
ALTER TABLE posts
ADD COLUMN updated_at DATETIME
DEFAULT NOW()
ON UPDATE NOW();
컬럼 설명:
ALTER TABLE의 다른 용도
-- 컬럼 삭제
ALTER TABLE posts DROP COLUMN updated_at;
-- 컬럼 이름 변경
ALTER TABLE posts CHANGE updated_at modified_at DATETIME;
-- 컬럼 타입 변경
ALTER TABLE posts MODIFY content TEXT;
UPDATE posts
SET content = "updated!"
WHERE id = 2;
⚠️ WHERE 절 필수!
-- WHERE 없으면 모든 행이 수정됨!
UPDATE posts SET content = "updated!"; -- 위험! 전체 수정
여러 컬럼 동시 수정:
UPDATE posts
SET
title = "new title",
content = "new content"
WHERE id = 2;
Step 1: user_id 컬럼 추가
ALTER TABLE posts
ADD COLUMN user_id INT;
Step 2: 외래 키 제약조건 추가
ALTER TABLE posts
ADD FOREIGN KEY(user_id)
REFERENCES users(id);
외래 키의 역할:
외래 키 제약조건 옵션
ALTER TABLE posts
ADD FOREIGN KEY(user_id)
REFERENCES users(id)
ON DELETE CASCADE -- 부모 삭제 시 자식도 삭제
ON UPDATE CASCADE; -- 부모 수정 시 자식도 수정
옵션 종류:
LEFT JOIN 기본
SELECT *
FROM posts
LEFT JOIN users ON posts.user_id = users.id;
LEFT JOIN 특징:
필요한 컬럼만 선택
SELECT
posts.id,
title,
content,
created_at,
updated_at,
name,
job,
birth
FROM posts
LEFT JOIN users ON posts.user_id = users.id;
테이블 별칭 사용:
SELECT
p.id,
p.title,
p.content,
u.name,
u.job
FROM posts p
LEFT JOIN users u ON p.user_id = u.id;
JOIN 종류
-- INNER JOIN: 양쪽 모두 매칭되는 데이터만
SELECT * FROM posts
INNER JOIN users ON posts.user_id = users.id;
-- RIGHT JOIN: 오른쪽 테이블 기준
SELECT * FROM posts
RIGHT JOIN users ON posts.user_id = users.id;
-- FULL OUTER JOIN (MySQL은 미지원, UNION으로 구현)
SELECT * FROM posts LEFT JOIN users ON posts.user_id = users.id
UNION
SELECT * FROM posts RIGHT JOIN users ON posts.user_id = users.id;
1. DATE
birth DATE -- YYYY-MM-DD
-- 예: '2025-09-29'
2. DATETIME
sqlcreated_at DATETIME -- YYYY-MM-DD HH:MM:SS
-- 예: '2025-09-29 14:30:00'
3. TIME
sqlwork_time TIME -- HH:MM:SS
-- 예: '14:30:00'
4. TIMESTAMP ⭐
sqlupdated_at TIMESTAMP DEFAULT NOW() ON UPDATE NOW()
-- 예: '2025-09-29 14:30:00'
NOT NULL
sqlname VARCHAR(30) NOT NULL
특징:
sql-- ❌ 오류 발생
INSERT INTO users (name, job) VALUES (NULL, "actor");
-- ❌ 오류 발생 (컬럼 자체를 생략)
INSERT INTO users (job) VALUES ("actor");
-- ✅ 정상 (빈 문자열은 NULL이 아님)
INSERT INTO users (name, job) VALUES ("", "actor");
DEFAULT
sqlcreated_at TIMESTAMP DEFAULT NOW()
job VARCHAR(100) DEFAULT 'unemployed'
특징:
sql-- 시나리오 1: 컬럼 생략 → DEFAULT 값 사용
INSERT INTO users (name) VALUES ("kim");
-- 결과: job = 'unemployed'
-- 시나리오 2: 명시적 NULL 입력 → NULL 저장
INSERT INTO users (name, job) VALUES ("lee", NULL);
-- 결과: job = NULL
-- 시나리오 3: 명시적 값 입력 → 입력값 저장
INSERT INTO users (name, job) VALUES ("park", "doctor");
-- 결과: job = 'doctor'
sqlcreated_at TIMESTAMP NOT NULL DEFAULT NOW()
장점:
데이터 조회 (SELECT)
-- 전체 조회
SELECT * FROM users;
-- 조건부 조회
SELECT * FROM users WHERE job = 'actor';
-- 정렬
SELECT * FROM users ORDER BY birth DESC;
-- 개수 제한
SELECT * FROM users LIMIT 5;
-- 검색
SELECT * FROM users WHERE name LIKE '%gon%';
데이터 삭제 (DELETE)
-- 특정 행 삭제
DELETE FROM posts WHERE id = 2;
-- ⚠️ 전체 삭제 (주의!)
DELETE FROM posts; -- WHERE 절 없으면 모든 데이터 삭제!
테이블 정보 확인
-- 테이블 구조 확인
DESCRIBE users;
DESC users;
-- 테이블 목록 확인
SHOW TABLES;
-- 데이터베이스 목록
SHOW DATABASES;
-- 생성된 CREATE 문 확인
SHOW CREATE TABLE users;
트랜잭션
START TRANSACTION;
UPDATE posts SET title = "new" WHERE id = 1;
DELETE FROM posts WHERE id = 2;
-- 문제 없으면 커밋
COMMIT;
-- 문제 있으면 롤백
ROLLBACK;