DDL 명령어의 이해 및 실습
코드 블록의 Try it Yourself 버튼으로 직접 실행할 수 있다.
구문
1. 인트로
DDL은 **Data Definition Language(데이터 데피니션 랭귀지)**의 약자이다.
데이터베이스의 구조(테이블, 컬럼 등)를 정의하고 변경하는 SQL 명령어 묶음이다.
이번 차시에서는 DDL의 핵심 명령어인 CREATE, ALTER, DROP을 익힌다.
2. DDL 명령어의 이해 및 실습
2.1. DDL vs DML
SQL 명령어는 목적에 따라 분류된다.
| 분류 | 이름 | 명령어 | 역할 |
|---|---|---|---|
| DDL | Data Definition Language | CREATE, ALTER, DROP, RENAME | 구조 정의 |
| DML(디엠엘) | Data Manipulation Language | INSERT, UPDATE, DELETE, SELECT | 데이터 조작 |
| DCL(디씨엘) | Data Control Language | GRANT, 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: 테이블 구조는 유지하고 데이터만 삭제한다.