리퀘오 / 스킬 / 개발

실행해 보고 고른 SQL

테이블 구조와 질문을 넣으면 시험 데이터에서 실제로 실행해 확인한 조회 SQL 과 실행 결과를 돌려줍니다.

제작 리퀘오 버전 4 사용 1,000회 미만

이 스킬이 하는 일

  1. 넣는 것

    테이블 구조 + 알고 싶은 질문
    지난 30일 동안 결제 완료(status='paid') 주문 금액 합계가 가장 큰 고객 5명의 이름과 합계…
  2. 스킬이 하는 일

    • 질문을 SQL 로 바꿈
    • 시험 데이터로 실제 실행해 결과를 확인
    • 조심할 점과 인덱스를 제안
  3. 받는 것

    검증한 SQL + 실행 결과 표
    SELECT u.name AS name, SUM(o.amount) AS total_amount
    FROM users u
    JOIN orders o ON o.user_id = u.id
    WHERE o.status = 'paid' AND o.ordered_at >= DATE_SUB(CURDATE(), INTER…
    GROUP BY u.id, u.name
    … (2줄 더)

이럴 때 쓰세요

실제 결과물

2026년 10월 22일 실행

이 페이지의 예제 입력을 그대로 실행해 받은 결과입니다. 같은 입력이어도 실행할 때마다 표현은 조금씩 달라질 수 있습니다.

완성된 SQL

SELECT u.name AS name, SUM(o.amount) AS total_amount
FROM users u
JOIN orders o ON o.user_id = u.id
WHERE o.status = 'paid' AND o.ordered_at >= DATE_SUB(CURDATE(), INTERVAL 30 DAY)
GROUP BY u.id, u.name
ORDER BY total_amount DESC, u.name ASC
LIMIT 5

처리 순서

  • users와 orders를 user_id로 조인하여 고객별 주문을 연결합니다.
  • status가 'paid'이고 ordered_at이 최근 30일 이내인 주문만 필터링합니다.
  • 고객별로 amount를 합산하고 합계 내림차순, 이름 오름차순으로 정렬합니다.
  • 상위 5명만 LIMIT으로 반환합니다.

시험 데이터로 실행한 결과

nametotal_amount
오세훈1050000
김민수800000
정도윤800000
이서연700000
최유진650000
결과 더 보기 조심할 점 · 인덱스 제안

조심할 점

  • ordered_at이 DATETIME 텍스트이므로 date('now','-30 days')와의 문자열 비교 범위가 경계 시각을 포함하는지 확인해야 합니다.
  • SQLite 의 'now' 는 UTC 기준이고 MySQL 의 현재 날짜·시각은 세션 시간대 기준입니다.
  • 후보 SQL 사이에 결과가 2가지로 갈렸습니다. 질문 뜻에 가장 맞는 결과를 골랐으니 아래 실행 결과가 기대와 같은지 확인하세요.

인덱스 제안

CREATE INDEX idx_orders_status_ordered_at_user_id ON orders (status, ordered_at, user_id);
결과 JSON 원본 보기 API·MCP 가 돌려주는 모양 그대로
{
  "sql": "SELECT u.name AS name, SUM(o.amount) AS total_amount FROM users u JOIN orders o ON o.user_id = u.id WHERE o.status = 'paid' AND o.ordered_at >= DATE_SUB(CURDATE(), INTERVAL 30 DAY) GROUP BY u.id, u.name ORDER BY total_amount DESC, u.name ASC LIMIT 5",
  "dialect": "mysql",
  "verified_sql": "SELECT u.name AS name, SUM(o.amount) AS total_amount FROM users u JOIN orders o ON o.user_id = u.id WHERE o.status = 'paid' AND o.ordered_at >= date('now', '-30 days') GROUP BY u.id, u.name ORDER BY total_amount DESC, u.name ASC LIMIT 5",
  "verified_scope": "SQLite 문법으로 시험 데이터에서 실행해 확인한 뒤 MySQL 8 문법으로 바꿨습니다. 바꾼 1곳(dialect_changes)은 실행 검증 범위 밖입니다.",
  "steps": [
    "users와 orders를 user_id로 조인하여 고객별 주문을 연결합니다.",
    "status가 'paid'이고 ordered_at이 최근 30일 이내인 주문만 필터링합니다.",
    "고객별로 amount를 합산하고 합계 내림차순, 이름 오름차순으로 정렬합니다.",
    "상위 5명만 LIMIT으로 반환합니다."
  ],
  "dialect_changes": [
    {
      "from": "date('now', '-30 days')",
      "to": "DATE_SUB(CURDATE(), INTERVAL 30 DAY)",
      "note": ""
    }
  ],
  "test_data": [
    {
      "table": "users",
      "columns": [
        "id",
        "name",
        "email",
        "grade",
        "created_at"
      ],
      "types": [
        "INTEGER",
        "TEXT",
        "TEXT",
        "TEXT",
        "TEXT"
      ],
      "row_count": 7,
      "markdown": "| id | name | email | grade | created_at |\n| --- | --- | --- | --- | --- |\n| 1 | 김민수 | minsu@example.com | VIP | 2025-01-10 09:00:00 |\n| 2 | 이서연 | seoyeon@example.com | GOLD | 2025-03-15 12:30:00 |\n| 3 | 박지훈 | NULL | SILVER | 2025-06-01 08:15:00 |\n| 4 | 최유진 | yujin@example.com | GOLD | 2025-08-20 18:45:00 |\n| 5 | 정도윤 | doyun@example.com | VIP | 2025-11-05 10:10:00 |\n| 6 | 한지민 | NULL | SILVER | 2026-02-14 14:00:00 |\n| 7 | 오세훈 | sehun@example.com | GOLD | 2026-09-01 09:30:00 |",
      "rows_json": "[[1,\"김민수\",\"minsu@example.com\",\"VIP\",\"2025-01-10 09:00:00\"],[2,\"이서연\",\"seoyeon@example.com\",\"GOLD\",\"2025-03-15 12:30:00\"],[3,\"박지훈\",null,\"SILVER\",\"2025-06-01 08:15:00\"],[4,\"최유진\",\"yujin@example.com\",\"GOLD\",\"2025-08-20 18:45:00\"],[5,\"정도윤\",\"doyun@example.com\",\"VIP\",\"2025-11-05 10:10:00\"],[6,\"한지민\",null,\"SILVER\",\"2026-02-14 14:00:00\"],[7,\"오세훈\",\"sehun@example.com\",\"GOLD\",\"2026-09-01 09:30:00\"]]"
    },
    {
      "table": "orders",
      "columns": [
        "id",
        "user_id",
        "amount",
        "status",
        "ordered_at"
      ],
      "types": [
        "INTEGER",
        "INTEGER",
        "REAL",
        "TEXT",
        "TEXT"
      ],
      "row_count": 12,
      "markdown": "| id | user_id | amount | status | ordered_at |\n| --- | --- | --- | --- | --- |\n| 1001 | 1 | 500000 | paid | 2026-09-22 10:00:00 |\n| 1002 | 1 | 300000 | paid | 2026-10-01 11:00:00 |\n| 1003 | 2 | 700000 | paid | 2026-09-23 09:00:00 |\n| 1004 | 2 | 200000 | cancelled | 2026-10-05 13:00:00 |\n| 1005 | 3 | 450000 | paid | 2026-10-10 15:20:00 |\n| 1006 | 4 | 650000 | paid | 2026-09-24 08:00:00 |\n| 1007 | 4 | 100000 | refunded | 2026-10-12 17:00:00 |\n| 1008 | 5 | 800000 | paid | 2026-10-15 19:30:00 |\n| 1009 | 6 | 400000 | paid | 2026-09-21 23:59:59 |\n| 1010 | 7 | 900000 | paid | 2026-09-22 00:00:00 |\n| 1011 | 7 | 150000 | paid | 2026-10-22 12:00:00 |\n| 1012 | 3 | 250000 | paid | 2026-09-20 10:00:00 |",
      "rows_json": "[[1001,1,500000,\"paid\",\"2026-09-22 10:00:00\"],[1002,1,300000,\"paid\",\"2026-10-01 11:00:00\"],[1003,2,700000,\"paid\",\"2026-09-23 09:00:00\"],[1004,2,200000,\"cancelled\",\"2026-10-05 13:00:00\"],[1005,3,450000,\"paid\",\"2026-10-10 15:20:00\"],[1006,4,650000,\"paid\",\"2026-09-24 08:00:00\"],[1007,4,100000,\"refunded\",\"2026-10-12 17:00:00\"],[1008,5,800000,\"paid\",\"2026-10-15 19:30:00\"],[1009,6,400000,\"paid\",\"2026-09-21 23:59:59\"],[1010,7,900000,\"paid\",\"2026-09-22 00:00:00\"],[1011,7,150000,\"paid\",\"2026-10-22 12:00:00\"],[1012,3,250000,\"paid\",\"2026-09-20 10:00:00\"]]"
    }
  ],
  "result_table": {
    "columns": [
      "name",
      "total_amount"
    ],
    "row_count": 5,
    "markdown": "| name | total_amount |\n| --- | --- |\n| 오세훈 | 1050000 |\n| 김민수 | 800000 |\n| 정도윤 | 800000 |\n| 이서연 | 700000 |\n| 최유진 | 650000 |",
    "rows_json": "[[\"오세훈\",1050000],[\"김민수\",800000],[\"정도윤\",800000],[\"이서연\",700000],[\"최유진\",650000]]",
    "truncated": false
  },
  "edge_coverage": {
    "nulls": true,
    "duplicates": true,
    "empty_groups": false,
    "notes": [
      "NULL 이 든 열: users.email 2행",
      "같은 값이 겹치는 열: users.grade, orders.status"
    ]
  },
  "cautions": [
    "ordered_at이 DATETIME 텍스트이므로 date('now','-30 days')와의 문자열 비교 범위가 경계 시각을 포함하는지 확인해야 합니다.",
    "SQLite 의 'now' 는 UTC 기준이고 MySQL 의 현재 날짜·시각은 세션 시간대 기준입니다.",
    "후보 SQL 사이에 결과가 2가지로 갈렸습니다. 질문 뜻에 가장 맞는 결과를 골랐으니 아래 실행 결과가 기대와 같은지 확인하세요."
  ],
  "index_suggestions": [
    {
      "table": "orders",
      "columns": [
        "status",
        "ordered_at",
        "user_id"
      ],
      "statement": "CREATE INDEX idx_orders_status_ordered_at_user_id ON orders (status, ordered_at, user_id);"
    }
  ],
  "candidates": {
    "generated": 4,
    "executed_ok": 4,
    "rejected": 0,
    "distinct_results": 2,
    "agreeing": 3
  }
}

실행하기

10~60P/ 실행

예상 2~9초 · 글 생성 보통 5회, 최대 6회

출고 전 평가 사례의 실측 범위; 입력 크기에 따라 달라지며 보장 시간 아님

기본 처리비 + 응답 사용량과 저장 단가로 계산한 도구 사용료. 최대액을 예약하고 차액을 반환합니다. 사용량 미확인·실패 시 청구하지 않습니다.

로그인하고 실행

기본요금(판매자 금액·기본 수수료) + 실제 AI 사용료로 정산합니다. AI 사용료는 모델별 단가와 실제 사용량으로 계산하며, 2026년 11월 6일부터 시간대별 요금이 있는 모델은 시간대와 관계없이 같은 단가를 적용합니다. 입력과 실제 사용량에 따라 달라지며 AI 사용료에 수수료를 다시 붙이지 않습니다. 결과가 정상적으로 나왔을 때만 차감됩니다. 실패·시간초과·취소는 차감되지 않습니다. TTS에 연결한 정규화의 취소·환불은 TTS 정산 규칙을 적용합니다.

이 Skill 의 결과는 생성형 AI 가 만듭니다.

예제 입력

테이블 구조
CREATE TABLE `users` (
  `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
  `name` VARCHAR(50) NOT NULL COMMENT '이름',
  `email` VARCHAR(120) DEFAULT NULL,
  `grade` VARCHAR(10) NOT NULL DEFAULT 'basic',
  `created_at` DATETIME NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_email` (`email`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE `orders` (
  `id` BIGINT NOT NULL AUTO_INCREMENT,
  `user_id` INT UNSIGNED NOT NULL,
  `amount` DECIMAL(12,0) NOT NULL,
  `status` VARCHAR(20) NOT NULL COMMENT 'paid, cancelled, refunded',
  `ordered_at` DATETIME NOT NULL,
  PRIMARY KEY (`id`),
  KEY `idx_user` (`user_id`),
  CONSTRAINT `fk_user` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`)
) ENGINE=InnoDB;
알고 싶은 것
지난 30일 동안 결제 완료(status='paid') 주문 금액 합계가 가장 큰 고객 5명의 이름과 합계를 보여 줘. 취소·환불 주문은 빼고, 합계가 큰 순서로.
데이터베이스 종류
mysql
입력 JSON 보기

입력

{
  "schema": "CREATE TABLE `users` (\n  `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,\n  `name` VARCHAR(50) NOT NULL COMMENT '이름',\n  `email` VARCHAR(120) DEFAULT NULL,\n  `grade` VARCHAR(10) NOT NULL DEFAULT 'basic',\n  `created_at` DATETIME NOT NULL,\n  PRIMARY KEY (`id`),\n  UNIQUE KEY `uk_email` (`email`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;\n\nCREATE TABLE `orders` (\n  `id` BIGINT NOT NULL AUTO_INCREMENT,\n  `user_id` INT UNSIGNED NOT NULL,\n  `amount` DECIMAL(12,0) NOT NULL,\n  `status` VARCHAR(20) NOT NULL COMMENT 'paid, cancelled, refunded',\n  `ordered_at` DATETIME NOT NULL,\n  PRIMARY KEY (`id`),\n  KEY `idx_user` (`user_id`),\n  CONSTRAINT `fk_user` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`)\n) ENGINE=InnoDB;",
  "question": "지난 30일 동안 결제 완료(status='paid') 주문 금액 합계가 가장 큰 고객 5명의 이름과 합계를 보여 줘. 취소·환불 주문은 빼고, 합계가 큰 순서로.",
  "dialect": "mysql"
}

설명

CREATE TABLE 문이나 간단한 테이블 설명과 한국어 질문을 넣으면, SQL 후보를 여러 개 만들고 NULL·중복·빈 그룹이 든 시험 데이터를 만든 뒤 격리된 메모리 데이터베이스에서 모두 실행해 봅니다. 문법 오류나 없는 열을 쓴 후보는 버리고, 결과가 갈리면 질문 뜻에 맞는 결과를 고릅니다. SQL, 풀이, 시험 데이터와 실행 결과 표, 주의할 점, 인덱스 제안을 함께 받으며 MySQL·PostgreSQL 용 문법 변환 부분은 따로 표시합니다. 조회(SELECT)만 만듭니다. 검증 결과: 8개 사례 평균 89.6/100점, 일반 모델 1회 텍스트 응답 48.6점. 실측 2~5초, 외부 AI 보통 5회. 동일 도구 조건의 실험이 아닌 납품 결과 비교이며, 반복 개선에 사용한 사례의 결과로 일반적인 성능을 보장하지 않습니다.

입력과 결과

입력

이름형식과 설명
테이블 구조필수schema글 · 최대 20,000자
CREATE TABLE 문을 그대로 붙여 넣거나 orders(id, user_id, amount, created_at) 처럼 적습니다.
알고 싶은 것필수question글 · 최대 600자
예: 지난 30일 동안 주문 금액 합계가 큰 고객 5명
데이터베이스 종류dialect글 (mysql · postgresql · sqlite)

입력은 글자 수 합계 100,000자까지, 처리 시간은 최대 60초입니다.

결과

이름형식과 설명
SQLsql글
데이터베이스 종류dialect글
실행해 확인한 SQL(SQLite)verified_sql글
검증 범위verified_scope글
풀이steps글 목록
방언 변환(실행 검증 범위 밖)dialect_changes목록 (SQLite · 변환 · 참고)
시험 데이터test_data목록 (테이블 · 열 · 열 형식(SQLite) · 행 수 · 표 · 행(JSON))
시험 데이터 실행 결과result_table묶음
시험 데이터에 든 경계 사례edge_coverage묶음
주의할 점cautions글 목록
인덱스 제안index_suggestions목록 (테이블 · 열 · 문장)
후보 처리 내역candidates묶음
결과 파일artifacts목록 (파일 ID · 파일 이름 · 설명 · 파일 형식 · 파일 주소 · 파일 해시 · 크기(바이트) · 너비 · 높이 · 길이(초)) · 최대 20개

API·MCP 로 쓰기

인증키와 포인트는 다른 리퀘오 API 와 같습니다. 개발가이드

REST

curl -X POST https://reqeo.com/rest/skills/sk_3cf71aacb7d664b9/runs \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Idempotency-Key: my-request-001" \
  -H "Content-Type: application/json" \
  -d '{"input":{"schema":"CREATE TABLE `users` (\n  `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,\n  `name` VARCHAR(50) NOT NULL COMMENT '\''이름'\'',\n  `email` VARCHAR(120) DEFAULT NULL,\n  `grade` VARCHAR(10) NOT NULL DEFAULT '\''basic'\'',\n  `created_at` DATETIME NOT NULL,\n  PRIMARY KEY (`id`),\n  UNIQUE KEY `uk_email` (`email`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;\n\nCREATE TABLE `orders` (\n  `id` BIGINT NOT NULL AUTO_INCREMENT,\n  `user_id` INT UNSIGNED NOT NULL,\n  `amount` DECIMAL(12,0) NOT NULL,\n  `status` VARCHAR(20) NOT NULL COMMENT '\''paid, cancelled, refunded'\'',\n  `ordered_at` DATETIME NOT NULL,\n  PRIMARY KEY (`id`),\n  KEY `idx_user` (`user_id`),\n  CONSTRAINT `fk_user` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`)\n) ENGINE=InnoDB;","question":"지난 30일 동안 결제 완료(status='\''paid'\'') 주문 금액 합계가 가장 큰 고객 5명의 이름과 합계를 보여 줘. 취소·환불 주문은 빼고, 합계가 큰 순서로.","dialect":"mysql"}}'

Idempotency-Key 는 요청마다 새로 정하는 값입니다. 같은 값으로 다시 보내면 한 번만 실행되고 같은 결과를 돌려받습니다.

MCP

엔드포인트  https://reqeo.com/mcp/skills
도구        run_skill
skill_id    sk_3cf71aacb7d664b9

리뷰 0개

로그인하고 이 스킬을 실행하면 리뷰를 남길 수 있습니다. 로그인

아직 리뷰가 없습니다. 실행해 본 뒤 첫 리뷰를 남겨 주세요.