06 DDL 명령어의 이해 및 실습
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차시에서 학습한 내용이다. 간단히 복습한다.
1import sqlite32
3conn = sqlite3.connect("music.db")4cur = conn.cursor()5
6cur.execute("""7 CREATE TABLE IF NOT EXISTS artists (8 id INTEGER PRIMARY KEY AUTOINCREMENT,9 name TEXT NOT NULL,10 debut INTEGER,11 genre TEXT12 )13""")14conn.commit()15print("artists 테이블 생성")코드 설명:
- 7행:
IF NOT EXISTS— 테이블이 없을 때만 생성하며, 있으면 오류 없이 넘어간다. - 8행: id는 자동으로 1씩 증가하는 기본키이다.
- 9행: name은 필수 입력 컬럼이다 (
NOT NULL).
3. ALTER TABLE(알터) — 테이블 구조 수정
테이블을 삭제하지 않고 구조를 바꿀 때 사용한다.
3.1. 컬럼 추가
1# 컬럼 추가2cur.execute("ALTER TABLE artists ADD COLUMN country TEXT DEFAULT '한국'")3conn.commit()4print("country 컬럼 추가 완료")코드 설명:
- 2행:
ADD COLUMN으로 새 컬럼을 추가한다. DEFAULT '한국'— 기존 행들의 country 값은 자동으로 ‘한국’으로 채워진다.
3.2. 테이블 이름 변경
1# 테이블 이름 변경2cur.execute("ALTER TABLE artists RENAME TO kpop_artists")3conn.commit()4print("테이블 이름 변경 완료")코드 설명:
- 2행:
RENAME TO로 테이블 이름을 바꾼다. 데이터는 그대로 유지된다.
참고
SQLite는 컬럼 삭제(DROP COLUMN)를 SQLite 3.35.0 이상 버전부터 지원한다.
지원하지 않는 환경에서는 새 테이블을 만들고 데이터를 복사하는 방법을 사용한다.
4. DB 테이블 목록 및 구조 확인 실습
4.1. 테이블 목록 확인
1cur.execute("SELECT name FROM sqlite_master WHERE type='table'")2tables = cur.fetchall()3
4print("=== 테이블 목록 ===")5for t in tables:6 print(f" {t[0]}")4.2. 테이블 컬럼 구조 확인
1# PRAGMA(프래그마)로 테이블 상세 구조 확인2cur.execute("PRAGMA table_info(kpop_artists)")3cols = cur.fetchall()4
5print("=== kpop_artists 테이블 구조 ===")6print(f"{'cid':<4} {'name':<12} {'type':<10} {'not null':<8} {'default'}")7for c in cols:8 print(f"{c[0]:<4} {c[1]:<12} {c[2]:<10} {c[3]:<8} {c[4]}")실행 결과:
1=== kpop_artists 테이블 구조 ===2cid name type not null default30 id INTEGER 0 None41 name TEXT 1 None52 debut INTEGER 0 None63 genre TEXT 0 None74 country TEXT 0 '한국'코드 설명:
- 2행:
PRAGMA table_info(테이블명)는 테이블의 컬럼 정보를 반환하는 SQLite 전용 명령이다. - 결과의 각 컬럼:
cid(순서),name(컬럼명),type(타입),notnull(필수여부),dflt_value(기본값)
5. DROP — 테이블 삭제
5.1. DROP TABLE(드롭 테이블)
1# 임시 테이블 생성2cur.execute("CREATE TABLE IF NOT EXISTS temp_test (id INTEGER, val TEXT)")3
4# 테이블 삭제5cur.execute("DROP TABLE IF EXISTS temp_test")6conn.commit()7print("temp_test 테이블 삭제 완료")코드 설명:
- 5행:
IF EXISTS— 테이블이 없어도 오류 없이 넘어간다. - DROP TABLE은 테이블의 구조와 데이터를 모두 삭제한다. 되돌릴 수 없다.
주의
DROP TABLE은 테이블과 모든 데이터를 영구적으로 삭제한다. 반드시 백업 후 사용하거나, IF EXISTS를 붙여 오류를 방지한다.
6. 전체 흐름 실습 — 음악 앱 DB 구축
리액트 음악 앱을 위한 DB를 처음부터 설계하고 구성한다.
1import sqlite32
3conn = sqlite3.connect("music_app.db")4cur = conn.cursor()5
6# 1. 아티스트 테이블 생성7cur.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 TEXT13 )14""")15
16# 2. 앨범 테이블 생성17cur.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. 트랙 테이블 생성28cur.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
39conn.commit()40print("음악 앱 DB 구축 완료!")코드 설명:
- 8~14행: artists 테이블 — 아티스트 정보를 저장한다.
- 17~24행: albums 테이블 — 앨범 정보를 저장하며 artist_id로 아티스트와 연결된다.
- 27~35행: tracks 테이블 — 트랙 정보를 저장하며 album_id로 앨범과 연결된다.
- 이 3개 테이블이 리액트 음악 앱의 핵심 DB 구조이다.
7. 활용 Plus — 리액트 연동 관점
리액트 음악 앱에서 “아티스트별 앨범 목록” 페이지를 만들 때, 파이썬 API는 아래 쿼리를 실행한다.
1SELECT artists.name, albums.title, albums.release_yr2FROM albums3JOIN artists ON albums.artist_id = artists.id4WHERE 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: 테이블 구조는 유지하고 데이터만 삭제한다.