AI 시대 DB 모델링 & SQL 완벽 마스터5-1 AI 에게 줘야 할 3가지
테크타니 LEARN — 섹션 05 · AI 협업 SQL 작성법

같은 질문, 완전히 다른 SQL —
AI에게 꼭 줘야 할 3가지

섹션 5 시작입니다. 지금까지는 "AI가 SQL을 짜주는 시대"라고 말만 했지, 어떻게 시켜야 정확한 SQL이 나오는지는 본격적으로 안 다뤘죠. 출발점은 단 3가지 — 스키마, 샘플 데이터, 원하는 결과 형태. 이 강의가 끝나면 3가지를 외운 채로 여러분 작업에 바로 적용할 수 있습니다.

난이도쉬움소요6분준비물섹션 4 완료 (부모-자식·ERD)도구ChatGPT/Claude 아무거나 + DBeaver

이번 섹션의 여정

2-4에서 AI 과외 선생님을 만들 때 “어떤 정보를 줘야 AI가 제일 잘하는지는 5-1에서 제대로 배운다” 고 예고했었죠 — 그 약속을 지키는 강의입니다. 이제부터 다섯 강 동안, AI에게 제대로 시키는 법을 다룹니다. 같은 질문도 어떻게 던지냐에 따라 결과가 완전히 달라지거든요.

5-1 AI에게 줘야 할 3가지

지금 여기

5-2 ERD 전달 포맷

스키마를 주는 형식

5-3 좋은 vs 나쁜 프롬프트

실전 비교

5-4 단계 분해 + CTE

복잡한 요청 쪼개기

5-5 라이브 시연 ⭐

요구사항 → SQL → 검증

섹션 6

AI 결과 의심하기

결론부터 — 꼭 줘야 하는 3가지

AI에게 SQL을 시킬 때 꼭 줘야 하는 3가지. 외우세요.

AI에게 SQL을 시킬 때 — 필수 입력 3가지
① 스키마 — 어떤 테이블, 어떤 컬럼 (PK/FK 포함)
② 샘플 데이터 — 데이터가 어떻게 생겼는지 (3~5행)
③ 원하는 결과 형태 — 출력 컬럼 · 정렬 · 행 수 · 필터
⭐ 이 강의에서 가장 중요한 문장

이 3가지가 다 들어가면 — AI가 거의 안 틀립니다. 하나라도 빠지면 — 결과를 의심해야 합니다.

왜 이 3가지인지, 지금부터 하나씩 뜯어볼게요.

① 스키마 — 테이블·컬럼·PK/FK

스키마는 “어떤 테이블이 있고, 그 테이블에 어떤 컬럼들이 있는지” 입니다. 2-4에서 본 것처럼 — AI는 세상의 ‘보통 쇼핑몰’을 학습했을 뿐, 여러분의 DB는 모릅니다. 그래서 지도를 먼저 쥐여줘야 해요. 가장 정확한 방법은 CREATE TABLE 문을 약식으로 정리해서 던지기입니다.

[테이블 구조]
- members (회원): member_id PK, member_name, gender, age, joined_at
- orders (주문): order_id PK, member_id FK → members, ordered_at
- order_items (주문상세): order_id FK, product_id FK, quantity
- products (상품): product_id PK, product_name, price, category_id FK
- categories (카테고리): category_id PK, category_name
핵심은 PK / FK 표시 + 부모-자식 관계 명시

컬럼 이름만 나열하면 반쪽짜리예요. 어떤 컬럼이 PK이고, 어떤 FK가 어느 테이블을 가리키는지까지 적어야 AI가 JOIN을 정확하게 짭니다. 4-2 부모-자식에서 배운 그 관계 정보가 — 여기서 AI에게 그대로 전달되는 겁니다.

② 샘플 데이터 — 값의 생김새 보여주기

스키마만 줘도 SQL은 짜집니다. 근데 — 데이터가 어떻게 생겼는지 모르면 종종 엉뚱한 답이 나와요.

