/write-query - Write Optimized SQL
If you see unfamiliar placeholders or need to check which tools are connected, see CONNECTORS.md.
Write a SQL query from a natural language description, optimized for your specific SQL dialect and following best practices.
Usage
/write-query <description of what data you need>
Workflow
1. Understand the Request
Parse the user's description to identify:
- Output columns: What fields should the result include?
- Filters: What conditions limit the data (time ranges, segments, statuses)?
- Aggregations: Are there GROUP BY operations, counts, sums, averages?
- Joins: Does this require combining multiple tables?
- Ordering: How should results be sorted?
- Limits: Is there a top-N or sample requirement?
2. Determine SQL Dialect
If the user's SQL dialect is not already known, ask which they use:
- PostgreSQL (including Aurora, RDS, Supabase, Neon)
- Snowflake
- BigQuery (Google Cloud)
- Redshift (Amazon)
- Databricks SQL
- MySQL (including Aurora MySQL, PlanetScale)
- SQL Server (Microsoft)
- DuckDB
- SQLite
- Other (ask for specifics)
Remember the dialect for future queries in the same session.
3. Discover Schema (If Warehouse Connected)
If a data warehouse MCP server is connected:
- Search for relevant tables based on the user's description
- Inspect column names, types, and relationships
- Check for partitioning or clustering keys that affect performance
- Look for pre-built views or materialized views that might simplify the query
4. Write the Query
Follow these best practices:
Structure:
- Use CTEs (WITH clauses) for readability when queries have multiple logical steps
- One CTE per logical transformation or data source
- Name CTEs descriptively (e.g.,
daily_signups, active_users, revenue_by_product)
Performance:
- Never use
SELECT * in production queries -- specify only needed columns
- Filter early (push WHERE clauses as close to the base tables as possible)
- Use partition filters when available (especially date partitions)
- Prefer
EXISTS over IN for subqueries with large result sets
- Use appropriate JOIN types (don't use LEFT JOIN when INNER JOIN is correct)
- Avoid correlated subqueries when a JOIN or window function works
- Be mindful of exploding joins (many-to-many)
Readability:
- Add comments explaining the "why" for non-obvious logic
- Use consistent indentation and formatting
- Alias tables with meaningful short names (not just
a, b, c)
- Put each major clause on its own line
Dialect-specific optimizations:
- Apply dialect-specific syntax and functions (see
sql-queries skill for details)
- Use dialect-appropriate date functions, string functions, and window syntax
- Note any dialect-specific performance features (e.g., Snowflake clustering, BigQuery partitioning)
5. Present the Query
Provide:
- The complete query in a SQL code block with syntax highlighting
- Brief explanation of what each CTE or section does
- Performance notes if relevant (expected cost, partition usage, potential bottlenecks)
- Modification suggestions -- how to adjust for common variations (different time range, different granularity, additional filters)
6. Offer to Execute
If a data warehouse is connected, offer to run the query and analyze the results. If the user wants to run it themselves, the query is ready to copy-paste.
Examples
Simple aggregation:
/write-query Count of orders by status for the last 30 days
Complex analysis:
/write-query Cohort retention analysis -- group users by their signup month, then show what percentage are still active (had at least one event) at 1, 3, 6, and 12 months after signup
Performance-critical:
/write-query We have a 500M row events table partitioned by date. Find the top 100 users by event count in the last 7 days with their most recent event type.
Tips
- Mention your SQL dialect upfront to get the right syntax immediately
- If you know the table names, include them -- otherwise Claude will help you find them
- Specify if you need the query to be idempotent (safe to re-run) or one-time
- For recurring queries, mention if it should be parameterized for date ranges
1---
2name: write-query
3description: Write optimized SQL for your dialect with best practices. Use when translating a natural-language data need into SQL, building a multi-CTE query with joins and aggregations, optimizing a query against a large partitioned table, or getting dialect-specific syntax for Snowflake, BigQuery, Postgres, etc.
4argument-hint: "<description of what data you need>"
5---
6
7# /write-query - Write Optimized SQL
8
9> If you see unfamiliar placeholders or need to check which tools are connected, see [CONNECTORS.md](../../CONNECTORS.md).
10
11Write a SQL query from a natural language description, optimized for your specific SQL dialect and following best practices.
12
13## Usage
14
15```
16/write-query <description of what data you need>
17```
18
19## Workflow
20
21### 1. Understand the Request
22
23Parse the user's description to identify:
24
25- **Output columns**: What fields should the result include?
26- **Filters**: What conditions limit the data (time ranges, segments, statuses)?
27- **Aggregations**: Are there GROUP BY operations, counts, sums, averages?
28- **Joins**: Does this require combining multiple tables?
29- **Ordering**: How should results be sorted?
30- **Limits**: Is there a top-N or sample requirement?
31
32### 2. Determine SQL Dialect
33
34If the user's SQL dialect is not already known, ask which they use:
35
36- **PostgreSQL** (including Aurora, RDS, Supabase, Neon)
37- **Snowflake**
38- **BigQuery** (Google Cloud)
39- **Redshift** (Amazon)
40- **Databricks SQL**
41- **MySQL** (including Aurora MySQL, PlanetScale)
42- **SQL Server** (Microsoft)
43- **DuckDB**
44- **SQLite**
45- **Other** (ask for specifics)
46
47Remember the dialect for future queries in the same session.
48
49### 3. Discover Schema (If Warehouse Connected)
50
51If a data warehouse MCP server is connected:
52
531. Search for relevant tables based on the user's description
542. Inspect column names, types, and relationships
553. Check for partitioning or clustering keys that affect performance
564. Look for pre-built views or materialized views that might simplify the query
57
58### 4. Write the Query
59
60Follow these best practices:
61
62**Structure:**
63- Use CTEs (WITH clauses) for readability when queries have multiple logical steps
64- One CTE per logical transformation or data source
65- Name CTEs descriptively (e.g., `daily_signups`, `active_users`, `revenue_by_product`)
66
67**Performance:**
68- Never use `SELECT *` in production queries -- specify only needed columns
69- Filter early (push WHERE clauses as close to the base tables as possible)
70- Use partition filters when available (especially date partitions)
71- Prefer `EXISTS` over `IN` for subqueries with large result sets
72- Use appropriate JOIN types (don't use LEFT JOIN when INNER JOIN is correct)
73- Avoid correlated subqueries when a JOIN or window function works
74- Be mindful of exploding joins (many-to-many)
75
76**Readability:**
77- Add comments explaining the "why" for non-obvious logic
78- Use consistent indentation and formatting
79- Alias tables with meaningful short names (not just `a`, `b`, `c`)
80- Put each major clause on its own line
81
82**Dialect-specific optimizations:**
83- Apply dialect-specific syntax and functions (see `sql-queries` skill for details)
84- Use dialect-appropriate date functions, string functions, and window syntax
85- Note any dialect-specific performance features (e.g., Snowflake clustering, BigQuery partitioning)
86
87### 5. Present the Query
88
89Provide:
90
911. **The complete query** in a SQL code block with syntax highlighting
922. **Brief explanation** of what each CTE or section does
933. **Performance notes** if relevant (expected cost, partition usage, potential bottlenecks)
944. **Modification suggestions** -- how to adjust for common variations (different time range, different granularity, additional filters)
95
96### 6. Offer to Execute
97
98If a data warehouse is connected, offer to run the query and analyze the results. If the user wants to run it themselves, the query is ready to copy-paste.
99
100## Examples
101
102**Simple aggregation:**
103```
104/write-query Count of orders by status for the last 30 days
105```
106
107**Complex analysis:**
108```
109/write-query Cohort retention analysis -- group users by their signup month, then show what percentage are still active (had at least one event) at 1, 3, 6, and 12 months after signup
110```
111
112**Performance-critical:**
113```
114/write-query We have a 500M row events table partitioned by date. Find the top 100 users by event count in the last 7 days with their most recent event type.
115```
116
117## Tips
118
119- Mention your SQL dialect upfront to get the right syntax immediately
120- If you know the table names, include them -- otherwise Claude will help you find them
121- Specify if you need the query to be idempotent (safe to re-run) or one-time
122- For recurring queries, mention if it should be parameterized for date ranges