🐨CoalaCoding
DocsExamplesTry itBoardB반B반
🐨CoalaCoding

개발자를 위한 한국어 웹 기술 문서

문서

  • JavaScript
  • Web Publishing
  • React
  • Python

커뮤니티

  • 게시판
  • 예제 모음
  • Try it 에디터

기타

  • GitHub
  • 관리자
© 2026 CoalaCoding. All rights reserved.
  • sqlite3로 SQL 명령문 실행
  • DB데이터 일괄추가하기
  • SQLite3 라이브러리를 활용한 SQL 명령문 실행
  • Pandas를 활용한 SQL 명령문 실행
  • CREATE 명령어를 활용한 DB 테이블의 생성
  • DDL 명령어의 이해 및 실습
  • SQL SELECT 명령어의 이해 및 실습
  • SQL INSERT, UPDATE, DELETE 명령어 실습
  • SQL SELECT 세부 명령어 실습 1
  • SQL SELECT 세부 명령어 실습 2
  • SQL INNER JOIN 실습
  • SQL LEFT JOIN 실습
  • SQL GROUP BY 실습 1
  • SQL GROUP BY 실습 2
  • SQL SubQuery 활용 실습
  • 데이터셋 기반 DB 구축 & DB 활용 실습 — 리액트 연동 완성
  1. 홈
  2. 문서
  3. Backend
  4. Database & SQL
  5. DDL 명령어의 이해 및 실습

DDL 명령어의 이해 및 실습

코드 블록의 Try it Yourself 버튼으로 직접 실행할 수 있다.

구문

1. 인트로

DDL은 **Data Definition Language(데이터 데피니션 랭귀지)**의 약자이다. 데이터베이스의 구조(테이블, 컬럼 등)를 정의하고 변경하는 SQL 명령어 묶음이다. 이번 차시에서는 DDL의 핵심 명령어인 CREATE, ALTER, DROP을 익힌다.


2. DDL 명령어의 이해 및 실습

2.1. DDL vs DML

SQL 명령어는 목적에 따라 분류된다.

분류이름명령어역할
DDLData Definition LanguageCREATE, ALTER, DROP, RENAME구조 정의
DML(디엠엘)Data Manipulation LanguageINSERT, UPDATE, DELETE, SELECT데이터 조작
DCL(디씨엘)Data Control LanguageGRANT, REVOKE권한 관리

이번 차시는 DDL에 집중한다.

2.2. CREATE TABLE(크리에이트) — 테이블 생성

5차시에서 학습한 내용이다. 간단히 복습한다.

import sqlite3

conn = sqlite3.connect("music.db")
cur  = conn.cursor()

cur.execute("""
    CREATE TABLE IF NOT EXISTS artists (
        id    INTEGER PRIMARY KEY AUTOINCREMENT,
        name  TEXT    NOT NULL,
        debut INTEGER,
        genre TEXT
    )
""")
conn.commit()
print("artists 테이블 생성")

코드 설명:

  • 7행: IF NOT EXISTS — 테이블이 없을 때만 생성하며, 있으면 오류 없이 넘어간다.
  • 8행: id는 자동으로 1씩 증가하는 기본키이다.
  • 9행: name은 필수 입력 컬럼이다 (NOT NULL).

3. ALTER TABLE(알터) — 테이블 구조 수정

테이블을 삭제하지 않고 구조를 바꿀 때 사용한다.

3.1. 컬럼 추가

# 컬럼 추가
cur.execute("ALTER TABLE artists ADD COLUMN country TEXT DEFAULT '한국'")
conn.commit()
print("country 컬럼 추가 완료")

코드 설명:

  • 2행: ADD COLUMN으로 새 컬럼을 추가한다.
  • DEFAULT '한국' — 기존 행들의 country 값은 자동으로 '한국'으로 채워진다.

3.2. 테이블 이름 변경

# 테이블 이름 변경
cur.execute("ALTER TABLE artists RENAME TO kpop_artists")
conn.commit()
print("테이블 이름 변경 완료")

코드 설명:

  • 2행: RENAME TO로 테이블 이름을 바꾼다. 데이터는 그대로 유지된다.

Note: SQLite는 컬럼 삭제(DROP COLUMN)를 SQLite 3.35.0 이상 버전부터 지원한다. 지원하지 않는 환경에서는 새 테이블을 만들고 데이터를 복사하는 방법을 사용한다.


4. DB 테이블 목록 및 구조 확인 실습

4.1. 테이블 목록 확인

cur.execute("SELECT name FROM sqlite_master WHERE type='table'")
tables = cur.fetchall()

print("=== 테이블 목록 ===")
for t in tables:
    print(f"  {t[0]}")

4.2. 테이블 컬럼 구조 확인

# PRAGMA(프래그마)로 테이블 상세 구조 확인
cur.execute("PRAGMA table_info(kpop_artists)")
cols = cur.fetchall()

