SQL Snippet Library

Ready-to-use SQL snippets for common database tasks. Copy, paste, and adapt for your projects.

User Management

Create Users Table
CREATE TABLE users (
  id SERIAL PRIMARY KEY,
  email VARCHAR(255) UNIQUE NOT NULL,
  password_hash VARCHAR(255) NOT NULL,
  display_name VARCHAR(100),
  avatar_url TEXT,
  role VARCHAR(20) DEFAULT 'user',
  is_active BOOLEAN DEFAULT TRUE,
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
Find User by Email
SELECT id, email, display_name, avatar_url, role, created_at
FROM users
WHERE email = LOWER(TRIM(:email))
  AND is_active = TRUE;
Update Last Login
UPDATE users
SET last_login_at = CURRENT_TIMESTAMP,
    updated_at = CURRENT_TIMESTAMP
WHERE id = :user_id;

Pagination

Keyset Pagination (Cursor-based)
SELECT id, title, created_at
FROM posts
WHERE created_at < :cursor
ORDER BY created_at DESC, id DESC
LIMIT :limit;
Offset Pagination
SELECT *
FROM posts
ORDER BY created_at DESC
LIMIT :limit
OFFSET :offset;

Aggregation

Monthly Report
SELECT
  DATE_TRUNC('month', created_at) AS month,
  COUNT(*) AS total_orders,
  SUM(total) AS revenue,
  AVG(total) AS avg_order_value
FROM orders
WHERE created_at >= DATE_TRUNC('year', CURRENT_DATE)
GROUP BY DATE_TRUNC('month', created_at)
ORDER BY month DESC;
Top N per Category
WITH ranked AS (
  SELECT *,
    ROW_NUMBER() OVER (
      PARTITION BY category_id
      ORDER BY revenue DESC
    ) AS rn
  FROM products
)
SELECT id, name, category_id, revenue
FROM ranked
WHERE rn <= 5;

Full-Text Search

PostgreSQL Full-Text Search
SELECT id, title, body,
  ts_rank(to_tsvector('english', title || ' ' || body), plainto_tsquery('english', :query)) AS rank
FROM articles
WHERE to_tsvector('english', title || ' ' || body) @@ plainto_tsquery('english', :query)
ORDER BY rank DESC
LIMIT 20;

Hierarchical Data

Recursive CTE for Tree Structure
WITH RECURSIVE category_tree AS (
  -- Base case: root categories
  SELECT id, parent_id, name, 0 AS depth, name AS path
  FROM categories
  WHERE parent_id IS NULL

  UNION ALL

  -- Recursive case: children
  SELECT c.id, c.parent_id, c.name, ct.depth + 1,
    ct.path || ' > ' || c.name
  FROM categories c
  JOIN category_tree ct ON c.parent_id = ct.id
)
SELECT id, depth, path
FROM category_tree
ORDER BY path;

Audit & History

Created/Updated Trigger Function
CREATE OR REPLACE FUNCTION set_timestamps()
RETURNS TRIGGER AS $$
BEGIN
  NEW.updated_at = CURRENT_TIMESTAMP;
  IF TG_OP = 'INSERT' THEN
    NEW.created_at = CURRENT_TIMESTAMP;
  END IF;
  RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER trg_set_timestamps
  BEFORE INSERT OR UPDATE ON users
  FOR EACH ROW
  EXECUTE FUNCTION set_timestamps();

JSON Operations

Query JSON Data
-- PostgreSQL JSONB queries
SELECT
  id,
  data->>'name' AS name,
  data->>'email' AS email,
  data->'metadata'->>'source' AS source
FROM events
WHERE data @> '{"type": "purchase"}'
  AND (data->>'amount')::numeric > 100
ORDER BY (data->>'timestamp')::timestamptz DESC;