AI 시대 DB 모델링 & SQL 완벽 마스터5-3 좋은 vs 나쁜 프롬프트
테크타니 LEARN — 섹션 05 · AI 협업 SQL 작성법

같은 요구사항, 천차만별 결과 —
나쁜 프롬프트 5가지 안티패턴

AI가 이상한 SQL을 줬다면, 대부분 모델 탓이 아니라 던진 문장 탓입니다. 나쁜 프롬프트의 5가지 안티패턴과 좋은 프롬프트 5원칙을 나란히 놓고 비교합니다 — 보다 보면 "아, 내가 이렇게 던졌었지" 싶은 장면이 하나쯤 나올 거예요.

난이도쉬움소요6분준비물5-1 · 5-2 (컨텍스트 3가지 + 전달 포맷)핵심안티패턴 5 vs 원칙 5

이번 섹션의 여정

5-1 ~ 5-2 컨텍스트·포맷

완료 ✓

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

지금 여기

5-4 단계 분해 + CTE

복잡한 요구 쪼개기

5-5 라이브 시연 ⭐

전 과정 실연

섹션 6

AI 결과 의심하기

5-1에서 AI에게 꼭 줘야 할 3가지(스키마·샘플 데이터·결과 형태)를, 5-2에서 그걸 전달하는 포맷을 배웠죠. 이번 강의는 반대편에서 봅니다 — 사람들이 실제로 자주 던지는 나쁜 프롬프트 5가지를 해부하고, 각각을 좋은 프롬프트로 고쳐봅니다. 다섯 장면 모두 우리 shop DB 기준입니다.

안티패턴 ① — 컨텍스트 없는 한 줄

가장 흔한 유형입니다. 머릿속 요구사항을 한 줄로 압축해서 던지는 것.

✕ 나쁜 프롬프트

”카테고리별 매출 뽑아줘”

어떤 DB인지, 매출이 price × quantity인지 단순 price 합인지, 카테고리가 어느 테이블에 있는지 — 아무것도 없습니다. AI는 세상의 ‘보통 쇼핑몰’ 스키마(sales, ecommerce…)를 가정하고 추측 SQL을 짜기 시작합니다. 결과 신뢰도 0.

✓ 좋은 프롬프트

테이블 구조 + 요구사항을 한 묶음으로

아래 블록처럼 던지면 AI가 추측할 게 없습니다. 관련 테이블, 관계, 매출의 정의, 출력 형태까지 — 전부 명시돼 있으니까요.

[테이블 구조]
- categories: category_id PK, category_name
- products: product_id PK, price, category_id FK → categories
- order_items: order_id FK, product_id FK, quantity

[요구사항]
카테고리별 총 매출 (price × quantity 의 합).
출력: 카테고리명, 총매출. 매출 많은 순.

이 프롬프트가 받아낸 SQL을 DBeaver에서 돌려보면 —

DBeaver — 좋은 프롬프트가 받아낸 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;
category_nametotal_sales
의류1,107,000
전자기기857,000
뷰티510,000
도서479,000
식품60,000
5 rows fetched — 카테고리 5개, 요구사항 그대로
원칙 ① 컨텍스트

테이블 + 관계 + 요구사항을 항상 같이. 5-1의 ‘꼭 줘야 하는 3가지’와 5-2의 텍스트 표 포맷이 바로 이걸 위한 준비물이었습니다.

안티패턴 ② — 모호한 단어

이번엔 컨텍스트를 줬다 해도 빠지기 쉬운 함정 — 사람끼리만 통하는 단어입니다.

✕ 나쁜 프롬프트

”인기 상품 보여줘”

‘인기’가 뭘까요? 매출이 많은 것? 주문 횟수가 많은 것? 좋아요? 별점? — 모든 해석이 가능합니다. AI는 그중 하나를 임의로 골라잡고, 여러분이 원한 기준과 다를 확률이 높습니다.

✓ 좋은 프롬프트

측정 기준을 박아서

“가장 많이 팔린 상품 TOP 5 — 판매 수량(SUM(quantity)) 기준으로.” 해석의 여지가 사라집니다. 숫자나 컬럼으로 잴 수 있는 표현으로 바꾸는 게 전부예요.

자주 쓰는 모호한 단어들, 이렇게 바꾸면 됩니다.

