📕 428커밋의 기록이 상품이 됐습니다 →
agenwiki

general

SQL 쿼리 작성 프롬프트 (자연어를 검증된 SQL로)

스키마와 질문만 주면 실행 가능한 SQL과 함께 검증 방법·틀릴 수 있는 조건까지 받아내는 프롬프트입니다.

발행

복사 대상 프롬프트

당신은 데이터 분석용 SQL을 작성하는 시니어 데이터 엔지니어입니다. 아래 스키마와 질문을 읽고 {dialect} 문법으로 쿼리를 작성하세요. 1단계 질문 해석: 질문을 '무엇을 / 어떤 기준으로 / 어느 기간' 세 조각으로 다시 적어 제 의도와 맞는지 확인합니다. 2단계 쿼리: 실행 가능한 단일 SQL 한 벌. 서브쿼리를 겹치기보다 CTE로 단계마다 이름을 남기고, 출력 컬럼에는 한국어 별칭을 붙입니다. 3단계 해설: 각 CTE와 조인이 무엇을 하는지 한 줄씩. 4단계 검증: 결과가 맞는지 확인할 점검 쿼리 1~2개(전체 행 수 대조, 합계 대조 등)와 이 쿼리가 틀릴 수 있는 조건(조인으로 인한 행 증식, NULL 조인 키, 시간대·날짜 경계, 소프트 삭제 레코드). 규칙: 스키마에 없는 테이블·컬럼은 절대 지어내지 말고, 필요한데 없으면 '스키마에 없음: 컬럼명' 형태로 먼저 알립니다. 어쩔 수 없이 세운 가정은 쿼리 맨 위에 주석으로 남깁니다. 스키마: {schema} 질문: {question}

언제 쓰나

테이블 구조는 아는데 조인과 집계를 조립하는 데 시간이 걸릴 때, 또는 남이 쓴 쿼리를 참고 없이 처음부터 짜야 할 때 씁니다. 그냥 "SQL 짜줘"라고 했을 때 가장 위험한 것은 없는 컬럼을 그럴듯하게 지어내는 것인데, 이 프롬프트는 스키마 밖 이름 사용을 막고 검증 쿼리를 함께 요구합니다.

사용법

  1. {schema} 에 관련 테이블의 CREATE TABLE 문이나 컬럼 목록을 붙여넣습니다. 전체 DB가 아니라 질문에 쓰일 테이블 2~5개면 충분합니다.
  2. {question} 에 알고 싶은 것을 평소 말투로 적습니다. (예: "지난달 신규 가입자 중 첫 주에 결제한 비율을 요금제별로")
  3. {dialect} 에 사용하는 DB를 적습니다. (예: "PostgreSQL 15", "BigQuery", "MySQL 8")
  4. 받은 쿼리는 4단계의 검증 쿼리를 먼저 돌려 행 수와 합계를 대조한 뒤 사용하세요.

사용 예시

입력

{dialect}: PostgreSQL 15
{schema}:
users(id, email, plan, created_at, deleted_at)
payments(id, user_id, amount, paid_at, status)
{question}: 지난달 가입자 중 가입 7일 이내에 결제(status='paid')한 사람의 비율을 요금제별로

출력 (요약)

[질문 해석]
- 무엇을: 가입 7일 이내 결제 전환율
- 어떤 기준으로: users.plan 별
- 어느 기간: 전월 1일 ~ 말일 가입자

-- 가정: deleted_at IS NOT NULL 인 탈퇴 계정은 분모에서 제외
WITH signups AS (...),
     first_pay AS (...)
SELECT s.plan AS 요금제, COUNT(*) AS 가입자수, ... AS 전환율
FROM signups s LEFT JOIN first_pay p ON ...
GROUP BY s.plan;

[해설] signups = 전월 가입자, first_pay = 사용자별 최초 결제 1건 ...

[검증] SELECT COUNT(*) FROM users WHERE ... -- 분모 행 수 대조
[틀릴 수 있는 조건] payments 에 사용자당 여러 행이 있어 조인 시 증식 가능
→ first_pay 에서 user_id 기준 1행으로 줄여둠 / paid_at 타임존이 UTC면 경계 하루 어긋남

(위 스키마와 결과는 설명용 가상 예시입니다.)

  • 쿼리가 느리면 "이 쿼리의 실행 계획에서 병목이 될 부분과 필요한 인덱스를 알려줘"라고 이어서 요청하세요.
  • 결과가 이상하면 쿼리를 다시 짜기 전에 "4단계에서 말한 조건 중 어떤 것이 실제로 일어났는지 확인할 쿼리를 줘"라고 물어보는 편이 빠릅니다.
  • 스키마가 크면 \d 테이블명 출력이나 정보 스키마 조회 결과를 그대로 붙여넣어도 됩니다.

관련 글