✕ 스키마만 줬을 때

AI는 값의 생김새를 추측합니다

gender 컬럼이 ‘M’/‘F’인지 ‘남’/‘여’인지 — AI가 어떻게 알아요? 모르면 추측합니다. WHERE gender = ‘남’ 같은, 문법은 맞는데 결과는 0건인 쿼리 — 그게 사고입니다.

✓ 샘플 3~5행을 같이 줬을 때

형식·범위·단위까지 읽어냅니다

아래처럼 몇 행만 보여줘도 AI는 “아, gender는 M/F구나. price는 정수(원)구나” 알아챕니다. 값의 형식·범위·NULL 여부 — 전부 추측이 아니라 근거가 됩니다.

샘플은 각 테이블당 3~5행이면 충분합니다. 테이블 전체를 부을 필요가 없어요.

[샘플 데이터]
members:
  1, 김철수, M, 35, 2025-01-15
  2, 이영희, F, 28, 2025-02-03

products:
  1, 라운드 티셔츠, 19000, 1
  9, 무선 이어폰, 89000, 2
샘플은 어디서 가져오나

DBeaver에서 SELECT * FROM members LIMIT 5; 한 번이면 끝입니다. 결과 표에서 몇 행 복사해 붙이면 — 그게 그대로 샘플 데이터예요.

③ 원하는 결과 형태 — 구체성이 곧 정확성

마지막은 “어떤 모양의 결과를 받고 싶은가”구체적으로 말하는 것. 여기서 차이가 제일 크게 납니다.

✕ 나쁜 요구

”매출 보여줘”

전체 합계? 카테고리별? 월별? 컬럼은 몇 개? — AI가 알아서 정해버립니다. 그 ‘알아서’가 여러분이 원한 것과 같을 확률은 복불복이에요.

✓ 좋은 요구

“카테고리별 총 매출. 출력 컬럼: 카테고리명, 총매출. 매출 많은 순. TOP 5.”

집계 단위, 출력 컬럼, 정렬, 행 수까지 — 해석의 여지가 없습니다. AI의 SQL이 짧고 정확해집니다.

구체적으로 명시할 항목은 이 다섯 가지입니다.

항목예시
출력 컬럼”카테고리명, 총매출”
정렬”매출 많은 순”
행 수 제한”TOP 5”
필터 조건”2025년 이후 주문만”
집계 단위”카테고리별”
📌 한 줄 공식

구체성 = 정확성. 결과 형태가 명확할수록 AI의 SQL은 짧아지고, 정확해집니다.

3가지 종합 — 모범 프롬프트와 검증

이제 3가지를 한 프롬프트에 다 넣어볼게요. 우리 shop DB 기준의 완성형입니다.

[테이블 구조]
- members (회원): member_id PK, member_name, gender (M/F), age, joined_at
- orders (주문): order_id PK, member_id FK, ordered_at
- order_items (주문상세): order_id FK, product_id FK, quantity
- products (상품): product_id PK, product_name, price, category_id FK
- categories (카테고리): category_id PK, category_name

[부모-자식 관계]
- members 1:N orders
- orders 1:N order_items
- products 1:N order_items
- categories 1:N products

[샘플 데이터]
members: (1, 김철수, M, 35, '2025-01-15'), (2, 이영희, F, 28, '2025-02-03')
orders: (1, 1, '2025-02-01'), (2, 2, '2025-02-15')
order_items: (1, 1, 1), (1, 16, 2)
products: (1, '라운드 티셔츠', 19000, 1), (16, '프리미엄 그래놀라', 12000, 3)

[요구사항]
카테고리별 총 매출 TOP 3.
- 매출 = price × quantity 의 합
- 출력 컬럼: 카테고리명, 총매출
- 매출 많은 순으로 정렬
- 행 수 최대 3개
이 블록, 그대로 저장해두세요