모호한 단어 → 측정 기준 변환 사전
모호한 단어구체적 기준
"인기"매출 상위 / 주문 횟수 상위 / 별점 높은
"최근"지난 30일 / 2025년 이후 / 최근 1주
"활성 회원"지난 30일 안에 주문한 / 로그인한
"VIP"누적 매출 100만원 이상 / 주문 10건 이상
"잘 팔리는"판매 수량 상위 / 매출 상위
공통점 — 전부 컬럼과 숫자로 잴 수 있는 표현입니다
원칙 ② 구체성

모호한 단어(“인기”, “최고”, “잘 팔리는”)는 — 구체적 측정 기준으로 바꿔서. 기준을 정하는 건 AI가 아니라 여러분의 몫입니다.

안티패턴 ③ — 결과 형태를 말하지 않음

쿼리 내용은 맞게 시켰는데, 받고 싶은 표의 모양을 말하지 않는 경우입니다.

✕ 나쁜 프롬프트

”회원별 매출 합계”

AI가 (member_id, member_name, sum_sales) 3컬럼으로 짤지, member_id만 줄지, 정렬은 어떻게 할지, 몇 행을 보여줄지 — 전부 추측합니다. 결과가 원하는 모양과 다르면 다시 시켜야 하죠.

✓ 좋은 프롬프트

출력 컬럼 · 정렬 · 행 수까지

받고 싶은 표의 모양을 그대로 말해줍니다. 컬럼 + 정렬 + 행 수 — 세 줄이면 충분해요.

회원별 매출 합계.
- 출력 컬럼: 회원이름, 총매출
- 정렬: 매출 많은 순
- 행 수: 최대 10개
원칙 ③ 결과 형태

무엇을 어떤 모양으로 받고 싶은지 명시 — 출력 컬럼 + 정렬 + 행 수(+ 필터). 5-1에서 배운 세 번째 준비물 그대로입니다.

안티패턴 ④ — 한 번에 너무 많이

요구사항이 명확해도, 한 번에 전부 시키면 또 다른 문제가 생깁니다.

✕ 나쁜 프롬프트

종합 보고서 한 방에

“카테고리별 매출이랑, 회원별 매출이랑, 월별 매출이랑, 인기 상품 TOP 10도 같이 뽑아줘” — AI도 헷갈리고, 답도 길어지고, 어디가 틀렸는지 검증이 불가능해집니다.

✓ 좋은 프롬프트

한 번에 한 가지 — 받고 검증, 다음

첫 요청 “카테고리별 매출 SQL만” → 실행·검증 → 두 번째 “이제 회원별 매출” → 검증 → 세 번째 “월별 매출”… 짧은 사이클의 반복이 결국 제일 빠릅니다.

원칙 ④ 한 번에 한 가지

받고 검증, 그 다음. 쪼개기조차 어려운 진짜 복잡한 요구사항은 — 다음 강의 5-4(CTE 사고법) 에서 단계별로 분해하는 법을 다룹니다.

안티패턴 ⑤ — 받은 SQL을 검증하지 않음 ⭐

다섯 가지 중 가장 위험한 안티패턴이자, 이 강의 전체를 관통하는 핵심입니다.

✕ 가장 위험한 습관

”오, 됐다 — 그대로 실행”

AI가 SQL을 주면 의미가 맞는지 확인 없이 바로 사용. 3-7에서 본 JOIN 뻥튀기 같은 사고가 그대로 발생합니다. 겉보기엔 멀쩡한 숫자라서 더 위험해요.

✓ 검증 루틴

받음 → 실행 → 의심 → 검산 → 사용

실습 DB에서 돌려보고, 행 수와 값을 의심하고, 수상하면 AI에게 “이 결과 검산해줘 — JOIN 뻥튀기는 없나?”라고 되물은 뒤에야 사용합니다.

검증 루틴을 3단계로 정리하면 이렇습니다.

DBeaver에서 실행01 / 03

AI가 준 SQL을 그대로 믿지 말고 일단 실습 DB에서 돌려봅니다. 에러 없이 도는지가 1차 관문.

AI의 SQL 복붙 → Ctrl + Enter
행 수 · 값 의심02 / 03

회원별 매출인데 행이 64개? — 주문상세 수만큼 뻥튀기된 신호입니다. 제일 큰 값 하나는 손으로 검산해보세요.

기대한 행 수인가? 값이 말이 되는가?
AI에게 검산 요청03 / 03