print("=== kpop_artists 테이블 구조 ===")
print(f"{'cid':<4} {'name':<12} {'type':<10} {'not null':<8} {'default'}")
for c in cols:
    print(f"{c[0]:<4} {c[1]:<12} {c[2]:<10} {c[3]:<8} {c[4]}")

실행 결과:

=== kpop_artists 테이블 구조 ===
cid  name         type       not null default
0    id           INTEGER    0        None
1    name         TEXT       1        None
2    debut        INTEGER    0        None
3    genre        TEXT       0        None
4    country      TEXT       0        '한국'

코드 설명:

  • 2행: PRAGMA table_info(테이블명)는 테이블의 컬럼 정보를 반환하는 SQLite 전용 명령이다.
  • 결과의 각 컬럼: cid(순서), name(컬럼명), type(타입), notnull(필수여부), dflt_value(기본값)

5. DROP — 테이블 삭제

5.1. DROP TABLE(드롭 테이블)

# 임시 테이블 생성
cur.execute("CREATE TABLE IF NOT EXISTS temp_test (id INTEGER, val TEXT)")

# 테이블 삭제
cur.execute("DROP TABLE IF EXISTS temp_test")
conn.commit()
print("temp_test 테이블 삭제 완료")

코드 설명:

  • 5행: IF EXISTS — 테이블이 없어도 오류 없이 넘어간다.
  • DROP TABLE은 테이블의 구조와 데이터를 모두 삭제한다. 되돌릴 수 없다.

Warning: DROP TABLE은 테이블과 모든 데이터를 영구적으로 삭제한다. 반드시 백업 후 사용하거나, IF EXISTS를 붙여 오류를 방지한다.


6. 전체 흐름 실습 — 음악 앱 DB 구축

리액트 음악 앱을 위한 DB를 처음부터 설계하고 구성한다.

import sqlite3

conn = sqlite3.connect("music_app.db")
cur  = conn.cursor()

# 1. 아티스트 테이블 생성
cur.execute("""
    CREATE TABLE IF NOT EXISTS artists (
        id      INTEGER PRIMARY KEY AUTOINCREMENT,
        name    TEXT    NOT NULL UNIQUE,
        country TEXT    DEFAULT '한국',
        genre   TEXT
    )
""")

# 2. 앨범 테이블 생성
cur.execute("""
    CREATE TABLE IF NOT EXISTS albums (
        id        INTEGER PRIMARY KEY AUTOINCREMENT,
        title     TEXT    NOT NULL,
        artist_id INTEGER NOT NULL,
        release_yr INTEGER,
        FOREIGN KEY (artist_id) REFERENCES artists(id)
    )
""")

# 3. 트랙 테이블 생성
cur.execute("""
    CREATE TABLE IF NOT EXISTS tracks (
        id        INTEGER PRIMARY KEY AUTOINCREMENT,
        title     TEXT    NOT NULL,
        album_id  INTEGER NOT NULL,
        duration  INTEGER,
        play_cnt  INTEGER DEFAULT 0,
        FOREIGN KEY (album_id) REFERENCES albums(id)
    )
""")

conn.commit()
print("음악 앱 DB 구축 완료!")

코드 설명:

  • 8~14행: artists 테이블 — 아티스트 정보를 저장한다.
  • 17~24행: albums 테이블 — 앨범 정보를 저장하며 artist_id로 아티스트와 연결된다.
  • 27~35행: tracks 테이블 — 트랙 정보를 저장하며 album_id로 앨범과 연결된다.
  • 이 3개 테이블이 리액트 음악 앱의 핵심 DB 구조이다.

7. 활용 Plus — 리액트 연동 관점

리액트 음악 앱에서 "아티스트별 앨범 목록" 페이지를 만들 때, 파이썬 API는 아래 쿼리를 실행한다.

SELECT artists.name, albums.title, albums.release_yr
FROM albums
JOIN artists ON albums.artist_id = artists.id
WHERE artists.name = 'aespa';

이 SQL이 동작하려면 지금 배운 DDL로 테이블 구조가 올바르게 설계되어 있어야 한다.


8. 문제풀기

Q1. DDL과 DML의 차이점은?

DDL(Data Definition Language): 테이블 구조를 정의하고 변경한다 (CREATE, ALTER, DROP). DML(Data Manipulation Language): 테이블 안의 데이터를 조작한다 (INSERT, UPDATE, DELETE, SELECT).

Q2. ALTER TABLE로 할 수 있는 작업 2가지를 쓰시오.

① 컬럼 추가: ALTER TABLE 테이블명 ADD COLUMN 컬럼명 타입 ② 테이블 이름 변경: ALTER TABLE 테이블명 RENAME TO 새이름

Q3. PRAGMA table_info()의 역할은?

테이블의 컬럼 목록, 데이터 타입, NOT NULL 여부, 기본값 등 구조 정보를 반환한다.

Q4. DROP TABLE과 DELETE FROM의 차이점은?

DROP TABLE: 테이블 구조와 데이터를 모두 영구 삭제한다. DELETE FROM: 테이블 구조는 유지하고 데이터만 삭제한다.

목차

  • 구문