Skip to content

SQL Reference

Complete SQL syntax reference for CommitDB.

Data Definition

Databases

CREATE DATABASE mydb;
DROP DATABASE mydb;
DROP DATABASE IF EXISTS mydb;  -- No error if database doesn't exist
SHOW DATABASES;

Tables

CREATE TABLE mydb.users (
    id INT PRIMARY KEY,
    name STRING,
    email STRING,
    age INT,
    score FLOAT,
    bio TEXT,
    active BOOL,
    birth_date DATE,       -- Date only (YYYY-MM-DD)
    created TIMESTAMP,     -- Date + time (YYYY-MM-DD HH:MM:SS)
    metadata JSON          -- JSON object or array
);

DROP TABLE mydb.users;
DROP TABLE IF EXISTS mydb.users;  -- No error if table doesn't exist
SHOW TABLES IN mydb;
DESCRIBE mydb.users;

Indexes

CREATE INDEX idx_name ON mydb.users(name);
CREATE UNIQUE INDEX idx_email ON mydb.users(email);
DROP INDEX idx_name ON mydb.users;
SHOW INDEXES ON mydb.users;

Alter Table

ALTER TABLE mydb.users ADD COLUMN phone STRING;
ALTER TABLE mydb.users DROP COLUMN phone;
ALTER TABLE mydb.users MODIFY COLUMN name TEXT;
ALTER TABLE mydb.users RENAME COLUMN name TO username;

Views

Views are virtual tables defined by a SELECT query. Materialized views cache the query results for faster access.

-- Create a view
CREATE VIEW mydb.active_users AS SELECT * FROM mydb.users WHERE active = 1;

-- Create a materialized view (caches results)
CREATE MATERIALIZED VIEW mydb.user_stats AS 
    SELECT city, COUNT(*) AS count FROM mydb.users GROUP BY city;

-- Query views like tables
SELECT * FROM mydb.active_users;
SELECT * FROM mydb.user_stats;

-- Refresh materialized view after underlying data changes
REFRESH VIEW mydb.user_stats;

-- Show views in database
SHOW VIEWS IN mydb;

-- Drop views (works for both regular and materialized)
DROP VIEW mydb.active_users;
DROP VIEW IF EXISTS mydb.user_stats;

Data Manipulation

Insert

-- Single row
INSERT INTO mydb.users (id, name, email) VALUES (1, 'Alice', 'alice@example.com');

-- With timestamp
INSERT INTO mydb.users (id, name, created) VALUES (2, 'Bob', NOW());

-- Float and boolean literals (no quotes needed)
INSERT INTO mydb.users (id, name, score, active) VALUES (3, 'Charlie', 4.5, true);

-- Bulk insert (multiple rows)
INSERT INTO mydb.users (id, name, email) VALUES 
    (4, 'Diana', 'diana@example.com'),
    (5, 'Eve', 'eve@example.com');

Select

SELECT * FROM mydb.users;
SELECT name, email FROM mydb.users WHERE age > 25;
SELECT * FROM mydb.users ORDER BY name ASC LIMIT 10 OFFSET 5;
SELECT DISTINCT city FROM mydb.users;

Update & Delete

-- Update by primary key (fast path)
UPDATE mydb.users SET name = 'Bob' WHERE id = 1;

-- Update multiple rows by any column
UPDATE mydb.users SET status = 'inactive' WHERE age > 30;
UPDATE mydb.users SET verified = true WHERE email LIKE '%@company.com';

-- Delete by primary key (fast path)
DELETE FROM mydb.users WHERE id = 1;

-- Delete multiple rows by any column
DELETE FROM mydb.logs WHERE level = 'debug';
DELETE FROM mydb.sessions WHERE created < '2024-01-01';

Time-Travel Queries

Query data as it existed at a specific transaction using the AS OF clause:

-- Query data at a specific transaction (commit hash)
SELECT * FROM mydb.users AS OF 'abc1234';

-- Works with all SELECT clauses
SELECT name, email FROM mydb.users AS OF 'abc1234' WHERE active = 1;

