SQL CLI 완벽 가이드 - Board 데이터베이스 구축

데브코스

목록 보기
44/131

1. 데이터베이스 생성 및 선택

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:

  • INT: 정수형
  • NOT NULL: null 값 불가
  • AUTO_INCREMENT: 자동으로 1씩 증가 (1, 2, 3...)
  • PRIMARY KEY: 고유 식별자, 중복 불가, 인덱스 자동 생성

name:
VARCHAR(30): 최대 30자 가변 길이 문자열
NOT NULL: 필수 입력 항목

job:
VARCHAR(100): 선택 사항 (NULL 허용)

birth:
DATE: 날짜 형식 (YYYY-MM-DD)


3. 사용자 데이터 삽입

⚠️ 주의사항: 문장 분리 오류

-- ❌ 잘못된 방법 (문장을 나눠서 입력)
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은 세미콜론(;)을 만나야 문장이 끝났다고 인식합니다. 문장을 나눠 입력하면 첫 번째 줄에서 문법 오류가 발생합니다.
날짜 형식

  • DATE 타입: "YYYY-MM-DD" 형식 사용
  • 예: "1980-01-23" (1980년 1월 23일)

여러 행 동시 삽입

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(): 현재 날짜와 시간을 반환하는 함수


5. 게시글 데이터 삽입

INSERT INTO posts (title, content)
VALUES ("title1", "content1");

참고: created_at은 명시하지 않아도 자동으로 현재 시간이 입력됩니다 (DEFAULT 설정 덕분).


6. 게시글 테이블에 수정일자 컬럼 추가

ALTER TABLE posts
ADD COLUMN updated_at DATETIME
DEFAULT NOW()
ON UPDATE NOW();

컬럼 설명:

  • 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;

7. 게시글 수정 (UPDATE)

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;

8. 외래 키(Foreign Key) 추가

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);

외래 키의 역할:

  • posts.user_id는 반드시 users.id에 존재하는 값이어야 함
  • 참조 무결성 보장
  • 존재하지 않는 user_id는 삽입 불가

외래 키 제약조건 옵션

ALTER TABLE posts
ADD FOREIGN KEY(user_id)
REFERENCES users(id)
ON DELETE CASCADE        -- 부모 삭제 시 자식도 삭제
ON UPDATE CASCADE;       -- 부모 수정 시 자식도 수정

옵션 종류:

  • CASCADE: 부모 변경 시 자식도 같이 변경
  • SET NULL: 부모 삭제 시 자식의 FK를 NULL로 설정
  • NO ACTION / RESTRICT: 자식이 있으면 부모 삭제/수정 불가

⚡ JOIN (조인) - 테이블 결합

LEFT JOIN 기본

SELECT * 
FROM posts 
LEFT JOIN users ON posts.user_id = users.id;

LEFT JOIN 특징:

  • 왼쪽 테이블(posts)의 모든 데이터 포함
  • 매칭되는 오른쪽 테이블(users) 데이터 결합
  • 매칭 안 되면 users 컬럼은 NULL

필요한 컬럼만 선택

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;

📅 MySQL(MariaDB) 날짜/시간 타입

1. DATE

birth DATE  -- YYYY-MM-DD
-- 예: '2025-09-29'
  • 날짜만 저장
  • 3바이트 사용

2. DATETIME

sqlcreated_at DATETIME  -- YYYY-MM-DD HH:MM:SS
-- 예: '2025-09-29 14:30:00'
  • 날짜 + 시간 저장
  • 8바이트 사용
  • 타임존 정보 없음 (입력한 그대로 저장)

3. TIME

sqlwork_time TIME  -- HH:MM:SS
-- 예: '14:30:00'
  • 시간만 저장
  • 3바이트 사용

4. TIMESTAMP ⭐

sqlupdated_at TIMESTAMP DEFAULT NOW() ON UPDATE NOW()
-- 예: '2025-09-29 14:30:00'
  • 날짜 + 시간 저장
  • 4바이트 사용 (더 효율적)
  • 시스템 타임존에 맞게 자동 변환
  • 자동 입력/갱신 기능 제공
  • 1970-01-01 ~ 2038-01-19 범위

🔑 NOT NULL vs DEFAULT

NOT NULL

sqlname VARCHAR(30) NOT NULL

특징:

  • 반드시 값이 있어야 함
  • NULL을 명시적으로 입력해도 오류 발생
  • 빈 문자열('')과 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'

특징:

  • 값을 입력하지 않으면 기본값 사용
  • 명시적으로 NULL을 입력하면 NULL이 저장됨 (DEFAULT 무시)
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'

NOT NULL + DEFAULT 조합 (권장)

sqlcreated_at TIMESTAMP NOT NULL DEFAULT NOW()

장점:

  • NULL 저장 완전 차단
  • 값 생략 시 기본값 자동 입력
  • 데이터 무결성 보장

🎯 추가 유용한 명령어

데이터 조회 (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;

💡 실무 팁

  1. 항상 WHERE 절 확인: UPDATE, DELETE 사용 시 필수
  2. 백업 습관: 중요한 작업 전 데이터 백업
  3. 트랜잭션 활용: 여러 작업을 안전하게 처리
  4. 인덱스 고려: 자주 조회하는 컬럼에 인덱스 생성
  5. 명명 규칙 일관성: snake_case 또는 camelCase 통일
  6. 외래 키 제약: 데이터 무결성 유지에 필수
profile
Dive Head First | Work Super Hard | Attract Great People

0개의 댓글