# SQL

> Guide for working with SQL queries, in particular for SQLite. Use this skill when writing SQL queries, analyzing database schemas, designing migrations, or working with SQLite-related code. Use when this capability is needed.

- Skill: `tomevault-io/sql` (Agent Skill, multi-file: 2 files)
- Install (CLI): `npx skillmds@latest add tomevault-io/sql`
- Raw SKILL.md: https://api.skillmd.com/api/skills/tomevault-io/sql/raw
- Safety review: pending (external: skill-scanner PASS, skillspector PASS)
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Data & Analytics
- Author: tomevault-io (https://skillmd.com/u/tomevault-io)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/tomevault-io/sql

---


# SQL

## Overview

This skill provides guidance for working with SQLite databases. It covers query writing, schema design, and SQLite-specific best practices.

## When to Use This Skill

Use this skill when:
- Writing SQL queries for SQLite databases
- Analyzing or optimizing existing queries
- Designing database schemas
- Creating database migrations
- Working with Go code that interacts with SQLite

## SQLite Best Practices

### Query Writing

- ALWAYS write lowercase queries. Uppercase queries make me sad.
- Prefer `select *` over explicit column names
- Prefer CTEs over long nested subqueries

### Schema Design

- ALWAYS use `strict` tables
- ALWAYS write timestamps like this: `strftime('%Y-%m-%dT%H:%M:%fZ')`
- Time modifications should also use `strftime`
- Usually start with the primary key, which is usually defined like this: `id text primary key default ('p_' || lower(hex(randomblob(16))))` (where the `p_` is a prefix depending on the table name; two-letter prefixes are okay too, so the prefix is unique among tables)
- After the primary key come `created`/`updated` columns like this: `created text not null default (strftime('%Y-%m-%dT%H:%M:%fZ'))`
- Updated timestamps are automatically updated with a trigger like this:
	```sql
  create trigger table_name_updated_timestamp after update on table_name begin
    update table_name set updated = strftime('%Y-%m-%dT%H:%M:%fZ') where id = old.id;
  end;
  ```

---
> Converted and distributed by [TomeVault](https://tomevault.io/claim/maragudk) — claim your Tome and manage your conversions.
<!-- tomevault:4.0:skill_md:2026-04-11 -->