[테이블 구조] · [샘플 데이터] · [요구사항] 세 칸만 갈아끼우면 어떤 DB에서든 재사용할 수 있는 템플릿입니다. 메모장에 복사해두고 AI에게 SQL을 시킬 때마다 꺼내 쓰세요.

이 프롬프트를 ChatGPT나 Claude에 던지면 — 거의 정확하게 이런 SQL이 돌아옵니다.

SELECT
  c.category_name,
  SUM(p.price * oi.quantity) AS total_sales
FROM
  order_items oi
JOIN products p
  ON p.product_id = oi.product_id
JOIN categories c
  ON c.category_id = p.category_id
GROUP BY
  c.category_name
ORDER BY
  total_sales DESC
LIMIT 3;

받은 SQL을 그대로 DBeaver에 붙여 실행하면 — 검증도 1초입니다.

DBeaver — SQL Editor (Ctrl + Enter)
SELECT c.category_name, SUM(p.price * oi.quantity) AS total_sales FROM order_items oi JOIN products p ON p.product_id = oi.product_id JOIN categories c ON c.category_id = p.category_id GROUP BY c.category_name ORDER BY total_sales DESC LIMIT 3;
category_nametotal_sales
의류1107000
전자기기857000
뷰티510000
샘플은 몇 행만 줬는데 — 전체 DB 기준으로 정확한 답이 나옵니다
3 rows fetched · 요구사항 그대로: 카테고리명 · 총매출 · 많은 순 · 3개

한눈에 정리

#무엇을핵심어디서 가져오나
1스키마테이블 + 컬럼 + PK/FK4-2 부모-자식 · ERD
2샘플 데이터각 테이블당 3~5행SELECT * FROM 테이블 LIMIT 5
3원하는 결과 형태출력 · 정렬 · 행 수 · 필터비즈니스 요구사항을 문장으로 정리
✓ 오늘의 한 문장

스키마 · 샘플 데이터 · 원하는 결과 형태. 3가지가 다 들어가면 AI가 거의 안 틀리고 — 하나라도 빠지면 결과를 의심합니다.

자주 막히는 지점

① 스키마를 매번 손으로 정리해야 하나요?

테이블이 5개를 넘어가면 일일이 치기 부담스럽죠. 다만 약식 포맷은 가볍고 핵심만 담겨서, AI가 길을 잃지 않는 장점이 있습니다.

FIX ▸우리 실습 DB는 init.sql 통째 첨부(2-4 방식)로 충분 — 실무 DB에서 약식 포맷을 뽑는 요령은 5-2에서 다룹니다.
② 회사 데이터라 샘플을 그대로 못 보여줘요

AI에게 필요한 건 진짜 값이 아니라 값의 생김새입니다. 형식·범위·단위만 유지되면 효과는 동일해요.

FIX ▸형식만 같은 가짜 값 3행이면 충분합니다 — 김철수 대신 홍길동, 진짜 전화번호 대신 010-0000-0000.
③ 3가지를 다 줬는데도 가끔 틀려요

3가지는 “거의 안 틀리게” 만드는 장치지, 100% 보장이 아닙니다. JOIN 뻥튀기 같은 함정은 여전히 숨어들 수 있어요.

FIX ▸그래서 검증이 필수 — 받은 SQL을 DBeaver에서 돌려 행 수·수치를 눈으로 확인하세요. 의심하는 기술은 섹션 6의 주제입니다.

다음 강의에서는 3가지 중 첫 번째, 스키마를 주는 형식을 깊게 팝니다. ERD·테이블 정의를 어떤 포맷으로 던져야 AI가 가장 정확한지 — 실전 포맷을 정리해드릴게요. 그 전에, 오늘 배운 3가지를 연습 문제로 손에 익히고 가세요.

NEXT LESSON5-1 연습 문제

스키마 · 샘플 데이터 · 결과 형태 — 3가지를 직접 채워 프롬프트를 완성해봅니다.

GO ▸ 연습 문제 풀기