← Back to Index

SQLite Reference

0. Connection & Basics

0.1 Client Connect

Using the sqlite3 CLI for local file-based databases.

# Open or create a database file
sqlite3 project.db

# Use an ephemeral in-memory database
sqlite3 :memory: "SELECT 'volatile' AS type;"
TERMINAL OUTPUT
type
--------
volatile

0.2 CLI Meta-commands

Internal dot-commands for management.

.tables             -- List all tables
.schema users       -- Show CREATE statement for 'users'
.mode csv           -- Set output mode to CSV
.import data.csv t1 -- Import CSV into table 't1'
.quit               -- Exit the CLI
TERMINAL OUTPUT
(Management task result)

0.3 Comments

Annotating SQL code.

-- Single-line comment
/* Multi-line
   comment block */
SELECT 1; -- Trailing comment
TERMINAL OUTPUT
1
-
1

1. Data Types

1.1 Numerics

Flexible “manifest typing” system.

SELECT 
    42 AS i_int,           -- INTEGER (signed 1, 2, 3, 4, 6, or 8 bytes)
    3.14159 AS f_real;     -- REAL (8-byte IEEE float)
TERMINAL OUTPUT
i_int | f_real 
------+--------
42    | 3.14159

1.2 Strings & Binaries

Text and raw storage.

SELECT 
    'UTF-8 text' AS t_text, -- TEXT
    x'53514C' AS b_blob;    -- BLOB (raw bytes)
TERMINAL OUTPUT
t_text     | b_blob
-----------+-------
UTF-8 text | SQL   

1.3 Date & Time

Handled via built-in functions (no native temporal type).

SELECT 
    date('now') AS d,               -- YYYY-MM-DD
    datetime('now', '+1 hour') AS t,-- YYYY-MM-DD HH:MM:SS
    strftime('%s', 'now') AS ts;    -- Unix Epoch
TERMINAL OUTPUT
d          | t                   | ts
-----------+---------------------+-----------
2024-05-16 | 2024-05-16 11:00:00 | 1715853600

1.4 Booleans & Enums

Represented as integers or strings.

SELECT 
    1 AS is_true,          -- Boolean TRUE
    0 AS is_false,         -- Boolean FALSE
    'active' AS status;    -- No ENUM type; use CHECK constraints
TERMINAL OUTPUT
is_true | is_false | status
--------+----------+-------
1       | 0        | active

2. Basic Querying (DQL)

2.1 SELECT & Aliases

Data projection.

SELECT 
    id, 
    name AS username,
    score * 10 AS points
FROM players;
TERMINAL OUTPUT
id | username | points
---+----------+-------
1  | dev_user | 420   

2.2 WHERE Filtering

Pattern matching and logic.

SELECT * FROM files
WHERE size > 1024
  AND name LIKE '%.log'     -- Standard case-insensitive
  AND name GLOB 'test_[0-9]*'; -- Unix shell glob (case-sensitive)
TERMINAL OUTPUT
(Filtered files)

2.3 ORDER BY

Sorting results.

SELECT * FROM tasks
ORDER BY priority DESC, deadline ASC;
TERMINAL OUTPUT
(Sorted tasks)

2.4 LIMIT / OFFSET

Pagination.

SELECT id FROM logs
LIMIT 5 OFFSET 10; -- Skip 10, take 5
TERMINAL OUTPUT
(5 rows)

3. Joins & Set Operations

3.1 Inner & Outer Joins

Horizontal table merging.

SELECT u.name, s.val
FROM users u
LEFT JOIN settings s ON u.id = s.user_id; -- Standard outer join
TERMINAL OUTPUT
(Joined user settings)

3.2 Cross & Self Joins

Cartesian products and self-references.

-- Self join for parent-child nodes
SELECT p.name AS parent, c.name AS child
FROM nodes p
JOIN nodes c ON p.id = c.parent_id;
TERMINAL OUTPUT
(Node hierarchy)

3.3 UNION, INTERSECT, EXCEPT

Set operations.

SELECT id FROM local_cache
EXCEPT
SELECT id FROM remote_server; -- In local but not remote
TERMINAL OUTPUT
(Unique local IDs)

3.4 JOIN with Subqueries

Derived tables.

SELECT a.name, b.avg_val
FROM authors a
JOIN (SELECT author_id, AVG(rating) AS avg_val FROM books GROUP BY author_id) b
  ON a.id = b.author_id;
TERMINAL OUTPUT
(Authors with averages)

4. Aggregation & Grouping

4.1 GROUP BY

Bucket categorization.

SELECT category, COUNT(*)
FROM items
GROUP BY category;
TERMINAL OUTPUT
category | COUNT(*)
---------+---------
hardware | 12      
software | 8       

4.2 HAVING

Aggregate filtering.

SELECT tag, SUM(bits)
FROM data
GROUP BY tag
HAVING SUM(bits) > 1024;
TERMINAL OUTPUT
(Large data tags)

4.3 Aggregate Functions

Common reductions.

SELECT 
    COUNT(DISTINCT user_id) AS distinct_users,
    group_concat(name, '|') AS pipe_list -- SQLite specific
