Automated summary
A quick reference that recalls common SQL patterns: CTEs, window functions, joins, pagination, and indexing strategies.
Strengths
- Covers simple and chained CTEs with directly reusable examples
- Clear comparison table of window functions (ROW_NUMBER, RANK, LAG/LEAD, running aggregates)
- Includes keyset pagination as a fast alternative to OFFSET/LIMIT
- Anti-pattern table with concrete fixes (SELECT *, NOT IN with NULLs, N+1)
Limitations
- Mostly summary tables rather than in-depth discussion of edge cases
- Does not specify a SQL dialect (PostgreSQL, MySQL, etc.)
- Detailed material is deferred to external reference files not included here
Use it when writing or reviewing a SQL query and you want an immediate cheat sheet for CTEs, windows, joins, or indexes.
Avoid it for real performance diagnosis on a specific database or for vendor-specific syntax not covered here.
Security analysis
SafeThe skill is a static SQL reference using only Read and Write tools. It contains no executable commands, network access, secret handling, or destructive instructions.
No concerns found
How this analysis is madeExamples
Write a SQL query using chained CTEs that lists active users with their order count, including users with zero orders.Show me a SQL query that computes daily revenue alongside the previous day's revenue and a running total.Convert this OFFSET/LIMIT pagination query to keyset pagination and explain why it scales better.name: sql-patterns description: "Quick reference for common SQL patterns, CTEs, window functions, and indexing strategies. Triggers on: sql patterns, cte example, window functions, sql join, index strategy, pagination sql." allowed-tools: "Read Write"
SQL Patterns
Quick reference for common SQL patterns.
CTE (Common Table Expressions)
WITH active_users AS (
SELECT id, name, email
FROM users
WHERE status = 'active'
)
SELECT * FROM active_users WHERE created_at > '2024-01-01';
Chained CTEs
WITH
active_users AS (
SELECT id, name FROM users WHERE status = 'active'
),
user_orders AS (
SELECT user_id, COUNT(*) as order_count
FROM orders GROUP BY user_id
)
SELECT u.name, COALESCE(o.order_count, 0) as orders
FROM active_users u
LEFT JOIN user_orders o ON u.id = o.user_id;
Window Functions (Quick Reference)
| Function | Use |
|----------|-----|
| ROW_NUMBER() | Unique sequential numbering |
| RANK() | Rank with gaps (1, 2, 2, 4) |
| DENSE_RANK() | Rank without gaps (1, 2, 2, 3) |
| LAG(col, n) | Previous row value |
| LEAD(col, n) | Next row value |
| SUM() OVER | Running total |
| AVG() OVER | Moving average |
SELECT
date,
revenue,
LAG(revenue, 1) OVER (ORDER BY date) as prev_day,
SUM(revenue) OVER (ORDER BY date) as running_total
FROM daily_sales;
JOIN Reference
| Type | Returns |
|------|---------|
| INNER JOIN | Only matching rows |
| LEFT JOIN | All left + matching right |
| RIGHT JOIN | All right + matching left |
| FULL JOIN | All rows, NULL where no match |
Pagination
-- OFFSET/LIMIT (simple, slow for large offsets)
SELECT * FROM products ORDER BY id LIMIT 20 OFFSET 40;
-- Keyset (fast, scalable)
SELECT * FROM products WHERE id > 42 ORDER BY id LIMIT 20;
Index Quick Reference
| Index Type | Best For | |------------|----------| | B-tree | Range queries, ORDER BY | | Hash | Exact equality only | | GIN | Arrays, JSONB, full-text | | Covering | Avoid table lookup |
Anti-Patterns
| Mistake | Fix |
|---------|-----|
| SELECT * | List columns explicitly |
| WHERE YEAR(date) = 2024 | WHERE date >= '2024-01-01' |
| NOT IN with NULLs | Use NOT EXISTS |
| N+1 queries | Use JOIN or batch |
Additional Resources
For detailed patterns, load:
./references/window-functions.md- Complete window function patterns./references/indexing-strategies.md- Index types, covering indexes, optimization
Prompt Engineering
Data & AI
Prompt engineering best practices and templates to maximize AI outputs.
Data Visualization
Data & AI
Generates data visualizations and charts tailored to your data.
RAG Architecture Setup
Data & AI
Setup guide for RAG (Retrieval-Augmented Generation) architectures.