언제 쓰나
테이블 구조는 아는데 조인과 집계를 조립하는 데 시간이 걸릴 때, 또는 남이 쓴 쿼리를 참고 없이 처음부터 짜야 할 때 씁니다. 그냥 "SQL 짜줘"라고 했을 때 가장 위험한 것은 없는 컬럼을 그럴듯하게 지어내는 것인데, 이 프롬프트는 스키마 밖 이름 사용을 막고 검증 쿼리를 함께 요구합니다.
사용법
{schema}에 관련 테이블의CREATE TABLE문이나 컬럼 목록을 붙여넣습니다. 전체 DB가 아니라 질문에 쓰일 테이블 2~5개면 충분합니다.{question}에 알고 싶은 것을 평소 말투로 적습니다. (예: "지난달 신규 가입자 중 첫 주에 결제한 비율을 요금제별로"){dialect}에 사용하는 DB를 적습니다. (예: "PostgreSQL 15", "BigQuery", "MySQL 8")- 받은 쿼리는 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 테이블명출력이나 정보 스키마 조회 결과를 그대로 붙여넣어도 됩니다.