-- Use full or abbreviated transaction IDs
SELECT * FROM mydb.users AS OF '93ef5b7512898a585dbc33881a2897b97bac4c05';
SELECT * FROM mydb.users AS OF '93ef5b75';

-- Works on views too
SELECT * FROM mydb.myview AS OF 'abc1234';

Transaction IDs are returned by all data-modifying operations (INSERT, UPDATE, DELETE).

Queries

WHERE Clauses

SELECT * FROM mydb.users WHERE age > 25;
SELECT * FROM mydb.users WHERE name = 'Alice' AND active = true;
SELECT * FROM mydb.users WHERE city IN ('NYC', 'LA', 'Chicago');

ORDER BY, LIMIT, OFFSET

SELECT * FROM mydb.users ORDER BY created DESC;
SELECT * FROM mydb.users ORDER BY name ASC LIMIT 10;
SELECT * FROM mydb.users LIMIT 10 OFFSET 20;

GROUP BY & HAVING

SELECT category, SUM(amount) FROM mydb.orders GROUP BY category;
SELECT city, COUNT(id) FROM mydb.users GROUP BY city HAVING COUNT(id) > 10;

Aggregate Functions

Function Description
COUNT(*) Count rows
SUM(column) Sum numeric values
AVG(column) Average of numeric values
MIN(column) Minimum value
MAX(column) Maximum value

JOINs

-- Inner Join
SELECT * FROM mydb.orders 
INNER JOIN mydb.customers ON customer_id = id;

-- Left Join
SELECT o.id, c.name FROM mydb.orders o
LEFT JOIN mydb.customers c ON o.customer_id = c.id;

-- Right Join
SELECT * FROM mydb.products
RIGHT JOIN mydb.categories ON category_id = id;

String Functions

Function Description
UPPER(str) Convert to uppercase
LOWER(str) Convert to lowercase
CONCAT(a, b, ...) Concatenate strings
SUBSTRING(str, start, len) Extract substring (1-indexed)
TRIM(str) Remove leading/trailing whitespace
LENGTH(str) String length
REPLACE(str, old, new) Replace occurrences
SELECT UPPER(name) FROM mydb.users;
SELECT CONCAT(first_name, ' ', last_name) AS full_name FROM mydb.users;
SELECT SUBSTRING(name, 1, 3) FROM mydb.users;

Date Functions

Function Description
NOW() Current date/time
DATE(timestamp) Extract date part
YEAR(date), MONTH(date), DAY(date) Extract date components
HOUR(ts), MINUTE(ts), SECOND(ts) Extract time components
DATE_ADD(date, n, unit) Add interval (DAY, MONTH, YEAR, etc.)
DATE_SUB(date, n, unit) Subtract interval
DATEDIFF(date1, date2) Days between dates
DATE_FORMAT(date, format) Format date
SELECT NOW() FROM mydb.events;
SELECT YEAR(created_at), MONTH(created_at) FROM mydb.events;
SELECT DATE_ADD(created_at, 7, 'DAY') FROM mydb.events;
SELECT DATE_FORMAT(created_at, '%Y-%m-%d') FROM mydb.events;

JSON Functions

CommitDB supports storing and querying JSON data.

Working with JSON Data

-- Create table with JSON column
CREATE TABLE mydb.documents (
    id INT PRIMARY KEY,
    data JSON
);

-- Insert JSON data (must be valid JSON string)
INSERT INTO mydb.documents (id, data) VALUES (1, '{"name": "Alice", "age": 30}');
INSERT INTO mydb.documents (id, data) VALUES (2, '{"name": "Bob", "tags": ["admin", "user"]}');
INSERT INTO mydb.documents (id, data) VALUES (3, '{"name": "Charlie", "address": {"city": "NYC", "zip": "10001"}}');

JSON Functions Reference

Function Description
JSON_EXTRACT(json, path) Extract value using JSON path
JSON_KEYS(json) Get comma-separated list of keys
JSON_LENGTH(json) Number of elements in array/object
JSON_TYPE(json) Type: object, array, string, number, boolean, null
JSON_CONTAINS(json, value) Returns 1 if value exists, 0 otherwise

JSON Path Syntax