의심되는 지점을 그대로 되물어봅니다 — “이 결과 검산해줘 — JOIN 뻥튀기는 없나?” 검증을 통과한 SQL만 채택.

통과하면 그때 사용

안티패턴 ③의 좋은 프롬프트로 받은 SQL을 실제로 검증해보면 —

SELECT
  m.member_name,
  SUM(p.price * oi.quantity) AS total_sales
FROM
  orders o
JOIN members m
  ON m.member_id = o.member_id
JOIN order_items oi
  ON oi.order_id = o.order_id
JOIN products p
  ON p.product_id = oi.product_id
GROUP BY
  m.member_name
ORDER BY
  total_sales DESC
LIMIT 10;
DBeaver — AI가 짜준 SQL 검증
member_nametotal_sales
조성민600,000
김철수498,000
박민수356,000
10 rows — 요구한 "최대 10개"와 일치, 1등 값도 손검산 OK
검증 통과 — 이제 써도 됩니다
원칙 ⑤ 검증 — 이 강의 전체의 핵심

AI 결과는 — 항상 검증 후 사용. 무엇을 어떻게 의심하고 검산하는지는 다음 섹션 6(AI 결과 의심하기) 에서 본격적으로 다룹니다.

좋은 프롬프트 5원칙 — 한 장 정리

다섯 장면을 한 표로 모으면 이렇게 됩니다. 캡처해서 저장해두세요.

좋은 프롬프트 5원칙
#원칙한 줄
1컨텍스트테이블 + 관계 + 요구사항 항상 같이
2구체성모호한 단어 → 측정 기준으로
3결과 형태출력 컬럼 + 정렬 + 행 수
4한 번에 한 가지받고 검증, 그 다음
5검증 ⭐받은 SQL 결과를 항상 검산
이 5가지만 지키면 — AI가 만든 SQL의 80%는 첫 시도에 정확

이제 자가 진단입니다. 본인의 평소 SQL 요청 프롬프트를 떠올려보세요 — 몇 개나 지키고 있나요?

자가 진단 — 평소 내 프롬프트는?
테이블 구조를 매번 같이 주나요? (원칙 ①)
"인기" 같은 모호한 단어를 쓰지 않나요? (원칙 ②)
출력 컬럼·정렬을 명시하나요? (원칙 ③)
한 번에 너무 많이 시키지 않나요? (원칙 ④)
받은 SQL을 실행해 검증하나요? (원칙 ⑤)

3개 이상이면 평균 이상 프롬프터, 5개 모두면 AI 시대 SQL 실력자입니다. 부족했던 항목이 보였다면 — 그게 오늘 강의의 수확이에요.

자주 막히는 지점

① 테이블 구조를 매번 붙여넣기 귀찮아요

한 번 잘 만들어둔 컨텍스트 블록은 계속 재사용하는 자산입니다.

FIX ▸5-2에서 만든 shop 포맷 2 블록을 노트앱에 저장 → 매번 복붙. 2-4의 AI 과외 세션이라면 이미 init.sql을 알고 있어 생략해도 됩니다.
② 좋은 프롬프트를 줘도 가끔 틀린 SQL이 나와요

5원칙은 정확도를 크게 올려줄 뿐, 100%를 보장하지는 않습니다.

FIX ▸정상입니다 — 그래서 원칙 ⑤가 있습니다. 실행 → 행 수·값 의심 → 검산 요청. 체계적인 검증법은 섹션 6에서.
③ 모호한 단어를 뭘로 바꿔야 할지 모르겠어요

기준이 안 떠오를 때는 기준 자체를 AI와 의논하면 됩니다.

FIX ▸AI에게 기준 후보를 먼저 물어보세요 — "'인기 상품'을 우리 스키마에서 잴 수 있는 기준 3가지 제안해줘". 고르는 건 사람 몫.

오늘 비교한 다섯 장면 중 분명 찔리는 게 하나는 있었을 거예요. 다음 강의는 안티패턴 ④의 해결책 — 복잡한 요구사항을 단계별로 쪼개는 CTE 사고법입니다. 그 전에 연습 문제로 5원칙을 손에 익혀두세요.

NEXT LESSON5-3 연습 문제

나쁜 프롬프트를 5원칙으로 고쳐 쓰는 연습 — 자가 진단을 실전으로 옮겨봅니다.

GO ▸ 연습 문제 풀기