| name | sql |
| description | Query and manage SQLite, PostgreSQL, and MySQL databases. Use when the user wants to query data, inspect schemas, or run database operations. |
| metadata | {"ccbot":{"emoji":"🗄️","requires":{"bins":["sqlite3"]}}} |
SQL Skill
SQLite (no server needed)
sqlite3 database.db "SELECT * FROM users LIMIT 10;"
sqlite3 -column -header database.db "SELECT name, email FROM users WHERE active=1;"
sqlite3 database.db <<'SQL'
.mode csv
.import data.csv my_table
SQL
sqlite3 -csv -header database.db "SELECT * FROM orders;" > output/orders.csv
sqlite3 database.db ".schema"
sqlite3 database.db ".tables"
SQLite via Python (pandas integration)
uv run --with pandas python3 - <<'EOF'
import sqlite3, pandas as pd
conn = sqlite3.connect("database.db")
df = pd.read_sql_query("""
SELECT u.name, COUNT(o.id) as order_count, SUM(o.total) as revenue
FROM users u
LEFT JOIN orders o ON u.id = o.user_id
GROUP BY u.id
ORDER BY revenue DESC
LIMIT 20
""", conn)
print(df.to_string(index=False))
df.to_csv("output/report.csv", index=False)
print("\nSaved: output/report.csv")
conn.close()
EOF
PostgreSQL
export PGPASSWORD="$DB_PASSWORD"
psql "$DATABASE_URL" -c "SELECT count(*) FROM users;"
psql "$DATABASE_URL" -f query.sql
psql "$DATABASE_URL" -c "\COPY (SELECT * FROM orders) TO 'output/orders.csv' CSV HEADER;"
psql "$DATABASE_URL"
MySQL / MariaDB
mysql -h"$DB_HOST" -u"$DB_USER" -p"$DB_PASSWORD" "$DB_NAME" \
-e "SELECT COUNT(*) FROM users;"
mysqldump -h"$DB_HOST" -u"$DB_USER" -p"$DB_PASSWORD" "$DB_NAME" > output/backup.sql
Common SQL Patterns
Aggregation & Grouping
SELECT
DATE(created_at) as day,
COUNT(*) as new_users,
COUNT(*) FILTER (WHERE plan = 'pro') as pro_users
FROM users
WHERE created_at >= date('now', '-30 days')
GROUP BY 1
ORDER BY 1;
Find Duplicates
SELECT email, COUNT(*) as cnt
FROM users
GROUP BY email
HAVING cnt > 1
ORDER BY cnt DESC;
Window Functions
SELECT
user_id,
amount,
SUM(amount) OVER (PARTITION BY user_id ORDER BY created_at) as running_total,
ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY created_at) as order_num
FROM purchases;
JSON Fields (SQLite 3.38+ / PostgreSQL)
SELECT json_extract(metadata, '$.plan') as plan FROM users;
SELECT metadata->>'plan' as plan FROM users;
Schema Inspection
sqlite3 db.sqlite ".dump" | grep "^CREATE"
psql "$DATABASE_URL" -c "
SELECT relname as table, pg_size_pretty(pg_total_relation_size(oid)) as size
FROM pg_class WHERE relkind='r' ORDER BY pg_total_relation_size(oid) DESC LIMIT 20;
"
Tips
- Always use parameterized queries in code (never string-concat with user input).
- Use
EXPLAIN QUERY PLAN (SQLite) or EXPLAIN ANALYZE (PostgreSQL) to debug slow queries.
- For large exports, use
COPY (PostgreSQL) or chunked pagination rather than SELECT *.
- Output CSVs/reports to
output/ for Feishu delivery.