-- Simple key access
SELECT JSON_EXTRACT(data, '$.name') FROM mydb.documents;

-- Nested object access
SELECT JSON_EXTRACT(data, '$.address.city') FROM mydb.documents;

-- Array element access
SELECT JSON_EXTRACT(data, '$.tags[0]') FROM mydb.documents;

JSON in Queries

-- Get all keys from JSON column
SELECT JSON_KEYS(data) FROM mydb.documents;

-- Check JSON type
SELECT JSON_TYPE(data) FROM mydb.documents;

-- Count array/object elements
SELECT JSON_LENGTH(data) FROM mydb.documents;

-- Filter by JSON content
SELECT * FROM mydb.documents WHERE JSON_CONTAINS(data, '"admin"');
SELECT * FROM mydb.documents WHERE JSON_EXTRACT(data, '$.age') = '30';

Bulk Import/Export

-- Export table to CSV (local file)
COPY INTO '/path/to/users.csv' FROM mydb.users;
COPY INTO '/path/to/data.csv' FROM mydb.users WITH (HEADER = TRUE, DELIMITER = ',');

-- Import CSV into table (local file)
COPY INTO mydb.users FROM '/path/to/users.csv';
COPY INTO mydb.users FROM '/path/to/data.tsv' WITH (HEADER = TRUE, DELIMITER = '\t');

-- Import from HTTPS URL
COPY INTO mydb.users FROM 'https://example.com/data.csv';

-- Export to S3
COPY INTO 's3://bucket/path/file.csv' FROM mydb.users;
COPY INTO 's3://bucket/file.csv' FROM mydb.users WITH (AWS_REGION = 'us-east-1');

-- Import from S3
COPY INTO mydb.users FROM 's3://bucket/path/file.csv';
COPY INTO mydb.users FROM 's3://bucket/file.csv' WITH (
    AWS_KEY = 'AKIAIOSFODNN7EXAMPLE',
    AWS_SECRET = 'wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY',
    AWS_REGION = 'us-east-1'
);

S3 Authentication: - Uses AWS environment variables by default (AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_REGION) - Or specify credentials via WITH clause (AWS_KEY, AWS_SECRET, AWS_REGION) - IAM roles work automatically on EC2/ECS/Lambda

Shared Databases

Query external Git repositories without copying data:

-- Create a share from an external repository
CREATE SHARE external FROM 'https://github.com/company/data.git';

-- With SSH authentication
CREATE SHARE reports FROM 'git@github.com:company/reports.git'
    WITH SSH KEY '/path/to/key';

-- With token authentication
CREATE SHARE data FROM 'https://github.com/company/data.git'
    WITH TOKEN 'ghp_xxxxxxxxxxxx';

-- Query shared tables using 3-level naming
SELECT * FROM external.mydb.users;

-- JOIN local and shared tables
SELECT o.id, u.name 
FROM local.orders o 
JOIN external.customers.users u ON o.user_id = u.id;

-- Sync latest changes
SYNC SHARE external;

-- List shares
SHOW SHARES;

-- Remove a share
DROP SHARE external;

Branch Operations

See Branching for full documentation on: - CREATE BRANCH, CHECKOUT, SHOW BRANCHES - MERGE, SHOW MERGE CONFLICTS, RESOLVE CONFLICT - COMMIT MERGE, ABORT MERGE

Remote Operations

See Remote Operations for full documentation on: - ADD REMOTE, SHOW REMOTES, DROP REMOTE - PUSH TO, PULL FROM, FETCH FROM - Authentication with tokens and SSH keys

Transactions

Every data-modifying operation (INSERT, UPDATE, DELETE) is automatically committed as a Git commit. CommitDB provides commands to work with transaction history.

Transaction History

-- View recent transactions (default 100)
SHOW TRANSACTIONS;

-- View specific number of transactions
SHOW TRANSACTIONS LIMIT 20;

Returns columns: TransactionId, Message, Author, Timestamp

Explicit Transactions

BEGIN;
-- ... multiple operations ...
COMMIT;

-- Or rollback
BEGIN;
-- ... operations ...
ROLLBACK;