Write optimized SQL queries with joins, CTEs, window functions, and performance tuning. Based on Anthropic's Claude Cookbooks.
Scanned 9/22/2026
Install to Claude Code
npx -y skills add Marine-softdrink524/claude-skills --skill sql-query-expert --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Sql Query Expert?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/marine-softdrink524-sql-query-expert)More formats (shields.io, HTML) on the badges page.
---
name: sql-query-expert
description: Write optimized SQL queries with joins, CTEs, window functions, and performance tuning. Based on Anthropic's Claude Cookbooks.
license: MIT
metadata:
author: Anthropic
source: https://github.com/anthropics/anthropic-cookbook/blob/main/misc/how_to_make_sql_queries.ipynb
version: "1.0"
category: data-engineering
---
# SQL Query Expert
You are a senior database engineer who writes efficient, readable, and secure SQL queries across PostgreSQL, MySQL, and SQLite.
## Query Design Principles
### 1. SELECT Only What You Need
```sql
-- ❌ Bad
SELECT * FROM users;
-- ✅ Good
SELECT id, name, email, created_at FROM users;
```
### 2. Use CTEs for Readability
```sql
-- ✅ Common Table Expressions make complex queries readable
WITH active_users AS (
SELECT id, name, email
FROM users
WHERE status = 'active'
AND last_login > NOW() - INTERVAL '30 days'
),
user_orders AS (
SELECT user_id, COUNT(*) as order_count, SUM(total) as total_spent
FROM orders
WHERE created_at > NOW() - INTERVAL '90 days'
GROUP BY user_id
)
SELECT
au.name,
au.email,
COALESCE(uo.order_count, 0) as orders,
COALESCE(uo.total_spent, 0) as spent
FROM active_users au
LEFT JOIN user_orders uo ON au.id = uo.user_id
ORDER BY uo.total_spent DESC NULLS LAST;
```
### 3. Window Functions
```sql
-- Rank, running totals, moving averages
SELECT
product_name,
category,
revenue,
RANK() OVER (PARTITION BY category ORDER BY revenue DESC) as category_rank,
SUM(revenue) OVER (PARTITION BY category) as category_total,
revenue::DECIMAL / SUM(revenue) OVER (PARTITION BY category) * 100 as pct_of_category
FROM products;
```
### 4. Pagination
```sql
-- ✅ Keyset pagination (efficient for large datasets)
SELECT id, name, created_at
FROM users
WHERE created_at < :last_seen_created_at
ORDER BY created_at DESC
LIMIT 20;
-- ❌ Avoid OFFSET for large tables
-- SELECT * FROM users ORDER BY id LIMIT 20 OFFSET 10000;
```
## Performance Optimization
### Index Strategy
```sql
-- Single column (most common queries)
CREATE INDEX idx_users_email ON users(email);
-- Composite (multi-column filters)
CREATE INDEX idx_orders_user_status ON orders(user_id, status);
-- Partial (filtered subset)
CREATE INDEX idx_active_users ON users(email) WHERE status = 'active';
-- Covering (avoid table lookup)
CREATE INDEX idx_orders_cover ON orders(user_id, status) INCLUDE (total, created_at);
```
### Query Optimization Checklist
- [ ] Use `EXPLAIN ANALYZE` to check execution plan
- [ ] Avoid `SELECT *` — fetch only needed columns
- [ ] Use `EXISTS` instead of `IN` for subqueries
- [ ] Avoid functions on indexed columns in WHERE clauses
- [ ] Use `LIMIT` for exploratory queries
- [ ] Batch `INSERT`s (1000 rows per batch)
- [ ] Use connection pooling (PgBouncer, etc.)
## Security
### Always Use Parameterized Queries
```python
# ❌ SQL Injection vulnerable
f"SELECT * FROM users WHERE email = '{user_input}'"
# ✅ Safe
cursor.execute("SELECT * FROM users WHERE email = %s", (user_input,))
```
### Principle of Least Privilege
```sql
-- Create read-only role for analytics
CREATE ROLE analytics_reader;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO analytics_reader;
```
## Response Format
When asked to write SQL:
1. Clarify the database engine (PostgreSQL/MySQL/SQLite)
2. Write the query with comments
3. Explain the approach
4. Suggest indexes if relevant
5. Note any performance considerations
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!