FROM sessions;
TERMINAL OUTPUT
distinct_users | pipe_list
---------------+-----------
5              | a|b|c|d|e

5. Advanced Querying

5.1 Subqueries (IN, EXISTS)

Nested evaluation.

SELECT name FROM products
WHERE price > (SELECT AVG(price) FROM products);
TERMINAL OUTPUT
(Above-average products)

5.2 Common Table Expressions (WITH)

Readable queries.

WITH top_users AS (
    SELECT id FROM users WHERE karma > 1000
)
SELECT * FROM posts WHERE user_id IN top_users;
TERMINAL OUTPUT
(Posts from top users)

5.3 Recursive CTEs

Graph and sequence generation.

WITH RECURSIVE fiber(n, prev) AS (
    SELECT 1, 0
    UNION ALL
    SELECT n + prev, n FROM fiber WHERE n < 100
)
SELECT n FROM fiber;
TERMINAL OUTPUT
n
-
1
1
2
3
5
...

6. Window Functions

6.1 OVER & PARTITION BY

Windowing (SQLite 3.25.0+).

SELECT 
    dept, 
    salary,
    RANK() OVER (PARTITION BY dept ORDER BY salary DESC) as rank
FROM staff;
TERMINAL OUTPUT
(Staff ranked by salary within department)

6.2 Ranking

Positioning.

SELECT 
    val, 
    ROW_NUMBER() OVER (ORDER BY val) AS row_num
FROM stats;
TERMINAL OUTPUT
(Ordered values with sequence)

6.3 Analytics

Positional access.

SELECT 
    val,
    LAG(val) OVER (ORDER BY id) AS previous
FROM sensor_data;
TERMINAL OUTPUT
(Sensor values with lag)

7. Data Modification (DML)

7.1 INSERT

Adding data.

INSERT INTO settings (key, val) VALUES ('port', 8080);
TERMINAL OUTPUT
(1 row inserted)

7.2 UPDATE & DELETE

Modification.

UPDATE users SET last_seen = strftime('%s','now') WHERE id = 1;

DELETE FROM sessions WHERE expiry < strftime('%s','now');
TERMINAL OUTPUT
(Rows affected)

7.3 Upsert (ON CONFLICT)

Atomic insert-or-update (SQLite 3.24.0+).

INSERT INTO kv(key, val) VALUES ('hits', 1)
ON CONFLICT(key) DO UPDATE SET val = val + 1;
TERMINAL OUTPUT
(Row updated)

8. Schema Definition (DDL)

8.1 CREATE & ALTER Table

Structure management.

CREATE TABLE hosts (
    id INTEGER PRIMARY KEY AUTOINCREMENT, -- Auto-incrementing PK
    hostname TEXT UNIQUE NOT NULL,
    config JSON                           -- JSON check-constraint validation
);

ALTER TABLE hosts ADD COLUMN status INTEGER DEFAULT 0;
TERMINAL OUTPUT
(Table created/altered)

8.2 Constraints

Integrity logic.

CREATE TABLE parts (
    id INTEGER PRIMARY KEY,
    weight REAL CHECK(weight > 0),
    pid INTEGER REFERENCES hosts(id) ON DELETE SET NULL
);
TERMINAL OUTPUT
(Table created)

8.3 Indexes & Performance

Search optimization.

CREATE INDEX idx_host_status ON hosts(status);
EXPLAIN QUERY PLAN SELECT * FROM hosts WHERE status = 1;
TERMINAL OUTPUT
QUERY PLAN
`--SEARCH TABLE hosts USING INDEX idx_host_status (status=?)

8.4 Views

Stored queries.

CREATE VIEW active_hosts AS SELECT * FROM hosts WHERE status = 1;
TERMINAL OUTPUT
(View created)

9. Logic & Administration

9.1 Transactions (ACID)

Atomic control.

BEGIN TRANSACTION;
UPDATE wallet SET bal = bal - 10 WHERE id = 1;
UPDATE wallet SET bal = bal + 10 WHERE id = 2;
COMMIT;
TERMINAL OUTPUT
(Transaction committed)

9.2 Triggers

Event-driven logic.

CREATE TRIGGER log_update AFTER UPDATE ON hosts
BEGIN
    INSERT INTO audit(host_id, ts) VALUES (OLD.id, strftime('%s','now'));
END;
TERMINAL OUTPUT
(Trigger created)

9.3 Explain Plan

Low-level VM analysis.

EXPLAIN SELECT * FROM hosts WHERE id = 5;
TERMINAL OUTPUT
addr | opcode      | p1 | p2 | p3 ...
-----+-------------+----+----+----...
0    | Init        | 0  | 12 | 0  ...

9.4 Pragma & Settings

Database configuration.

PRAGMA journal_mode = WAL;      -- Write-Ahead Logging for concurrency
PRAGMA foreign_keys = ON;       -- Enable FK enforcement
PRAGMA synchronous = NORMAL;    -- Faster but less safe on power loss
TERMINAL OUTPUT
wal