Type something to search...

06 DDL 명령어의 이해 및 실습

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차시에서 학습한 내용이다. 간단히 복습한다.

1
import sqlite3
2
3
conn = sqlite3.connect("music.db")
4
cur = conn.cursor()
5
6
cur.execute("""
7
CREATE TABLE IF NOT EXISTS artists (
8
id INTEGER PRIMARY KEY AUTOINCREMENT,
9
name TEXT NOT NULL,
10
debut INTEGER,
11
genre TEXT
12
)
13
""")
14
conn.commit()
15
print("artists 테이블 생성")

코드 설명:

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

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

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

3.1. 컬럼 추가

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

코드 설명:

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

3.2. 테이블 이름 변경

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

코드 설명:

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

참고

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


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

4.1. 테이블 목록 확인

1
cur.execute("SELECT name FROM sqlite_master WHERE type='table'")
2
tables = cur.fetchall()
3
4
print("=== 테이블 목록 ===")
5
for t in tables:
6
print(f" {t[0]}")

4.2. 테이블 컬럼 구조 확인

1
# PRAGMA(프래그마)로 테이블 상세 구조 확인
2
cur.execute("PRAGMA table_info(kpop_artists)")
3
cols = cur.fetchall()
4
5
print("=== kpop_artists 테이블 구조 ===")
6
print(f"{'cid':<4} {'name':<12} {'type':<10} {'not null':<8} {'default'}")
7
for c in cols:
8
print(f"{c[0]:<4} {c[1]:<12} {c[2]:<10} {c[3]:<8} {c[4]}")

실행 결과:

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

코드 설명:

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

5. DROP — 테이블 삭제

5.1. DROP TABLE(드롭 테이블)

1
# 임시 테이블 생성
2
cur.execute("CREATE TABLE IF NOT EXISTS temp_test (id INTEGER, val TEXT)")
3
4
# 테이블 삭제
5
cur.execute("DROP TABLE IF EXISTS temp_test")
6
conn.commit()
7
print("temp_test 테이블 삭제 완료")

코드 설명:

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

주의

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


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

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

1
import sqlite3
2
3
conn = sqlite3.connect("music_app.db")
4
cur = conn.cursor()
5
6
# 1. 아티스트 테이블 생성
7
cur.execute("""
8
CREATE TABLE IF NOT EXISTS artists (
9
id INTEGER PRIMARY KEY AUTOINCREMENT,
10
name TEXT NOT NULL UNIQUE,
11
country TEXT DEFAULT '한국',
12
genre TEXT
13
)
14
""")
15
16
# 2. 앨범 테이블 생성
17
cur.execute("""
18
CREATE TABLE IF NOT EXISTS albums (
19
id INTEGER PRIMARY KEY AUTOINCREMENT,
20
title TEXT NOT NULL,
21
artist_id INTEGER NOT NULL,
22
release_yr INTEGER,
23
FOREIGN KEY (artist_id) REFERENCES artists(id)
24
)
25
""")
26
27
# 3. 트랙 테이블 생성
28
cur.execute("""
29
CREATE TABLE IF NOT EXISTS tracks (
30
id INTEGER PRIMARY KEY AUTOINCREMENT,
31
title TEXT NOT NULL,
32
album_id INTEGER NOT NULL,
33
duration INTEGER,
34
play_cnt INTEGER DEFAULT 0,
35
FOREIGN KEY (album_id) REFERENCES albums(id)
36
)
37
""")
38
39
conn.commit()
40
print("음악 앱 DB 구축 완료!")

코드 설명:

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

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

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

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

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


8. 문제풀기

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

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

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

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