No matching examples. Try another query or clear the filters.
A visual reference · SQLite
SQLite, one change at a time
From a first SELECT to relational queries, transactions, indexes, JSON and full-text search.
Complete source. A small change. Its actual result.
The Org file is the canonical source. Read the HTML guide beside your work,
or download its PDF and source for offline reading.
Last changes: 2026-10-31. Introduced runnable SQLite examples of queries, joins, window functions, transactions, indexes, JSON and full-text search, with verified results and downloadable databases.
Follow a comparison, run the standalone SQL or explore its downloadable database.
Read from the beginning or jump to a stable example ID. Each example includes
its complete input and captured result. Copy link preserves the address of the
guide you are reading, including its current domain and path.
The starting atlas supplies twenty-four relational questions. This guide
retains all twenty-four topics, develops them into complete independent programs,
and adds schema design, data changes, transactions, indexes, JSON, full-text
search and practical report patterns.
Every example starts with a new database. The concise view shows the statements
to study; expand the complete program for its schema and fixture. No example
depends on having run an earlier one. Run a downloaded SQL file in a fresh
working directory with sqlite3 -header -box :memory: < SQL-01-001.sql.
The WAL example needs a fresh file database instead of :memory:.
The VACUUM INTO example writes snapshot.sqlite3 in its working directory.
Results are actual output from the native sqlite3 CLI. The guide renders its
JSON rows as tables. NULL means an absent SQL value; italic empty text is an
empty string. A failed constraint is labelled as an expected diagnostic.
Only nonempty result sets produce JSON arrays in this CLI format. Downloads
include the standalone SQL, captured results and a data snapshot after the
example. Downloads use rollback-journal mode to remain self-contained; the
WAL example still executes in WAL mode and reports that native result. If a failed program leaves a transaction open, connection close rolls
it back before the database is saved.
Starting database
The shared fixture has eight synthetic observations. Values total 100. Site D
has no lookup label, the seventh calendar day has no observation, and notes
contain NULL. The site column is deliberately not a declared foreign key, so
lookup gaps remain available for join examples. Dedicated constraint examples
create actual foreign-key relationships with enforcement enabled.
id
site
value
day
note
1
A
12
2026-01-01
NULL
2
B
20
2026-01-02
checked
3
A
18
2026-01-03
NULL
4
B
8
2026-01-04
recheck
5
C
10
2026-01-05
NULL
6
A
6
2026-01-06
checked
7
C
10
2026-01-08
archived
8
D
16
2026-01-09
NULL
Lookup labels: A = River; B = Hill; C = Coast. Full-text examples use a separate
four-document synthetic corpus in their complete source. All dates and input
values are fixed. Query-plan wording depends on the SQLite version; these
examples show actual chosen plans rather than timing claims. Full preparation
requires SQLite 3.45 or newer with JSON and FTS5.
The atlas supplies the starting questions. This guide uses a new, explicitly
listed fixture and independent explanations, comparisons and added examples.
All twenty-four original topics are mapped in ATLAS_PANEL properties and
sources/atlas-provenance.json. No poster builder or external dataset is needed.
SQLite and its installed extensions remain external dependencies.
-- SQL-01-001: Select stored columns-- Run against a fresh database; all inputs are synthetic.PRAGMAforeign_keys=ON;CREATETABLEsample(idINTEGERPRIMARYKEY,siteTEXTNOTNULL,valueREALNOTNULL,dayTEXTNOTNULL,noteTEXT);INSERTINTOsampleVALUES(1,'A',12,'2026-01-01',NULL),(2,'B',20,'2026-01-02','checked'),(3,'A',18,'2026-01-03',NULL),(4,'B',8,'2026-01-04','recheck'),(5,'C',10,'2026-01-05',NULL),(6,'A',6,'2026-01-06','checked'),(7,'C',10,'2026-01-08','archived'),(8,'D',16,'2026-01-09',NULL);CREATETABLEsite(idTEXTPRIMARYKEY,labelTEXTNOTNULL);INSERTINTOsiteVALUES('A','River'),('B','Hill'),('C','Coast');-- BEGIN EXAMPLESELECTid,site,valueFROMsampleORDERBYid;-- END EXAMPLE
-- SQL-01-002: Filter individual observations-- Run against a fresh database; all inputs are synthetic.PRAGMAforeign_keys=ON;CREATETABLEsample(idINTEGERPRIMARYKEY,siteTEXTNOTNULL,valueREALNOTNULL,dayTEXTNOTNULL,noteTEXT);INSERTINTOsampleVALUES(1,'A',12,'2026-01-01',NULL),(2,'B',20,'2026-01-02','checked'),(3,'A',18,'2026-01-03',NULL),(4,'B',8,'2026-01-04','recheck'),(5,'C',10,'2026-01-05',NULL),(6,'A',6,'2026-01-06','checked'),(7,'C',10,'2026-01-08','archived'),(8,'D',16,'2026-01-09',NULL);CREATETABLEsite(idTEXTPRIMARYKEY,labelTEXTNOTNULL);INSERTINTOsiteVALUES('A','River'),('B','Hill'),('C','Coast');-- BEGIN EXAMPLESELECTid,site,valueFROMsampleWHEREvalue>=16ORDERBYid;-- END EXAMPLE
-- SQL-01-003: Find the top three-- Run against a fresh database; all inputs are synthetic.PRAGMAforeign_keys=ON;CREATETABLEsample(idINTEGERPRIMARYKEY,siteTEXTNOTNULL,valueREALNOTNULL,dayTEXTNOTNULL,noteTEXT);INSERTINTOsampleVALUES(1,'A',12,'2026-01-01',NULL),(2,'B',20,'2026-01-02','checked'),(3,'A',18,'2026-01-03',NULL),(4,'B',8,'2026-01-04','recheck'),(5,'C',10,'2026-01-05',NULL),(6,'A',6,'2026-01-06','checked'),(7,'C',10,'2026-01-08','archived'),(8,'D',16,'2026-01-09',NULL);CREATETABLEsite(idTEXTPRIMARYKEY,labelTEXTNOTNULL);INSERTINTOsiteVALUES('A','River'),('B','Hill'),('C','Coast');-- BEGIN EXAMPLESELECTid,valueFROMsampleORDERBYvalueDESC,idLIMIT3;-- END EXAMPLE
-- SQL-01-004: Return distinct values-- Run against a fresh database; all inputs are synthetic.PRAGMAforeign_keys=ON;CREATETABLEsample(idINTEGERPRIMARYKEY,siteTEXTNOTNULL,valueREALNOTNULL,dayTEXTNOTNULL,noteTEXT);INSERTINTOsampleVALUES(1,'A',12,'2026-01-01',NULL),(2,'B',20,'2026-01-02','checked'),(3,'A',18,'2026-01-03',NULL),(4,'B',8,'2026-01-04','recheck'),(5,'C',10,'2026-01-05',NULL),(6,'A',6,'2026-01-06','checked'),(7,'C',10,'2026-01-08','archived'),(8,'D',16,'2026-01-09',NULL);CREATETABLEsite(idTEXTPRIMARYKEY,labelTEXTNOTNULL);INSERTINTOsiteVALUES('A','River'),('B','Hill'),('C','Coast');-- BEGIN EXAMPLESELECTDISTINCTsiteFROMsampleORDERBYsite;-- END EXAMPLE
-- SQL-01-005: Calculate a derived column-- Run against a fresh database; all inputs are synthetic.PRAGMAforeign_keys=ON;CREATETABLEsample(idINTEGERPRIMARYKEY,siteTEXTNOTNULL,valueREALNOTNULL,dayTEXTNOTNULL,noteTEXT);INSERTINTOsampleVALUES(1,'A',12,'2026-01-01',NULL),(2,'B',20,'2026-01-02','checked'),(3,'A',18,'2026-01-03',NULL),(4,'B',8,'2026-01-04','recheck'),(5,'C',10,'2026-01-05',NULL),(6,'A',6,'2026-01-06','checked'),(7,'C',10,'2026-01-08','archived'),(8,'D',16,'2026-01-09',NULL);CREATETABLEsite(idTEXTPRIMARYKEY,labelTEXTNOTNULL);INSERTINTOsiteVALUES('A','River'),('B','Hill'),('C','Coast');-- BEGIN EXAMPLESELECTid,value*2ASdoubledFROMsampleORDERBYid;-- END EXAMPLE
-- SQL-01-006: Classify with CASE-- Run against a fresh database; all inputs are synthetic.PRAGMAforeign_keys=ON;CREATETABLEsample(idINTEGERPRIMARYKEY,siteTEXTNOTNULL,valueREALNOTNULL,dayTEXTNOTNULL,noteTEXT);INSERTINTOsampleVALUES(1,'A',12,'2026-01-01',NULL),(2,'B',20,'2026-01-02','checked'),(3,'A',18,'2026-01-03',NULL),(4,'B',8,'2026-01-04','recheck'),(5,'C',10,'2026-01-05',NULL),(6,'A',6,'2026-01-06','checked'),(7,'C',10,'2026-01-08','archived'),(8,'D',16,'2026-01-09',NULL);CREATETABLEsite(idTEXTPRIMARYKEY,labelTEXTNOTNULL);INSERTINTOsiteVALUES('A','River'),('B','Hill'),('C','Coast');-- BEGIN EXAMPLESELECTid,CASEWHENvalue>=16THEN'high'ELSE'low'ENDASclassFROMsampleORDERBYid;-- END EXAMPLE
-- SQL-02-001: Display a value for NULL-- Run against a fresh database; all inputs are synthetic.PRAGMAforeign_keys=ON;CREATETABLEsample(idINTEGERPRIMARYKEY,siteTEXTNOTNULL,valueREALNOTNULL,dayTEXTNOTNULL,noteTEXT);INSERTINTOsampleVALUES(1,'A',12,'2026-01-01',NULL),(2,'B',20,'2026-01-02','checked'),(3,'A',18,'2026-01-03',NULL),(4,'B',8,'2026-01-04','recheck'),(5,'C',10,'2026-01-05',NULL),(6,'A',6,'2026-01-06','checked'),(7,'C',10,'2026-01-08','archived'),(8,'D',16,'2026-01-09',NULL);CREATETABLEsite(idTEXTPRIMARYKEY,labelTEXTNOTNULL);INSERTINTOsiteVALUES('A','River'),('B','Hill'),('C','Coast');-- BEGIN EXAMPLESELECTid,coalesce(note,'(missing)')ASnoteFROMsampleORDERBYid;-- END EXAMPLE
-- SQL-02-002: Test NULL explicitly-- Run against a fresh database; all inputs are synthetic.PRAGMAforeign_keys=ON;CREATETABLEsample(idINTEGERPRIMARYKEY,siteTEXTNOTNULL,valueREALNOTNULL,dayTEXTNOTNULL,noteTEXT);INSERTINTOsampleVALUES(1,'A',12,'2026-01-01',NULL),(2,'B',20,'2026-01-02','checked'),(3,'A',18,'2026-01-03',NULL),(4,'B',8,'2026-01-04','recheck'),(5,'C',10,'2026-01-05',NULL),(6,'A',6,'2026-01-06','checked'),(7,'C',10,'2026-01-08','archived'),(8,'D',16,'2026-01-09',NULL);CREATETABLEsite(idTEXTPRIMARYKEY,labelTEXTNOTNULL);INSERTINTOsiteVALUES('A','River'),('B','Hill'),('C','Coast');-- BEGIN EXAMPLESELECTid,noteFROMsampleWHEREnoteISNULLORDERBYid;-- END EXAMPLE
-- SQL-02-003: Combine range and membership filters-- Run against a fresh database; all inputs are synthetic.PRAGMAforeign_keys=ON;CREATETABLEsample(idINTEGERPRIMARYKEY,siteTEXTNOTNULL,valueREALNOTNULL,dayTEXTNOTNULL,noteTEXT);INSERTINTOsampleVALUES(1,'A',12,'2026-01-01',NULL),(2,'B',20,'2026-01-02','checked'),(3,'A',18,'2026-01-03',NULL),(4,'B',8,'2026-01-04','recheck'),(5,'C',10,'2026-01-05',NULL),(6,'A',6,'2026-01-06','checked'),(7,'C',10,'2026-01-08','archived'),(8,'D',16,'2026-01-09',NULL);CREATETABLEsite(idTEXTPRIMARYKEY,labelTEXTNOTNULL);INSERTINTOsiteVALUES('A','River'),('B','Hill'),('C','Coast');-- BEGIN EXAMPLESELECTid,site,valueFROMsampleWHEREvalueBETWEEN10AND18ANDsiteIN('A','C')ORDERBYid;-- END EXAMPLE
Normalize the displayed text; it does not update storage.
Complete standalone SQL and starting fixture
-- SQL-02-004: Match and normalize text-- Run against a fresh database; all inputs are synthetic.PRAGMAforeign_keys=ON;CREATETABLEsample(idINTEGERPRIMARYKEY,siteTEXTNOTNULL,valueREALNOTNULL,dayTEXTNOTNULL,noteTEXT);INSERTINTOsampleVALUES(1,'A',12,'2026-01-01',NULL),(2,'B',20,'2026-01-02','checked'),(3,'A',18,'2026-01-03',NULL),(4,'B',8,'2026-01-04','recheck'),(5,'C',10,'2026-01-05',NULL),(6,'A',6,'2026-01-06','checked'),(7,'C',10,'2026-01-08','archived'),(8,'D',16,'2026-01-09',NULL);CREATETABLEsite(idTEXTPRIMARYKEY,labelTEXTNOTNULL);INSERTINTOsiteVALUES('A','River'),('B','Hill'),('C','Coast');-- BEGIN EXAMPLESELECTid,lower(note)ASnoteFROMsampleWHEREnoteLIKE'check%'ORDERBYid;-- END EXAMPLE
-- SQL-02-005: Place NULL values last-- Run against a fresh database; all inputs are synthetic.PRAGMAforeign_keys=ON;CREATETABLEsample(idINTEGERPRIMARYKEY,siteTEXTNOTNULL,valueREALNOTNULL,dayTEXTNOTNULL,noteTEXT);INSERTINTOsampleVALUES(1,'A',12,'2026-01-01',NULL),(2,'B',20,'2026-01-02','checked'),(3,'A',18,'2026-01-03',NULL),(4,'B',8,'2026-01-04','recheck'),(5,'C',10,'2026-01-05',NULL),(6,'A',6,'2026-01-06','checked'),(7,'C',10,'2026-01-08','archived'),(8,'D',16,'2026-01-09',NULL);CREATETABLEsite(idTEXTPRIMARYKEY,labelTEXTNOTNULL);INSERTINTOsiteVALUES('A','River'),('B','Hill'),('C','Coast');-- BEGIN EXAMPLESELECTid,noteFROMsampleORDERBYnoteNULLSLAST,id;-- END EXAMPLE
-- SQL-02-006: Continue with keyset pagination-- Run against a fresh database; all inputs are synthetic.PRAGMAforeign_keys=ON;CREATETABLEsample(idINTEGERPRIMARYKEY,siteTEXTNOTNULL,valueREALNOTNULL,dayTEXTNOTNULL,noteTEXT);INSERTINTOsampleVALUES(1,'A',12,'2026-01-01',NULL),(2,'B',20,'2026-01-02','checked'),(3,'A',18,'2026-01-03',NULL),(4,'B',8,'2026-01-04','recheck'),(5,'C',10,'2026-01-05',NULL),(6,'A',6,'2026-01-06','checked'),(7,'C',10,'2026-01-08','archived'),(8,'D',16,'2026-01-09',NULL);CREATETABLEsite(idTEXTPRIMARYKEY,labelTEXTNOTNULL);INSERTINTOsiteVALUES('A','River'),('B','Hill'),('C','Coast');-- BEGIN EXAMPLESELECTid,siteFROMsampleWHEREid>4ORDERBYidLIMIT3;-- END EXAMPLE
-- SQL-03-001: Distinguish integer and real arithmetic-- Run against a fresh database; all inputs are synthetic.PRAGMAforeign_keys=ON;CREATETABLEsample(idINTEGERPRIMARYKEY,siteTEXTNOTNULL,valueREALNOTNULL,dayTEXTNOTNULL,noteTEXT);INSERTINTOsampleVALUES(1,'A',12,'2026-01-01',NULL),(2,'B',20,'2026-01-02','checked'),(3,'A',18,'2026-01-03',NULL),(4,'B',8,'2026-01-04','recheck'),(5,'C',10,'2026-01-05',NULL),(6,'A',6,'2026-01-06','checked'),(7,'C',10,'2026-01-08','archived'),(8,'D',16,'2026-01-09',NULL);CREATETABLEsite(idTEXTPRIMARYKEY,labelTEXTNOTNULL);INSERTINTOsiteVALUES('A','River'),('B','Hill'),('C','Coast');-- BEGIN EXAMPLESELECT5/2ASinteger_division,5.0/2ASreal_division,CAST(5ASREAL)/2AScast_division;-- END EXAMPLE
-- SQL-03-002: Format a consistent identifier-- Run against a fresh database; all inputs are synthetic.PRAGMAforeign_keys=ON;CREATETABLEsample(idINTEGERPRIMARYKEY,siteTEXTNOTNULL,valueREALNOTNULL,dayTEXTNOTNULL,noteTEXT);INSERTINTOsampleVALUES(1,'A',12,'2026-01-01',NULL),(2,'B',20,'2026-01-02','checked'),(3,'A',18,'2026-01-03',NULL),(4,'B',8,'2026-01-04','recheck'),(5,'C',10,'2026-01-05',NULL),(6,'A',6,'2026-01-06','checked'),(7,'C',10,'2026-01-08','archived'),(8,'D',16,'2026-01-09',NULL);CREATETABLEsite(idTEXTPRIMARYKEY,labelTEXTNOTNULL);INSERTINTOsiteVALUES('A','River'),('B','Hill'),('C','Coast');-- BEGIN EXAMPLESELECTprintf('S%02d',id)ASlabel,lower(site)ASsiteFROMsampleORDERBYid;-- END EXAMPLE
SELECTtrim(' River ')AScleaned,'site-'||lower('A')ASslug,replace('north_bank','_',' ')AStitle;
Actual SQLite result
Result 1 · 1 rows
cleaned
slug
title
River
site-a
north bank
SQLite · exit 0
Clause or feature
Meaning
trim
Remove surrounding spaces.
||
Concatenate text values.
replace
Substitute an exact substring.
Complete standalone SQL and starting fixture
-- SQL-03-003: Clean and join text-- Run against a fresh database; all inputs are synthetic.PRAGMAforeign_keys=ON;CREATETABLEsample(idINTEGERPRIMARYKEY,siteTEXTNOTNULL,valueREALNOTNULL,dayTEXTNOTNULL,noteTEXT);INSERTINTOsampleVALUES(1,'A',12,'2026-01-01',NULL),(2,'B',20,'2026-01-02','checked'),(3,'A',18,'2026-01-03',NULL),(4,'B',8,'2026-01-04','recheck'),(5,'C',10,'2026-01-05',NULL),(6,'A',6,'2026-01-06','checked'),(7,'C',10,'2026-01-08','archived'),(8,'D',16,'2026-01-09',NULL);CREATETABLEsite(idTEXTPRIMARYKEY,labelTEXTNOTNULL);INSERTINTOsiteVALUES('A','River'),('B','Hill'),('C','Coast');-- BEGIN EXAMPLESELECTtrim(' River ')AScleaned,'site-'||lower('A')ASslug,replace('north_bank','_',' ')AStitle;-- END EXAMPLE
Zero here is a presentation choice, not the unknown mathematical result.
Complete standalone SQL and starting fixture
-- SQL-03-004: Guard a denominator with NULLIF-- Run against a fresh database; all inputs are synthetic.PRAGMAforeign_keys=ON;CREATETABLEsample(idINTEGERPRIMARYKEY,siteTEXTNOTNULL,valueREALNOTNULL,dayTEXTNOTNULL,noteTEXT);INSERTINTOsampleVALUES(1,'A',12,'2026-01-01',NULL),(2,'B',20,'2026-01-02','checked'),(3,'A',18,'2026-01-03',NULL),(4,'B',8,'2026-01-04','recheck'),(5,'C',10,'2026-01-05',NULL),(6,'A',6,'2026-01-06','checked'),(7,'C',10,'2026-01-08','archived'),(8,'D',16,'2026-01-09',NULL);CREATETABLEsite(idTEXTPRIMARYKEY,labelTEXTNOTNULL);INSERTINTOsiteVALUES('A','River'),('B','Hill'),('C','Coast');-- BEGIN EXAMPLESELECT12.0/nullif(0,0)ASunknown_ratio,coalesce(12.0/nullif(0,0),0)ASdisplay_ratio,round(12.0/5,2)ASrounded;-- END EXAMPLE
-- SQL-03-005: Measure elapsed days-- Run against a fresh database; all inputs are synthetic.PRAGMAforeign_keys=ON;CREATETABLEsample(idINTEGERPRIMARYKEY,siteTEXTNOTNULL,valueREALNOTNULL,dayTEXTNOTNULL,noteTEXT);INSERTINTOsampleVALUES(1,'A',12,'2026-01-01',NULL),(2,'B',20,'2026-01-02','checked'),(3,'A',18,'2026-01-03',NULL),(4,'B',8,'2026-01-04','recheck'),(5,'C',10,'2026-01-05',NULL),(6,'A',6,'2026-01-06','checked'),(7,'C',10,'2026-01-08','archived'),(8,'D',16,'2026-01-09',NULL);CREATETABLEsite(idTEXTPRIMARYKEY,labelTEXTNOTNULL);INSERTINTOsiteVALUES('A','River'),('B','Hill'),('C','Coast');-- BEGIN EXAMPLESELECTid,CAST(julianday(day)-julianday('2026-01-01')ASINTEGER)ASdaysFROMsampleORDERBYid;-- END EXAMPLE
SELECTdate('2026-02-12','start of month','+1 month','-1 day')ASmonth_end,strftime('%Y-%m','2026-02-12')ASmonth;
Actual SQLite result
Result 1 · 1 rows
month_end
month
2026-02-28
2026-02
SQLite · exit 0
Clause or feature
Meaning
start of month
Move to day one.
+1 month then -1 day
Move to the last day of the original month.
strftime
Choose a date display format.
Complete standalone SQL and starting fixture
-- SQL-03-006: Calculate a calendar boundary-- Run against a fresh database; all inputs are synthetic.PRAGMAforeign_keys=ON;CREATETABLEsample(idINTEGERPRIMARYKEY,siteTEXTNOTNULL,valueREALNOTNULL,dayTEXTNOTNULL,noteTEXT);INSERTINTOsampleVALUES(1,'A',12,'2026-01-01',NULL),(2,'B',20,'2026-01-02','checked'),(3,'A',18,'2026-01-03',NULL),(4,'B',8,'2026-01-04','recheck'),(5,'C',10,'2026-01-05',NULL),(6,'A',6,'2026-01-06','checked'),(7,'C',10,'2026-01-08','archived'),(8,'D',16,'2026-01-09',NULL);CREATETABLEsite(idTEXTPRIMARYKEY,labelTEXTNOTNULL);INSERTINTOsiteVALUES('A','River'),('B','Hill'),('C','Coast');-- BEGIN EXAMPLESELECTdate('2026-02-12','start of month','+1 month','-1 day')ASmonth_end,strftime('%Y-%m','2026-02-12')ASmonth;-- END EXAMPLE
-- SQL-04-001: Summarize the entire table-- Run against a fresh database; all inputs are synthetic.PRAGMAforeign_keys=ON;CREATETABLEsample(idINTEGERPRIMARYKEY,siteTEXTNOTNULL,valueREALNOTNULL,dayTEXTNOTNULL,noteTEXT);INSERTINTOsampleVALUES(1,'A',12,'2026-01-01',NULL),(2,'B',20,'2026-01-02','checked'),(3,'A',18,'2026-01-03',NULL),(4,'B',8,'2026-01-04','recheck'),(5,'C',10,'2026-01-05',NULL),(6,'A',6,'2026-01-06','checked'),(7,'C',10,'2026-01-08','archived'),(8,'D',16,'2026-01-09',NULL);CREATETABLEsite(idTEXTPRIMARYKEY,labelTEXTNOTNULL);INSERTINTOsiteVALUES('A','River'),('B','Hill'),('C','Coast');-- BEGIN EXAMPLESELECTcount(*)ASn,round(avg(value),2)ASmean,min(value)ASminimum,max(value)ASmaximumFROMsample;-- END EXAMPLE
-- SQL-04-002: Group observations by site-- Run against a fresh database; all inputs are synthetic.PRAGMAforeign_keys=ON;CREATETABLEsample(idINTEGERPRIMARYKEY,siteTEXTNOTNULL,valueREALNOTNULL,dayTEXTNOTNULL,noteTEXT);INSERTINTOsampleVALUES(1,'A',12,'2026-01-01',NULL),(2,'B',20,'2026-01-02','checked'),(3,'A',18,'2026-01-03',NULL),(4,'B',8,'2026-01-04','recheck'),(5,'C',10,'2026-01-05',NULL),(6,'A',6,'2026-01-06','checked'),(7,'C',10,'2026-01-08','archived'),(8,'D',16,'2026-01-09',NULL);CREATETABLEsite(idTEXTPRIMARYKEY,labelTEXTNOTNULL);INSERTINTOsiteVALUES('A','River'),('B','Hill'),('C','Coast');-- BEGIN EXAMPLESELECTsite,count(*)ASn,sum(value)AStotalFROMsampleGROUPBYsiteORDERBYsite;-- END EXAMPLE
-- SQL-04-003: Filter groups with HAVING-- Run against a fresh database; all inputs are synthetic.PRAGMAforeign_keys=ON;CREATETABLEsample(idINTEGERPRIMARYKEY,siteTEXTNOTNULL,valueREALNOTNULL,dayTEXTNOTNULL,noteTEXT);INSERTINTOsampleVALUES(1,'A',12,'2026-01-01',NULL),(2,'B',20,'2026-01-02','checked'),(3,'A',18,'2026-01-03',NULL),(4,'B',8,'2026-01-04','recheck'),(5,'C',10,'2026-01-05',NULL),(6,'A',6,'2026-01-06','checked'),(7,'C',10,'2026-01-08','archived'),(8,'D',16,'2026-01-09',NULL);CREATETABLEsite(idTEXTPRIMARYKEY,labelTEXTNOTNULL);INSERTINTOsiteVALUES('A','River'),('B','Hill'),('C','Coast');-- BEGIN EXAMPLESELECTsite,sum(value)AStotalFROMsampleGROUPBYsiteHAVINGsum(value)>25ORDERBYsite;-- END EXAMPLE
-- SQL-04-004: Count missing and present values-- Run against a fresh database; all inputs are synthetic.PRAGMAforeign_keys=ON;CREATETABLEsample(idINTEGERPRIMARYKEY,siteTEXTNOTNULL,valueREALNOTNULL,dayTEXTNOTNULL,noteTEXT);INSERTINTOsampleVALUES(1,'A',12,'2026-01-01',NULL),(2,'B',20,'2026-01-02','checked'),(3,'A',18,'2026-01-03',NULL),(4,'B',8,'2026-01-04','recheck'),(5,'C',10,'2026-01-05',NULL),(6,'A',6,'2026-01-06','checked'),(7,'C',10,'2026-01-08','archived'),(8,'D',16,'2026-01-09',NULL);CREATETABLEsite(idTEXTPRIMARYKEY,labelTEXTNOTNULL);INSERTINTOsiteVALUES('A','River'),('B','Hill'),('C','Coast');-- BEGIN EXAMPLESELECTsite,count(*)ASn,count(note)ASnoted,count(*)FILTER(WHEREnoteISNULL)ASmissingFROMsampleGROUPBYsiteORDERBYsite;-- END EXAMPLE
Divide by the sum of weights, not the number of rows.
Complete standalone SQL and starting fixture
-- SQL-04-005: Calculate a weighted mean-- Run against a fresh database; all inputs are synthetic.PRAGMAforeign_keys=ON;CREATETABLEsample(idINTEGERPRIMARYKEY,siteTEXTNOTNULL,valueREALNOTNULL,dayTEXTNOTNULL,noteTEXT);INSERTINTOsampleVALUES(1,'A',12,'2026-01-01',NULL),(2,'B',20,'2026-01-02','checked'),(3,'A',18,'2026-01-03',NULL),(4,'B',8,'2026-01-04','recheck'),(5,'C',10,'2026-01-05',NULL),(6,'A',6,'2026-01-06','checked'),(7,'C',10,'2026-01-08','archived'),(8,'D',16,'2026-01-09',NULL);CREATETABLEsite(idTEXTPRIMARYKEY,labelTEXTNOTNULL);INSERTINTOsiteVALUES('A','River'),('B','Hill'),('C','Coast');-- BEGIN EXAMPLEWITHweights(id,w)AS(VALUES(1,1),(2,2),(3,1))SELECTsum(s.value*w.w)/sum(w.w)ASweighted_meanFROMsampleASsJOINweightsASwONw.id=s.id;-- END EXAMPLE
Specify list order explicitly; supported since SQLite 3.44.
Complete standalone SQL and starting fixture
-- SQL-04-006: Make an ordered list per group-- Run against a fresh database; all inputs are synthetic.PRAGMAforeign_keys=ON;CREATETABLEsample(idINTEGERPRIMARYKEY,siteTEXTNOTNULL,valueREALNOTNULL,dayTEXTNOTNULL,noteTEXT);INSERTINTOsampleVALUES(1,'A',12,'2026-01-01',NULL),(2,'B',20,'2026-01-02','checked'),(3,'A',18,'2026-01-03',NULL),(4,'B',8,'2026-01-04','recheck'),(5,'C',10,'2026-01-05',NULL),(6,'A',6,'2026-01-06','checked'),(7,'C',10,'2026-01-08','archived'),(8,'D',16,'2026-01-09',NULL);CREATETABLEsite(idTEXTPRIMARYKEY,labelTEXTNOTNULL);INSERTINTOsiteVALUES('A','River'),('B','Hill'),('C','Coast');-- BEGIN EXAMPLESELECTsite,group_concat(id,','ORDERBYid)ASidsFROMsampleGROUPBYsiteORDERBYsite;-- END EXAMPLE
Distinguish observation columns from lookup columns.
Complete standalone SQL and starting fixture
-- SQL-05-001: Match a lookup with an inner join-- Run against a fresh database; all inputs are synthetic.PRAGMAforeign_keys=ON;CREATETABLEsample(idINTEGERPRIMARYKEY,siteTEXTNOTNULL,valueREALNOTNULL,dayTEXTNOTNULL,noteTEXT);INSERTINTOsampleVALUES(1,'A',12,'2026-01-01',NULL),(2,'B',20,'2026-01-02','checked'),(3,'A',18,'2026-01-03',NULL),(4,'B',8,'2026-01-04','recheck'),(5,'C',10,'2026-01-05',NULL),(6,'A',6,'2026-01-06','checked'),(7,'C',10,'2026-01-08','archived'),(8,'D',16,'2026-01-09',NULL);CREATETABLEsite(idTEXTPRIMARYKEY,labelTEXTNOTNULL);INSERTINTOsiteVALUES('A','River'),('B','Hill'),('C','Coast');-- BEGIN EXAMPLESELECTs.id,t.labelFROMsampleASsJOINsiteAStONt.id=s.siteORDERBYs.id;-- END EXAMPLE
-- SQL-05-002: Keep observations with missing metadata-- Run against a fresh database; all inputs are synthetic.PRAGMAforeign_keys=ON;CREATETABLEsample(idINTEGERPRIMARYKEY,siteTEXTNOTNULL,valueREALNOTNULL,dayTEXTNOTNULL,noteTEXT);INSERTINTOsampleVALUES(1,'A',12,'2026-01-01',NULL),(2,'B',20,'2026-01-02','checked'),(3,'A',18,'2026-01-03',NULL),(4,'B',8,'2026-01-04','recheck'),(5,'C',10,'2026-01-05',NULL),(6,'A',6,'2026-01-06','checked'),(7,'C',10,'2026-01-08','archived'),(8,'D',16,'2026-01-09',NULL);CREATETABLEsite(idTEXTPRIMARYKEY,labelTEXTNOTNULL);INSERTINTOsiteVALUES('A','River'),('B','Hill'),('C','Coast');-- BEGIN EXAMPLESELECTs.id,t.labelFROMsampleASsLEFTJOINsiteAStONt.id=s.siteORDERBYs.id;-- END EXAMPLE
Keep a row only when the correlated lookup is empty.
Correlation
Match the lookup to the current observation.
Complete standalone SQL and starting fixture
-- SQL-05-003: Find missing relationships-- Run against a fresh database; all inputs are synthetic.PRAGMAforeign_keys=ON;CREATETABLEsample(idINTEGERPRIMARYKEY,siteTEXTNOTNULL,valueREALNOTNULL,dayTEXTNOTNULL,noteTEXT);INSERTINTOsampleVALUES(1,'A',12,'2026-01-01',NULL),(2,'B',20,'2026-01-02','checked'),(3,'A',18,'2026-01-03',NULL),(4,'B',8,'2026-01-04','recheck'),(5,'C',10,'2026-01-05',NULL),(6,'A',6,'2026-01-06','checked'),(7,'C',10,'2026-01-08','archived'),(8,'D',16,'2026-01-09',NULL);CREATETABLEsite(idTEXTPRIMARYKEY,labelTEXTNOTNULL);INSERTINTOsiteVALUES('A','River'),('B','Hill'),('C','Coast');-- BEGIN EXAMPLESELECTs.id,s.siteFROMsampleASsWHERENOTEXISTS(SELECT1FROMsiteAStWHEREt.id=s.site)ORDERBYs.id;-- END EXAMPLE
-- SQL-05-004: Compare an ON filter with a WHERE filter-- Run against a fresh database; all inputs are synthetic.PRAGMAforeign_keys=ON;CREATETABLEsample(idINTEGERPRIMARYKEY,siteTEXTNOTNULL,valueREALNOTNULL,dayTEXTNOTNULL,noteTEXT);INSERTINTOsampleVALUES(1,'A',12,'2026-01-01',NULL),(2,'B',20,'2026-01-02','checked'),(3,'A',18,'2026-01-03',NULL),(4,'B',8,'2026-01-04','recheck'),(5,'C',10,'2026-01-05',NULL),(6,'A',6,'2026-01-06','checked'),(7,'C',10,'2026-01-08','archived'),(8,'D',16,'2026-01-09',NULL);CREATETABLEsite(idTEXTPRIMARYKEY,labelTEXTNOTNULL);INSERTINTOsiteVALUES('A','River'),('B','Hill'),('C','Coast');-- BEGIN EXAMPLESELECT'ON'ASplacement,count(*)ASnFROMsampleASsLEFTJOINsiteAStONt.id=s.siteANDt.label='River'UNIONALLSELECT'WHERE',count(*)FROMsampleASsLEFTJOINsiteAStONt.id=s.siteWHEREt.label='River'ORDERBYplacement;-- END EXAMPLE
The output now represents an observation-tag pair.
Complete standalone SQL and starting fixture
-- SQL-05-005: See join multiplicity-- Run against a fresh database; all inputs are synthetic.PRAGMAforeign_keys=ON;CREATETABLEsample(idINTEGERPRIMARYKEY,siteTEXTNOTNULL,valueREALNOTNULL,dayTEXTNOTNULL,noteTEXT);INSERTINTOsampleVALUES(1,'A',12,'2026-01-01',NULL),(2,'B',20,'2026-01-02','checked'),(3,'A',18,'2026-01-03',NULL),(4,'B',8,'2026-01-04','recheck'),(5,'C',10,'2026-01-05',NULL),(6,'A',6,'2026-01-06','checked'),(7,'C',10,'2026-01-08','archived'),(8,'D',16,'2026-01-09',NULL);CREATETABLEsite(idTEXTPRIMARYKEY,labelTEXTNOTNULL);INSERTINTOsiteVALUES('A','River'),('B','Hill'),('C','Coast');-- BEGIN EXAMPLECREATETABLEtag(sample_idINTEGER,tagTEXT);INSERTINTOtagVALUES(1,'red'),(1,'checked'),(2,'blue');SELECTs.id,t.tagFROMsampleASsJOINtagAStONt.sample_id=s.idORDERBYs.id,t.tag;-- END EXAMPLE
Require a one-day gap, not merely consecutive IDs.
Complete standalone SQL and starting fixture
-- SQL-05-006: Join a table to itself-- Run against a fresh database; all inputs are synthetic.PRAGMAforeign_keys=ON;CREATETABLEsample(idINTEGERPRIMARYKEY,siteTEXTNOTNULL,valueREALNOTNULL,dayTEXTNOTNULL,noteTEXT);INSERTINTOsampleVALUES(1,'A',12,'2026-01-01',NULL),(2,'B',20,'2026-01-02','checked'),(3,'A',18,'2026-01-03',NULL),(4,'B',8,'2026-01-04','recheck'),(5,'C',10,'2026-01-05',NULL),(6,'A',6,'2026-01-06','checked'),(7,'C',10,'2026-01-08','archived'),(8,'D',16,'2026-01-09',NULL);CREATETABLEsite(idTEXTPRIMARYKEY,labelTEXTNOTNULL);INSERTINTOsiteVALUES('A','River'),('B','Hill'),('C','Coast');-- BEGIN EXAMPLESELECTa.idASfirst_id,b.idASnext_idFROMsampleASaJOINsampleASbONb.day=date(a.day,'+1 day')ORDERBYa.id,b.id;-- END EXAMPLE
-- SQL-06-001: Compare with a correlated group mean-- Run against a fresh database; all inputs are synthetic.PRAGMAforeign_keys=ON;CREATETABLEsample(idINTEGERPRIMARYKEY,siteTEXTNOTNULL,valueREALNOTNULL,dayTEXTNOTNULL,noteTEXT);INSERTINTOsampleVALUES(1,'A',12,'2026-01-01',NULL),(2,'B',20,'2026-01-02','checked'),(3,'A',18,'2026-01-03',NULL),(4,'B',8,'2026-01-04','recheck'),(5,'C',10,'2026-01-05',NULL),(6,'A',6,'2026-01-06','checked'),(7,'C',10,'2026-01-08','archived'),(8,'D',16,'2026-01-09',NULL);CREATETABLEsite(idTEXTPRIMARYKEY,labelTEXTNOTNULL);INSERTINTOsiteVALUES('A','River'),('B','Hill'),('C','Coast');-- BEGIN EXAMPLESELECTs.id,s.site,s.valueFROMsampleASsWHEREs.value>(SELECTavg(t.value)FROMsampleAStWHEREt.site=s.site)ORDERBYs.id;-- END EXAMPLE
-- SQL-06-002: Name an intermediate result-- Run against a fresh database; all inputs are synthetic.PRAGMAforeign_keys=ON;CREATETABLEsample(idINTEGERPRIMARYKEY,siteTEXTNOTNULL,valueREALNOTNULL,dayTEXTNOTNULL,noteTEXT);INSERTINTOsampleVALUES(1,'A',12,'2026-01-01',NULL),(2,'B',20,'2026-01-02','checked'),(3,'A',18,'2026-01-03',NULL),(4,'B',8,'2026-01-04','recheck'),(5,'C',10,'2026-01-05',NULL),(6,'A',6,'2026-01-06','checked'),(7,'C',10,'2026-01-08','archived'),(8,'D',16,'2026-01-09',NULL);CREATETABLEsite(idTEXTPRIMARYKEY,labelTEXTNOTNULL);INSERTINTOsiteVALUES('A','River'),('B','Hill'),('C','Coast');-- BEGIN EXAMPLEWITHtotalsAS(SELECTsite,sum(value)AStotalFROMsampleGROUPBYsite)SELECTsite,totalFROMtotalsORDERBYtotalDESC,site;-- END EXAMPLE
-- SQL-06-003: Use EXISTS as a membership question-- Run against a fresh database; all inputs are synthetic.PRAGMAforeign_keys=ON;CREATETABLEsample(idINTEGERPRIMARYKEY,siteTEXTNOTNULL,valueREALNOTNULL,dayTEXTNOTNULL,noteTEXT);INSERTINTOsampleVALUES(1,'A',12,'2026-01-01',NULL),(2,'B',20,'2026-01-02','checked'),(3,'A',18,'2026-01-03',NULL),(4,'B',8,'2026-01-04','recheck'),(5,'C',10,'2026-01-05',NULL),(6,'A',6,'2026-01-06','checked'),(7,'C',10,'2026-01-08','archived'),(8,'D',16,'2026-01-09',NULL);CREATETABLEsite(idTEXTPRIMARYKEY,labelTEXTNOTNULL);INSERTINTOsiteVALUES('A','River'),('B','Hill'),('C','Coast');-- BEGIN EXAMPLESELECTt.id,t.labelFROMsiteAStWHEREEXISTS(SELECT1FROMsampleASsWHEREs.site=t.idANDs.value>15)ORDERBYt.id;-- END EXAMPLE
-- SQL-06-004: Expose the NOT IN and NULL trap-- Run against a fresh database; all inputs are synthetic.PRAGMAforeign_keys=ON;CREATETABLEsample(idINTEGERPRIMARYKEY,siteTEXTNOTNULL,valueREALNOTNULL,dayTEXTNOTNULL,noteTEXT);INSERTINTOsampleVALUES(1,'A',12,'2026-01-01',NULL),(2,'B',20,'2026-01-02','checked'),(3,'A',18,'2026-01-03',NULL),(4,'B',8,'2026-01-04','recheck'),(5,'C',10,'2026-01-05',NULL),(6,'A',6,'2026-01-06','checked'),(7,'C',10,'2026-01-08','archived'),(8,'D',16,'2026-01-09',NULL);CREATETABLEsite(idTEXTPRIMARYKEY,labelTEXTNOTNULL);INSERTINTOsiteVALUES('A','River'),('B','Hill'),('C','Coast');-- BEGIN EXAMPLESELECT'NOT IN'ASmethod,count(*)ASnFROMsampleWHEREsiteNOTIN(SELECTidFROMsiteUNIONALLSELECTNULL)UNIONALLSELECT'NOT EXISTS',count(*)FROMsampleASsWHERENOTEXISTS(SELECT1FROMsiteAStWHEREt.id=s.site)ORDERBYmethod;-- END EXAMPLE
-- SQL-06-005: Compare UNION and UNION ALL-- Run against a fresh database; all inputs are synthetic.PRAGMAforeign_keys=ON;CREATETABLEsample(idINTEGERPRIMARYKEY,siteTEXTNOTNULL,valueREALNOTNULL,dayTEXTNOTNULL,noteTEXT);INSERTINTOsampleVALUES(1,'A',12,'2026-01-01',NULL),(2,'B',20,'2026-01-02','checked'),(3,'A',18,'2026-01-03',NULL),(4,'B',8,'2026-01-04','recheck'),(5,'C',10,'2026-01-05',NULL),(6,'A',6,'2026-01-06','checked'),(7,'C',10,'2026-01-08','archived'),(8,'D',16,'2026-01-09',NULL);CREATETABLEsite(idTEXTPRIMARYKEY,labelTEXTNOTNULL);INSERTINTOsiteVALUES('A','River'),('B','Hill'),('C','Coast');-- BEGIN EXAMPLESELECTsiteFROMsampleUNIONSELECTidFROMsiteORDERBYsite;SELECTsiteFROMsampleUNIONALLSELECTidFROMsiteORDERBYsite;-- END EXAMPLE
-- SQL-06-006: Intersect and subtract sets-- Run against a fresh database; all inputs are synthetic.PRAGMAforeign_keys=ON;CREATETABLEsample(idINTEGERPRIMARYKEY,siteTEXTNOTNULL,valueREALNOTNULL,dayTEXTNOTNULL,noteTEXT);INSERTINTOsampleVALUES(1,'A',12,'2026-01-01',NULL),(2,'B',20,'2026-01-02','checked'),(3,'A',18,'2026-01-03',NULL),(4,'B',8,'2026-01-04','recheck'),(5,'C',10,'2026-01-05',NULL),(6,'A',6,'2026-01-06','checked'),(7,'C',10,'2026-01-08','archived'),(8,'D',16,'2026-01-09',NULL);CREATETABLEsite(idTEXTPRIMARYKEY,labelTEXTNOTNULL);INSERTINTOsiteVALUES('A','River'),('B','Hill'),('C','Coast');-- BEGIN EXAMPLESELECTsiteFROMsampleINTERSECTSELECTidFROMsiteORDERBYsite;SELECTsiteFROMsampleEXCEPTSELECTidFROMsiteORDERBYsite;-- END EXAMPLE
-- SQL-07-001: Number rows within each site-- Run against a fresh database; all inputs are synthetic.PRAGMAforeign_keys=ON;CREATETABLEsample(idINTEGERPRIMARYKEY,siteTEXTNOTNULL,valueREALNOTNULL,dayTEXTNOTNULL,noteTEXT);INSERTINTOsampleVALUES(1,'A',12,'2026-01-01',NULL),(2,'B',20,'2026-01-02','checked'),(3,'A',18,'2026-01-03',NULL),(4,'B',8,'2026-01-04','recheck'),(5,'C',10,'2026-01-05',NULL),(6,'A',6,'2026-01-06','checked'),(7,'C',10,'2026-01-08','archived'),(8,'D',16,'2026-01-09',NULL);CREATETABLEsite(idTEXTPRIMARYKEY,labelTEXTNOTNULL);INSERTINTOsiteVALUES('A','River'),('B','Hill'),('C','Coast');-- BEGIN EXAMPLESELECTid,site,row_number()OVER(PARTITIONBYsiteORDERBYvalueDESC,id)ASpositionFROMsampleORDERBYsite,position;-- END EXAMPLE
-- SQL-07-002: Calculate a running total-- Run against a fresh database; all inputs are synthetic.PRAGMAforeign_keys=ON;CREATETABLEsample(idINTEGERPRIMARYKEY,siteTEXTNOTNULL,valueREALNOTNULL,dayTEXTNOTNULL,noteTEXT);INSERTINTOsampleVALUES(1,'A',12,'2026-01-01',NULL),(2,'B',20,'2026-01-02','checked'),(3,'A',18,'2026-01-03',NULL),(4,'B',8,'2026-01-04','recheck'),(5,'C',10,'2026-01-05',NULL),(6,'A',6,'2026-01-06','checked'),(7,'C',10,'2026-01-08','archived'),(8,'D',16,'2026-01-09',NULL);CREATETABLEsite(idTEXTPRIMARYKEY,labelTEXTNOTNULL);INSERTINTOsiteVALUES('A','River'),('B','Hill'),('C','Coast');-- BEGIN EXAMPLESELECTid,sum(value)OVER(ORDERBYidROWSBETWEENUNBOUNDEDPRECEDINGANDCURRENTROW)AScumulativeFROMsampleORDERBYid;-- END EXAMPLE
-- SQL-07-003: Measure change from the preceding row-- Run against a fresh database; all inputs are synthetic.PRAGMAforeign_keys=ON;CREATETABLEsample(idINTEGERPRIMARYKEY,siteTEXTNOTNULL,valueREALNOTNULL,dayTEXTNOTNULL,noteTEXT);INSERTINTOsampleVALUES(1,'A',12,'2026-01-01',NULL),(2,'B',20,'2026-01-02','checked'),(3,'A',18,'2026-01-03',NULL),(4,'B',8,'2026-01-04','recheck'),(5,'C',10,'2026-01-05',NULL),(6,'A',6,'2026-01-06','checked'),(7,'C',10,'2026-01-08','archived'),(8,'D',16,'2026-01-09',NULL);CREATETABLEsite(idTEXTPRIMARYKEY,labelTEXTNOTNULL);INSERTINTOsiteVALUES('A','River'),('B','Hill'),('C','Coast');-- BEGIN EXAMPLESELECTid,value-lag(value)OVER(ORDERBYid)ASchangeFROMsampleORDERBYid;-- END EXAMPLE
-- SQL-07-004: Calculate a three-row moving mean-- Run against a fresh database; all inputs are synthetic.PRAGMAforeign_keys=ON;CREATETABLEsample(idINTEGERPRIMARYKEY,siteTEXTNOTNULL,valueREALNOTNULL,dayTEXTNOTNULL,noteTEXT);INSERTINTOsampleVALUES(1,'A',12,'2026-01-01',NULL),(2,'B',20,'2026-01-02','checked'),(3,'A',18,'2026-01-03',NULL),(4,'B',8,'2026-01-04','recheck'),(5,'C',10,'2026-01-05',NULL),(6,'A',6,'2026-01-06','checked'),(7,'C',10,'2026-01-08','archived'),(8,'D',16,'2026-01-09',NULL);CREATETABLEsite(idTEXTPRIMARYKEY,labelTEXTNOTNULL);INSERTINTOsiteVALUES('A','River'),('B','Hill'),('C','Coast');-- BEGIN EXAMPLESELECTid,round(avg(value)OVER(ORDERBYidROWSBETWEEN2PRECEDINGANDCURRENTROW),2)ASmean3FROMsampleORDERBYid;-- END EXAMPLE
Do not add id to the rank window: doing so would break value ties.
Outer id order
Use id only to stabilize the displayed tied rows.
Complete standalone SQL and starting fixture
-- SQL-07-005: Compare rank and dense rank-- Run against a fresh database; all inputs are synthetic.PRAGMAforeign_keys=ON;CREATETABLEsample(idINTEGERPRIMARYKEY,siteTEXTNOTNULL,valueREALNOTNULL,dayTEXTNOTNULL,noteTEXT);INSERTINTOsampleVALUES(1,'A',12,'2026-01-01',NULL),(2,'B',20,'2026-01-02','checked'),(3,'A',18,'2026-01-03',NULL),(4,'B',8,'2026-01-04','recheck'),(5,'C',10,'2026-01-05',NULL),(6,'A',6,'2026-01-06','checked'),(7,'C',10,'2026-01-08','archived'),(8,'D',16,'2026-01-09',NULL);CREATETABLEsite(idTEXTPRIMARYKEY,labelTEXTNOTNULL);INSERTINTOsiteVALUES('A','River'),('B','Hill'),('C','Coast');-- BEGIN EXAMPLESELECTid,value,rank()OVER(ORDERBYvalueDESC)ASr,dense_rank()OVER(ORDERBYvalueDESC)ASdense_rFROMsampleORDERBYvalueDESC,id;-- END EXAMPLE
-- SQL-07-006: Give LAST_VALUE a complete frame-- Run against a fresh database; all inputs are synthetic.PRAGMAforeign_keys=ON;CREATETABLEsample(idINTEGERPRIMARYKEY,siteTEXTNOTNULL,valueREALNOTNULL,dayTEXTNOTNULL,noteTEXT);INSERTINTOsampleVALUES(1,'A',12,'2026-01-01',NULL),(2,'B',20,'2026-01-02','checked'),(3,'A',18,'2026-01-03',NULL),(4,'B',8,'2026-01-04','recheck'),(5,'C',10,'2026-01-05',NULL),(6,'A',6,'2026-01-06','checked'),(7,'C',10,'2026-01-08','archived'),(8,'D',16,'2026-01-09',NULL);CREATETABLEsite(idTEXTPRIMARYKEY,labelTEXTNOTNULL);INSERTINTOsiteVALUES('A','River'),('B','Hill'),('C','Coast');-- BEGIN EXAMPLESELECTid,first_value(value)OVERwASfirst,last_value(value)OVERwASlastFROMsampleWINDOWwAS(ORDERBYidROWSBETWEENUNBOUNDEDPRECEDINGANDUNBOUNDEDFOLLOWING)ORDERBYid;-- END EXAMPLE
-- SQL-08-001: Generate a finite sequence-- Run against a fresh database; all inputs are synthetic.PRAGMAforeign_keys=ON;CREATETABLEsample(idINTEGERPRIMARYKEY,siteTEXTNOTNULL,valueREALNOTNULL,dayTEXTNOTNULL,noteTEXT);INSERTINTOsampleVALUES(1,'A',12,'2026-01-01',NULL),(2,'B',20,'2026-01-02','checked'),(3,'A',18,'2026-01-03',NULL),(4,'B',8,'2026-01-04','recheck'),(5,'C',10,'2026-01-05',NULL),(6,'A',6,'2026-01-06','checked'),(7,'C',10,'2026-01-08','archived'),(8,'D',16,'2026-01-09',NULL);CREATETABLEsite(idTEXTPRIMARYKEY,labelTEXTNOTNULL);INSERTINTOsiteVALUES('A','River'),('B','Hill'),('C','Coast');-- BEGIN EXAMPLEWITHRECURSIVEseq(n)AS(VALUES(1)UNIONALLSELECTn+1FROMseqWHEREn<5)SELECTn,n*nASsquareFROMseqORDERBYn;-- END EXAMPLE
-- SQL-08-002: Generate a calendar with missing days-- Run against a fresh database; all inputs are synthetic.PRAGMAforeign_keys=ON;CREATETABLEsample(idINTEGERPRIMARYKEY,siteTEXTNOTNULL,valueREALNOTNULL,dayTEXTNOTNULL,noteTEXT);INSERTINTOsampleVALUES(1,'A',12,'2026-01-01',NULL),(2,'B',20,'2026-01-02','checked'),(3,'A',18,'2026-01-03',NULL),(4,'B',8,'2026-01-04','recheck'),(5,'C',10,'2026-01-05',NULL),(6,'A',6,'2026-01-06','checked'),(7,'C',10,'2026-01-08','archived'),(8,'D',16,'2026-01-09',NULL);CREATETABLEsite(idTEXTPRIMARYKEY,labelTEXTNOTNULL);INSERTINTOsiteVALUES('A','River'),('B','Hill'),('C','Coast');-- BEGIN EXAMPLEWITHRECURSIVEdays(day)AS(VALUES('2026-01-01')UNIONALLSELECTdate(day,'+1 day')FROMdaysWHEREday<'2026-01-09')SELECTd.day,count(s.id)ASnFROMdaysASdLEFTJOINsampleASsONs.day=d.dayGROUPBYd.dayORDERBYd.day;-- END EXAMPLE
Maintain a path and depth through recursive steps.
Child join
Extend only from the current parent.
Complete standalone SQL and starting fixture
-- SQL-08-003: Walk a parent-child hierarchy-- Run against a fresh database; all inputs are synthetic.PRAGMAforeign_keys=ON;CREATETABLEsample(idINTEGERPRIMARYKEY,siteTEXTNOTNULL,valueREALNOTNULL,dayTEXTNOTNULL,noteTEXT);INSERTINTOsampleVALUES(1,'A',12,'2026-01-01',NULL),(2,'B',20,'2026-01-02','checked'),(3,'A',18,'2026-01-03',NULL),(4,'B',8,'2026-01-04','recheck'),(5,'C',10,'2026-01-05',NULL),(6,'A',6,'2026-01-06','checked'),(7,'C',10,'2026-01-08','archived'),(8,'D',16,'2026-01-09',NULL);CREATETABLEsite(idTEXTPRIMARYKEY,labelTEXTNOTNULL);INSERTINTOsiteVALUES('A','River'),('B','Hill'),('C','Coast');-- BEGIN EXAMPLECREATETABLEnode(idINTEGERPRIMARYKEY,parentINTEGER,nameTEXT);INSERTINTOnodeVALUES(1,NULL,'Archive'),(2,1,'Field'),(3,1,'Lab'),(4,2,'North'),(5,2,'South');WITHRECURSIVEtree(id,path,depth)AS(SELECTid,name,0FROMnodeWHEREparentISNULLUNIONALLSELECTn.id,t.path||'/'||n.name,t.depth+1FROMnodeASnJOINtreeAStONn.parent=t.id)SELECTpath,depthFROMtreeORDERBYpath;-- END EXAMPLE
-- SQL-08-004: Prevent cycles in a graph walk-- Run against a fresh database; all inputs are synthetic.PRAGMAforeign_keys=ON;CREATETABLEsample(idINTEGERPRIMARYKEY,siteTEXTNOTNULL,valueREALNOTNULL,dayTEXTNOTNULL,noteTEXT);INSERTINTOsampleVALUES(1,'A',12,'2026-01-01',NULL),(2,'B',20,'2026-01-02','checked'),(3,'A',18,'2026-01-03',NULL),(4,'B',8,'2026-01-04','recheck'),(5,'C',10,'2026-01-05',NULL),(6,'A',6,'2026-01-06','checked'),(7,'C',10,'2026-01-08','archived'),(8,'D',16,'2026-01-09',NULL);CREATETABLEsite(idTEXTPRIMARYKEY,labelTEXTNOTNULL);INSERTINTOsiteVALUES('A','River'),('B','Hill'),('C','Coast');-- BEGIN EXAMPLECREATETABLEedge(aINTEGER,bINTEGER);INSERTINTOedgeVALUES(1,2),(2,3),(3,1),(2,4);WITHRECURSIVEwalk(id,path,depth)AS(VALUES(1,',1,',0)UNIONALLSELECTe.b,w.path||e.b||',',w.depth+1FROMedgeASeJOINwalkASwONe.a=w.idWHEREinstr(w.path,','||e.b||',')=0ANDw.depth<8)SELECTid,depthFROMwalkORDERBYdepth,id;-- END EXAMPLE
-- SQL-08-005: Carry an accumulated calculation-- Run against a fresh database; all inputs are synthetic.PRAGMAforeign_keys=ON;CREATETABLEsample(idINTEGERPRIMARYKEY,siteTEXTNOTNULL,valueREALNOTNULL,dayTEXTNOTNULL,noteTEXT);INSERTINTOsampleVALUES(1,'A',12,'2026-01-01',NULL),(2,'B',20,'2026-01-02','checked'),(3,'A',18,'2026-01-03',NULL),(4,'B',8,'2026-01-04','recheck'),(5,'C',10,'2026-01-05',NULL),(6,'A',6,'2026-01-06','checked'),(7,'C',10,'2026-01-08','archived'),(8,'D',16,'2026-01-09',NULL);CREATETABLEsite(idTEXTPRIMARYKEY,labelTEXTNOTNULL);INSERTINTOsiteVALUES('A','River'),('B','Hill'),('C','Coast');-- BEGIN EXAMPLEWITHRECURSIVEfact(n,value)AS(VALUES(0,1)UNIONALLSELECTn+1,value*(n+1)FROMfactWHEREn<6)SELECTn,valueFROMfactORDERBYn;-- END EXAMPLE
-- SQL-08-006: Expand a bill of materials-- Run against a fresh database; all inputs are synthetic.PRAGMAforeign_keys=ON;CREATETABLEsample(idINTEGERPRIMARYKEY,siteTEXTNOTNULL,valueREALNOTNULL,dayTEXTNOTNULL,noteTEXT);INSERTINTOsampleVALUES(1,'A',12,'2026-01-01',NULL),(2,'B',20,'2026-01-02','checked'),(3,'A',18,'2026-01-03',NULL),(4,'B',8,'2026-01-04','recheck'),(5,'C',10,'2026-01-05',NULL),(6,'A',6,'2026-01-06','checked'),(7,'C',10,'2026-01-08','archived'),(8,'D',16,'2026-01-09',NULL);CREATETABLEsite(idTEXTPRIMARYKEY,labelTEXTNOTNULL);INSERTINTOsiteVALUES('A','River'),('B','Hill'),('C','Coast');-- BEGIN EXAMPLECREATETABLEcomponent(parentTEXT,childTEXT,qtyINTEGER);INSERTINTOcomponentVALUES('kit','case',1),('kit','pack',2),('pack','bolt',4);WITHRECURSIVEbom(part,qty)AS(VALUES('kit',1)UNIONALLSELECTc.child,b.qty*c.qtyFROMcomponentAScJOINbomASbONc.parent=b.part)SELECTpart,sum(qty)ASneededFROMbomASbWHERENOTEXISTS(SELECT1FROMcomponentAScWHEREc.parent=b.part)GROUPBYpartORDERBYpart;-- END EXAMPLE
Error near line 21 of SQL-09-001.sql: CHECK constraint failed: n>=0
SQLite · expected exit 1
Clause or feature
Meaning
NOT NULL
Require a known quantity.
CHECK(n>=0)
Reject negative values.
Expected failure
The invalid row is not stored.
Complete standalone SQL and starting fixture
-- SQL-09-001: Reject a violated CHECK constraint-- Run against a fresh database; all inputs are synthetic.PRAGMAforeign_keys=ON;CREATETABLEsample(idINTEGERPRIMARYKEY,siteTEXTNOTNULL,valueREALNOTNULL,dayTEXTNOTNULL,noteTEXT);INSERTINTOsampleVALUES(1,'A',12,'2026-01-01',NULL),(2,'B',20,'2026-01-02','checked'),(3,'A',18,'2026-01-03',NULL),(4,'B',8,'2026-01-04','recheck'),(5,'C',10,'2026-01-05',NULL),(6,'A',6,'2026-01-06','checked'),(7,'C',10,'2026-01-08','archived'),(8,'D',16,'2026-01-09',NULL);CREATETABLEsite(idTEXTPRIMARYKEY,labelTEXTNOTNULL);INSERTINTOsiteVALUES('A','River'),('B','Hill'),('C','Coast');-- BEGIN EXAMPLECREATETABLEquantity(idINTEGERPRIMARYKEY,nINTEGERNOTNULLCHECK(n>=0));INSERTINTOquantityVALUES(1,-1);-- END EXAMPLE
Error near line 22 of SQL-09-002.sql: FOREIGN KEY constraint failed
SQLite · expected exit 1
Clause or feature
Meaning
REFERENCES
Declare the relationship in the schema.
PRAGMA foreign_keys=ON
Enable enforcement for this connection.
Complete standalone SQL and starting fixture
-- SQL-09-002: Enforce a foreign key-- Run against a fresh database; all inputs are synthetic.PRAGMAforeign_keys=ON;CREATETABLEsample(idINTEGERPRIMARYKEY,siteTEXTNOTNULL,valueREALNOTNULL,dayTEXTNOTNULL,noteTEXT);INSERTINTOsampleVALUES(1,'A',12,'2026-01-01',NULL),(2,'B',20,'2026-01-02','checked'),(3,'A',18,'2026-01-03',NULL),(4,'B',8,'2026-01-04','recheck'),(5,'C',10,'2026-01-05',NULL),(6,'A',6,'2026-01-06','checked'),(7,'C',10,'2026-01-08','archived'),(8,'D',16,'2026-01-09',NULL);CREATETABLEsite(idTEXTPRIMARYKEY,labelTEXTNOTNULL);INSERTINTOsiteVALUES('A','River'),('B','Hill'),('C','Coast');-- BEGIN EXAMPLECREATETABLEparent(idINTEGERPRIMARYKEY);CREATETABLEchild(idINTEGERPRIMARYKEY,parent_idINTEGERREFERENCESparent(id));INSERTINTOchildVALUES(1,99);-- END EXAMPLE
Keep the supplied storage type without numeric coercion.
Complete standalone SQL and starting fixture
-- SQL-09-003: Compare STRICT storage with ANY-- Run against a fresh database; all inputs are synthetic.PRAGMAforeign_keys=ON;CREATETABLEsample(idINTEGERPRIMARYKEY,siteTEXTNOTNULL,valueREALNOTNULL,dayTEXTNOTNULL,noteTEXT);INSERTINTOsampleVALUES(1,'A',12,'2026-01-01',NULL),(2,'B',20,'2026-01-02','checked'),(3,'A',18,'2026-01-03',NULL),(4,'B',8,'2026-01-04','recheck'),(5,'C',10,'2026-01-05',NULL),(6,'A',6,'2026-01-06','checked'),(7,'C',10,'2026-01-08','archived'),(8,'D',16,'2026-01-09',NULL);CREATETABLEsite(idTEXTPRIMARYKEY,labelTEXTNOTNULL);INSERTINTOsiteVALUES('A','River'),('B','Hill'),('C','Coast');-- BEGIN EXAMPLECREATETABLEtyped(nINTEGER,tagANY)STRICT;INSERTINTOtypedVALUES('000123','000123');SELECTn,typeof(n)ASn_type,tag,typeof(tag)AStag_typeFROMtyped;-- END EXAMPLE
-- SQL-09-004: Store a generated column-- Run against a fresh database; all inputs are synthetic.PRAGMAforeign_keys=ON;CREATETABLEsample(idINTEGERPRIMARYKEY,siteTEXTNOTNULL,valueREALNOTNULL,dayTEXTNOTNULL,noteTEXT);INSERTINTOsampleVALUES(1,'A',12,'2026-01-01',NULL),(2,'B',20,'2026-01-02','checked'),(3,'A',18,'2026-01-03',NULL),(4,'B',8,'2026-01-04','recheck'),(5,'C',10,'2026-01-05',NULL),(6,'A',6,'2026-01-06','checked'),(7,'C',10,'2026-01-08','archived'),(8,'D',16,'2026-01-09',NULL);CREATETABLEsite(idTEXTPRIMARYKEY,labelTEXTNOTNULL);INSERTINTOsiteVALUES('A','River'),('B','Hill'),('C','Coast');-- BEGIN EXAMPLECREATETABLEline(qtyINTEGER,unit_centsINTEGER,total_centsINTEGERGENERATEDALWAYSAS(qty*unit_cents)STORED);INSERTINTOline(qty,unit_cents)VALUES(3,120),(2,125);SELECTqty,unit_cents,total_centsFROMlineORDERBYtotal_cents;-- END EXAMPLE
-- SQL-09-005: Use a composite key without rowid-- Run against a fresh database; all inputs are synthetic.PRAGMAforeign_keys=ON;CREATETABLEsample(idINTEGERPRIMARYKEY,siteTEXTNOTNULL,valueREALNOTNULL,dayTEXTNOTNULL,noteTEXT);INSERTINTOsampleVALUES(1,'A',12,'2026-01-01',NULL),(2,'B',20,'2026-01-02','checked'),(3,'A',18,'2026-01-03',NULL),(4,'B',8,'2026-01-04','recheck'),(5,'C',10,'2026-01-05',NULL),(6,'A',6,'2026-01-06','checked'),(7,'C',10,'2026-01-08','archived'),(8,'D',16,'2026-01-09',NULL);CREATETABLEsite(idTEXTPRIMARYKEY,labelTEXTNOTNULL);INSERTINTOsiteVALUES('A','River'),('B','Hill'),('C','Coast');-- BEGIN EXAMPLECREATETABLEcoordinate(aTEXT,bINTEGER,valueTEXT,PRIMARYKEY(a,b))WITHOUTROWID;INSERTINTOcoordinateVALUES('A',1,'north'),('A',2,'south'),('B',1,'east');SELECTa,b,valueFROMcoordinateORDERBYa,b;-- END EXAMPLE
Only the actual X label contributes to known counts.
Complete standalone SQL and starting fixture
-- SQL-09-006: See how UNIQUE treats NULL-- Run against a fresh database; all inputs are synthetic.PRAGMAforeign_keys=ON;CREATETABLEsample(idINTEGERPRIMARYKEY,siteTEXTNOTNULL,valueREALNOTNULL,dayTEXTNOTNULL,noteTEXT);INSERTINTOsampleVALUES(1,'A',12,'2026-01-01',NULL),(2,'B',20,'2026-01-02','checked'),(3,'A',18,'2026-01-03',NULL),(4,'B',8,'2026-01-04','recheck'),(5,'C',10,'2026-01-05',NULL),(6,'A',6,'2026-01-06','checked'),(7,'C',10,'2026-01-08','archived'),(8,'D',16,'2026-01-09',NULL);CREATETABLEsite(idTEXTPRIMARYKEY,labelTEXTNOTNULL);INSERTINTOsiteVALUES('A','River'),('B','Hill'),('C','Coast');-- BEGIN EXAMPLECREATETABLEcode(idINTEGERPRIMARYKEY,labelTEXTUNIQUE);INSERTINTOcodeVALUES(1,NULL),(2,NULL),(3,'X');SELECTcount(*)ASn,count(label)ASknown,count(DISTINCTlabel)ASdistinct_knownFROMcode;-- END EXAMPLE
-- SQL-10-001: Insert a row with RETURNING-- Run against a fresh database; all inputs are synthetic.PRAGMAforeign_keys=ON;CREATETABLEsample(idINTEGERPRIMARYKEY,siteTEXTNOTNULL,valueREALNOTNULL,dayTEXTNOTNULL,noteTEXT);INSERTINTOsampleVALUES(1,'A',12,'2026-01-01',NULL),(2,'B',20,'2026-01-02','checked'),(3,'A',18,'2026-01-03',NULL),(4,'B',8,'2026-01-04','recheck'),(5,'C',10,'2026-01-05',NULL),(6,'A',6,'2026-01-06','checked'),(7,'C',10,'2026-01-08','archived'),(8,'D',16,'2026-01-09',NULL);CREATETABLEsite(idTEXTPRIMARYKEY,labelTEXTNOTNULL);INSERTINTOsiteVALUES('A','River'),('B','Hill'),('C','Coast');-- BEGIN EXAMPLEINSERTINTOsampleVALUES(9,'A',14,'2026-01-10','new')RETURNINGid,site,value;-- END EXAMPLE
-- SQL-10-002: Update one row with RETURNING-- Run against a fresh database; all inputs are synthetic.PRAGMAforeign_keys=ON;CREATETABLEsample(idINTEGERPRIMARYKEY,siteTEXTNOTNULL,valueREALNOTNULL,dayTEXTNOTNULL,noteTEXT);INSERTINTOsampleVALUES(1,'A',12,'2026-01-01',NULL),(2,'B',20,'2026-01-02','checked'),(3,'A',18,'2026-01-03',NULL),(4,'B',8,'2026-01-04','recheck'),(5,'C',10,'2026-01-05',NULL),(6,'A',6,'2026-01-06','checked'),(7,'C',10,'2026-01-08','archived'),(8,'D',16,'2026-01-09',NULL);CREATETABLEsite(idTEXTPRIMARYKEY,labelTEXTNOTNULL);INSERTINTOsiteVALUES('A','River'),('B','Hill'),('C','Coast');-- BEGIN EXAMPLEUPDATEsampleSETvalue=value+2WHEREid=2RETURNINGid,value;-- END EXAMPLE
-- SQL-10-003: Delete one row with RETURNING-- Run against a fresh database; all inputs are synthetic.PRAGMAforeign_keys=ON;CREATETABLEsample(idINTEGERPRIMARYKEY,siteTEXTNOTNULL,valueREALNOTNULL,dayTEXTNOTNULL,noteTEXT);INSERTINTOsampleVALUES(1,'A',12,'2026-01-01',NULL),(2,'B',20,'2026-01-02','checked'),(3,'A',18,'2026-01-03',NULL),(4,'B',8,'2026-01-04','recheck'),(5,'C',10,'2026-01-05',NULL),(6,'A',6,'2026-01-06','checked'),(7,'C',10,'2026-01-08','archived'),(8,'D',16,'2026-01-09',NULL);CREATETABLEsite(idTEXTPRIMARYKEY,labelTEXTNOTNULL);INSERTINTOsiteVALUES('A','River'),('B','Hill'),('C','Coast');-- BEGIN EXAMPLEDELETEFROMsampleWHEREid=8RETURNINGid,site;-- END EXAMPLE
Read the value proposed by the conflicting insert.
Complete standalone SQL and starting fixture
-- SQL-10-004: Handle a conflict with UPSERT-- Run against a fresh database; all inputs are synthetic.PRAGMAforeign_keys=ON;CREATETABLEsample(idINTEGERPRIMARYKEY,siteTEXTNOTNULL,valueREALNOTNULL,dayTEXTNOTNULL,noteTEXT);INSERTINTOsampleVALUES(1,'A',12,'2026-01-01',NULL),(2,'B',20,'2026-01-02','checked'),(3,'A',18,'2026-01-03',NULL),(4,'B',8,'2026-01-04','recheck'),(5,'C',10,'2026-01-05',NULL),(6,'A',6,'2026-01-06','checked'),(7,'C',10,'2026-01-08','archived'),(8,'D',16,'2026-01-09',NULL);CREATETABLEsite(idTEXTPRIMARYKEY,labelTEXTNOTNULL);INSERTINTOsiteVALUES('A','River'),('B','Hill'),('C','Coast');-- BEGIN EXAMPLEINSERTINTOsite(id,label)VALUES('A','River East'),('D','Desert')ONCONFLICT(id)DOUPDATESETlabel=excluded.label;SELECTid,labelFROMsiteORDERBYid;-- END EXAMPLE
-- SQL-10-005: Reuse a view definition-- Run against a fresh database; all inputs are synthetic.PRAGMAforeign_keys=ON;CREATETABLEsample(idINTEGERPRIMARYKEY,siteTEXTNOTNULL,valueREALNOTNULL,dayTEXTNOTNULL,noteTEXT);INSERTINTOsampleVALUES(1,'A',12,'2026-01-01',NULL),(2,'B',20,'2026-01-02','checked'),(3,'A',18,'2026-01-03',NULL),(4,'B',8,'2026-01-04','recheck'),(5,'C',10,'2026-01-05',NULL),(6,'A',6,'2026-01-06','checked'),(7,'C',10,'2026-01-08','archived'),(8,'D',16,'2026-01-09',NULL);CREATETABLEsite(idTEXTPRIMARYKEY,labelTEXTNOTNULL);INSERTINTOsiteVALUES('A','River'),('B','Hill'),('C','Coast');-- BEGIN EXAMPLECREATEVIEWsite_totalASSELECTsite,sum(value)AStotalFROMsampleGROUPBYsite;SELECTsite,totalFROMsite_totalORDERBYsite;-- END EXAMPLE
-- SQL-10-006: Record changes with a trigger-- Run against a fresh database; all inputs are synthetic.PRAGMAforeign_keys=ON;CREATETABLEsample(idINTEGERPRIMARYKEY,siteTEXTNOTNULL,valueREALNOTNULL,dayTEXTNOTNULL,noteTEXT);INSERTINTOsampleVALUES(1,'A',12,'2026-01-01',NULL),(2,'B',20,'2026-01-02','checked'),(3,'A',18,'2026-01-03',NULL),(4,'B',8,'2026-01-04','recheck'),(5,'C',10,'2026-01-05',NULL),(6,'A',6,'2026-01-06','checked'),(7,'C',10,'2026-01-08','archived'),(8,'D',16,'2026-01-09',NULL);CREATETABLEsite(idTEXTPRIMARYKEY,labelTEXTNOTNULL);INSERTINTOsiteVALUES('A','River'),('B','Hill'),('C','Coast');-- BEGIN EXAMPLECREATETABLEaudit(idINTEGERPRIMARYKEY,sample_idINTEGER,old_valueREAL,new_valueREAL);CREATETRIGGERsample_auditAFTERUPDATEOFvalueONsampleBEGININSERTINTOaudit(sample_id,old_value,new_value)VALUES(old.id,old.value,new.value);END;UPDATEsampleSETvalue=13WHEREid=1;SELECTsample_id,old_value,new_valueFROMauditORDERBYid;-- END EXAMPLE
-- SQL-11-001: Inspect and roll back a change-- Run against a fresh database; all inputs are synthetic.PRAGMAforeign_keys=ON;CREATETABLEsample(idINTEGERPRIMARYKEY,siteTEXTNOTNULL,valueREALNOTNULL,dayTEXTNOTNULL,noteTEXT);INSERTINTOsampleVALUES(1,'A',12,'2026-01-01',NULL),(2,'B',20,'2026-01-02','checked'),(3,'A',18,'2026-01-03',NULL),(4,'B',8,'2026-01-04','recheck'),(5,'C',10,'2026-01-05',NULL),(6,'A',6,'2026-01-06','checked'),(7,'C',10,'2026-01-08','archived'),(8,'D',16,'2026-01-09',NULL);CREATETABLEsite(idTEXTPRIMARYKEY,labelTEXTNOTNULL);INSERTINTOsiteVALUES('A','River'),('B','Hill'),('C','Coast');-- BEGIN EXAMPLEBEGIN;UPDATEsampleSETvalue=99WHEREid=1;SELECT'staged'ASphase,valueFROMsampleWHEREid=1;ROLLBACK;SELECT'after'ASphase,valueFROMsampleWHEREid=1;-- END EXAMPLE
-- SQL-11-002: Commit a group of writes-- Run against a fresh database; all inputs are synthetic.PRAGMAforeign_keys=ON;CREATETABLEsample(idINTEGERPRIMARYKEY,siteTEXTNOTNULL,valueREALNOTNULL,dayTEXTNOTNULL,noteTEXT);INSERTINTOsampleVALUES(1,'A',12,'2026-01-01',NULL),(2,'B',20,'2026-01-02','checked'),(3,'A',18,'2026-01-03',NULL),(4,'B',8,'2026-01-04','recheck'),(5,'C',10,'2026-01-05',NULL),(6,'A',6,'2026-01-06','checked'),(7,'C',10,'2026-01-08','archived'),(8,'D',16,'2026-01-09',NULL);CREATETABLEsite(idTEXTPRIMARYKEY,labelTEXTNOTNULL);INSERTINTOsiteVALUES('A','River'),('B','Hill'),('C','Coast');-- BEGIN EXAMPLEBEGIN;INSERTINTOsampleVALUES(9,'A',14,'2026-01-10','new');COMMIT;SELECTcount(*)ASn,sum(value)AStotalFROMsample;-- END EXAMPLE
Undo later work without ending the outer transaction.
RELEASE
Remove the savepoint marker.
Complete standalone SQL and starting fixture
-- SQL-11-003: Roll back to a savepoint-- Run against a fresh database; all inputs are synthetic.PRAGMAforeign_keys=ON;CREATETABLEsample(idINTEGERPRIMARYKEY,siteTEXTNOTNULL,valueREALNOTNULL,dayTEXTNOTNULL,noteTEXT);INSERTINTOsampleVALUES(1,'A',12,'2026-01-01',NULL),(2,'B',20,'2026-01-02','checked'),(3,'A',18,'2026-01-03',NULL),(4,'B',8,'2026-01-04','recheck'),(5,'C',10,'2026-01-05',NULL),(6,'A',6,'2026-01-06','checked'),(7,'C',10,'2026-01-08','archived'),(8,'D',16,'2026-01-09',NULL);CREATETABLEsite(idTEXTPRIMARYKEY,labelTEXTNOTNULL);INSERTINTOsiteVALUES('A','River'),('B','Hill'),('C','Coast');-- BEGIN EXAMPLEBEGIN;UPDATEsampleSETvalue=14WHEREid=1;SAVEPOINTlater;UPDATEsampleSETvalue=0WHEREid=2;ROLLBACKTOlater;RELEASElater;COMMIT;SELECTid,valueFROMsampleWHEREidIN(1,2)ORDERBYid;-- END EXAMPLE
-- SQL-11-004: Defer a foreign-key check until commit-- Run against a fresh database; all inputs are synthetic.PRAGMAforeign_keys=ON;CREATETABLEsample(idINTEGERPRIMARYKEY,siteTEXTNOTNULL,valueREALNOTNULL,dayTEXTNOTNULL,noteTEXT);INSERTINTOsampleVALUES(1,'A',12,'2026-01-01',NULL),(2,'B',20,'2026-01-02','checked'),(3,'A',18,'2026-01-03',NULL),(4,'B',8,'2026-01-04','recheck'),(5,'C',10,'2026-01-05',NULL),(6,'A',6,'2026-01-06','checked'),(7,'C',10,'2026-01-08','archived'),(8,'D',16,'2026-01-09',NULL);CREATETABLEsite(idTEXTPRIMARYKEY,labelTEXTNOTNULL);INSERTINTOsiteVALUES('A','River'),('B','Hill'),('C','Coast');-- BEGIN EXAMPLECREATETABLEparent(idINTEGERPRIMARYKEY);CREATETABLEchild(nameTEXT,parent_idINTEGERREFERENCESparent(id)DEFERRABLEINITIALLYDEFERRED);BEGIN;INSERTINTOchildVALUES('pending',42);INSERTINTOparentVALUES(42);COMMIT;SELECTc.name,p.idASparent_idFROMchildAScJOINparentASpONp.id=c.parent_id;-- END EXAMPLE
BEGIN IMMEDIATE requests the write transaction at the start. This one-connection example shows the statement sequence, not a concurrent-lock benchmark.
No contention or timeout measurement is claimed here.
Complete standalone SQL and starting fixture
-- SQL-11-005: Begin a write transaction immediately-- Run against a fresh database; all inputs are synthetic.PRAGMAforeign_keys=ON;CREATETABLEsample(idINTEGERPRIMARYKEY,siteTEXTNOTNULL,valueREALNOTNULL,dayTEXTNOTNULL,noteTEXT);INSERTINTOsampleVALUES(1,'A',12,'2026-01-01',NULL),(2,'B',20,'2026-01-02','checked'),(3,'A',18,'2026-01-03',NULL),(4,'B',8,'2026-01-04','recheck'),(5,'C',10,'2026-01-05',NULL),(6,'A',6,'2026-01-06','checked'),(7,'C',10,'2026-01-08','archived'),(8,'D',16,'2026-01-09',NULL);CREATETABLEsite(idTEXTPRIMARYKEY,labelTEXTNOTNULL);INSERTINTOsiteVALUES('A','River'),('B','Hill'),('C','Coast');-- BEGIN EXAMPLEBEGINIMMEDIATE;UPDATEsampleSETvalue=21WHEREid=1;COMMIT;SELECTid,valueFROMsampleWHEREid=1;-- END EXAMPLE
WAL does not provide multiple simultaneous writers.
Portable download
The exported data snapshot uses rollback-journal mode so it opens as one file.
Complete standalone SQL and starting fixture
-- SQL-11-006: Select write-ahead logging-- Run against a fresh database; all inputs are synthetic.PRAGMAforeign_keys=ON;CREATETABLEsample(idINTEGERPRIMARYKEY,siteTEXTNOTNULL,valueREALNOTNULL,dayTEXTNOTNULL,noteTEXT);INSERTINTOsampleVALUES(1,'A',12,'2026-01-01',NULL),(2,'B',20,'2026-01-02','checked'),(3,'A',18,'2026-01-03',NULL),(4,'B',8,'2026-01-04','recheck'),(5,'C',10,'2026-01-05',NULL),(6,'A',6,'2026-01-06','checked'),(7,'C',10,'2026-01-08','archived'),(8,'D',16,'2026-01-09',NULL);CREATETABLEsite(idTEXTPRIMARYKEY,labelTEXTNOTNULL);INSERTINTOsiteVALUES('A','River'),('B','Hill'),('C','Coast');-- BEGIN EXAMPLEPRAGMAjournal_mode=WAL;BEGIN;UPDATEsampleSETvalue=value+1WHEREid=1;COMMIT;SELECTid,valueFROMsampleWHEREid=1;-- END EXAMPLE
Read this as a diagnostic, not a stable application interface.
Complete standalone SQL and starting fixture
-- SQL-12-001: Read a table-scan plan-- Run against a fresh database; all inputs are synthetic.PRAGMAforeign_keys=ON;CREATETABLEsample(idINTEGERPRIMARYKEY,siteTEXTNOTNULL,valueREALNOTNULL,dayTEXTNOTNULL,noteTEXT);INSERTINTOsampleVALUES(1,'A',12,'2026-01-01',NULL),(2,'B',20,'2026-01-02','checked'),(3,'A',18,'2026-01-03',NULL),(4,'B',8,'2026-01-04','recheck'),(5,'C',10,'2026-01-05',NULL),(6,'A',6,'2026-01-06','checked'),(7,'C',10,'2026-01-08','archived'),(8,'D',16,'2026-01-09',NULL);CREATETABLEsite(idTEXTPRIMARYKEY,labelTEXTNOTNULL);INSERTINTOsiteVALUES('A','River'),('B','Hill'),('C','Coast');-- BEGIN EXAMPLEEXPLAINQUERYPLANSELECTid,site,valueFROMsampleWHEREsite='A';-- END EXAMPLE
-- SQL-12-002: Add a selective index-- Run against a fresh database; all inputs are synthetic.PRAGMAforeign_keys=ON;CREATETABLEsample(idINTEGERPRIMARYKEY,siteTEXTNOTNULL,valueREALNOTNULL,dayTEXTNOTNULL,noteTEXT);INSERTINTOsampleVALUES(1,'A',12,'2026-01-01',NULL),(2,'B',20,'2026-01-02','checked'),(3,'A',18,'2026-01-03',NULL),(4,'B',8,'2026-01-04','recheck'),(5,'C',10,'2026-01-05',NULL),(6,'A',6,'2026-01-06','checked'),(7,'C',10,'2026-01-08','archived'),(8,'D',16,'2026-01-09',NULL);CREATETABLEsite(idTEXTPRIMARYKEY,labelTEXTNOTNULL);INSERTINTOsiteVALUES('A','River'),('B','Hill'),('C','Coast');-- BEGIN EXAMPLECREATEINDEXix_siteONsample(site);EXPLAINQUERYPLANSELECTid,site,valueFROMsampleWHEREsite='A';-- END EXAMPLE
SEARCH sample USING COVERING INDEX ix_site_value (site=?)
SQLite · exit 0
Clause or feature
Meaning
Composite key
Store site followed by value.
COVERING
The query does not need additional table fields.
Complete standalone SQL and starting fixture
-- SQL-12-003: Use a covering index-- Run against a fresh database; all inputs are synthetic.PRAGMAforeign_keys=ON;CREATETABLEsample(idINTEGERPRIMARYKEY,siteTEXTNOTNULL,valueREALNOTNULL,dayTEXTNOTNULL,noteTEXT);INSERTINTOsampleVALUES(1,'A',12,'2026-01-01',NULL),(2,'B',20,'2026-01-02','checked'),(3,'A',18,'2026-01-03',NULL),(4,'B',8,'2026-01-04','recheck'),(5,'C',10,'2026-01-05',NULL),(6,'A',6,'2026-01-06','checked'),(7,'C',10,'2026-01-08','archived'),(8,'D',16,'2026-01-09',NULL);CREATETABLEsite(idTEXTPRIMARYKEY,labelTEXTNOTNULL);INSERTINTOsiteVALUES('A','River'),('B','Hill'),('C','Coast');-- BEGIN EXAMPLECREATEINDEXix_site_valueONsample(site,value);EXPLAINQUERYPLANSELECTsite,valueFROMsampleWHEREsite='A'ORDERBYvalue;-- END EXAMPLE
SEARCH sample USING COVERING INDEX ix_site_day (site=? AND day>?)
SQLite · exit 0
Clause or feature
Meaning
Leading equality
Fix site before traversing the day range.
Range and order
The second index column supplies the ordered range.
Complete standalone SQL and starting fixture
-- SQL-12-004: Use a composite index prefix and range-- Run against a fresh database; all inputs are synthetic.PRAGMAforeign_keys=ON;CREATETABLEsample(idINTEGERPRIMARYKEY,siteTEXTNOTNULL,valueREALNOTNULL,dayTEXTNOTNULL,noteTEXT);INSERTINTOsampleVALUES(1,'A',12,'2026-01-01',NULL),(2,'B',20,'2026-01-02','checked'),(3,'A',18,'2026-01-03',NULL),(4,'B',8,'2026-01-04','recheck'),(5,'C',10,'2026-01-05',NULL),(6,'A',6,'2026-01-06','checked'),(7,'C',10,'2026-01-08','archived'),(8,'D',16,'2026-01-09',NULL);CREATETABLEsite(idTEXTPRIMARYKEY,labelTEXTNOTNULL);INSERTINTOsiteVALUES('A','River'),('B','Hill'),('C','Coast');-- BEGIN EXAMPLECREATEINDEXix_site_dayONsample(site,day);EXPLAINQUERYPLANSELECTid,dayFROMsampleWHEREsite='A'ANDday>='2026-01-03'ORDERBYday;-- END EXAMPLE
-- SQL-12-005: Index a subset of rows-- Run against a fresh database; all inputs are synthetic.PRAGMAforeign_keys=ON;CREATETABLEsample(idINTEGERPRIMARYKEY,siteTEXTNOTNULL,valueREALNOTNULL,dayTEXTNOTNULL,noteTEXT);INSERTINTOsampleVALUES(1,'A',12,'2026-01-01',NULL),(2,'B',20,'2026-01-02','checked'),(3,'A',18,'2026-01-03',NULL),(4,'B',8,'2026-01-04','recheck'),(5,'C',10,'2026-01-05',NULL),(6,'A',6,'2026-01-06','checked'),(7,'C',10,'2026-01-08','archived'),(8,'D',16,'2026-01-09',NULL);CREATETABLEsite(idTEXTPRIMARYKEY,labelTEXTNOTNULL);INSERTINTOsiteVALUES('A','River'),('B','Hill'),('C','Coast');-- BEGIN EXAMPLECREATEINDEXix_missingONsample(day)WHEREnoteISNULL;EXPLAINQUERYPLANSELECTid,dayFROMsampleWHEREnoteISNULLANDday>='2026-01-03'ORDERBYday;-- END EXAMPLE
-- SQL-12-006: Index an expression-- Run against a fresh database; all inputs are synthetic.PRAGMAforeign_keys=ON;CREATETABLEsample(idINTEGERPRIMARYKEY,siteTEXTNOTNULL,valueREALNOTNULL,dayTEXTNOTNULL,noteTEXT);INSERTINTOsampleVALUES(1,'A',12,'2026-01-01',NULL),(2,'B',20,'2026-01-02','checked'),(3,'A',18,'2026-01-03',NULL),(4,'B',8,'2026-01-04','recheck'),(5,'C',10,'2026-01-05',NULL),(6,'A',6,'2026-01-06','checked'),(7,'C',10,'2026-01-08','archived'),(8,'D',16,'2026-01-09',NULL);CREATETABLEsite(idTEXTPRIMARYKEY,labelTEXTNOTNULL);INSERTINTOsiteVALUES('A','River'),('B','Hill'),('C','Coast');-- BEGIN EXAMPLECREATEINDEXix_lower_labelONsite(lower(label));EXPLAINQUERYPLANSELECTid,labelFROMsiteWHERElower(label)='river';-- END EXAMPLE
-- SQL-13-001: Extract typed JSON values-- Run against a fresh database; all inputs are synthetic.PRAGMAforeign_keys=ON;CREATETABLEsample(idINTEGERPRIMARYKEY,siteTEXTNOTNULL,valueREALNOTNULL,dayTEXTNOTNULL,noteTEXT);INSERTINTOsampleVALUES(1,'A',12,'2026-01-01',NULL),(2,'B',20,'2026-01-02','checked'),(3,'A',18,'2026-01-03',NULL),(4,'B',8,'2026-01-04','recheck'),(5,'C',10,'2026-01-05',NULL),(6,'A',6,'2026-01-06','checked'),(7,'C',10,'2026-01-08','archived'),(8,'D',16,'2026-01-09',NULL);CREATETABLEsite(idTEXTPRIMARYKEY,labelTEXTNOTNULL);INSERTINTOsiteVALUES('A','River'),('B','Hill'),('C','Coast');-- BEGIN EXAMPLEWITHdoc(body)AS(VALUES('{"site":"A","count":3,"checked":true,"missing":null}'))SELECTjson_extract(body,'$.site')ASsite,json_extract(body,'$.count')ASn,json_type(body,'$.checked')ASchecked_type,json_type(body,'$.missing')ASmissing_typeFROMdoc;-- END EXAMPLE
-- SQL-13-002: Compare JSON text and SQL scalars-- Run against a fresh database; all inputs are synthetic.PRAGMAforeign_keys=ON;CREATETABLEsample(idINTEGERPRIMARYKEY,siteTEXTNOTNULL,valueREALNOTNULL,dayTEXTNOTNULL,noteTEXT);INSERTINTOsampleVALUES(1,'A',12,'2026-01-01',NULL),(2,'B',20,'2026-01-02','checked'),(3,'A',18,'2026-01-03',NULL),(4,'B',8,'2026-01-04','recheck'),(5,'C',10,'2026-01-05',NULL),(6,'A',6,'2026-01-06','checked'),(7,'C',10,'2026-01-08','archived'),(8,'D',16,'2026-01-09',NULL);CREATETABLEsite(idTEXTPRIMARYKEY,labelTEXTNOTNULL);INSERTINTOsiteVALUES('A','River'),('B','Hill'),('C','Coast');-- BEGIN EXAMPLEWITHdoc(body)AS(VALUES('{"n":4,"empty":null}'))SELECTbody->'$.n'ASjson_value,body->>'$.n'ASsql_value,body->>'$.empty'ASempty,typeof(body->'$.n')ASjson_type,typeof(body->>'$.n')ASsql_typeFROMdoc;-- END EXAMPLE
-- SQL-13-003: Expand a JSON array into rows-- Run against a fresh database; all inputs are synthetic.PRAGMAforeign_keys=ON;CREATETABLEsample(idINTEGERPRIMARYKEY,siteTEXTNOTNULL,valueREALNOTNULL,dayTEXTNOTNULL,noteTEXT);INSERTINTOsampleVALUES(1,'A',12,'2026-01-01',NULL),(2,'B',20,'2026-01-02','checked'),(3,'A',18,'2026-01-03',NULL),(4,'B',8,'2026-01-04','recheck'),(5,'C',10,'2026-01-05',NULL),(6,'A',6,'2026-01-06','checked'),(7,'C',10,'2026-01-08','archived'),(8,'D',16,'2026-01-09',NULL);CREATETABLEsite(idTEXTPRIMARYKEY,labelTEXTNOTNULL);INSERTINTOsiteVALUES('A','River'),('B','Hill'),('C','Coast');-- BEGIN EXAMPLESELECTCAST(keyASINTEGER)ASposition,value,typeFROMjson_each('["A","B",null]')ORDERBYposition;-- END EXAMPLE
-- SQL-13-004: Modify and merge JSON objects-- Run against a fresh database; all inputs are synthetic.PRAGMAforeign_keys=ON;CREATETABLEsample(idINTEGERPRIMARYKEY,siteTEXTNOTNULL,valueREALNOTNULL,dayTEXTNOTNULL,noteTEXT);INSERTINTOsampleVALUES(1,'A',12,'2026-01-01',NULL),(2,'B',20,'2026-01-02','checked'),(3,'A',18,'2026-01-03',NULL),(4,'B',8,'2026-01-04','recheck'),(5,'C',10,'2026-01-05',NULL),(6,'A',6,'2026-01-06','checked'),(7,'C',10,'2026-01-08','archived'),(8,'D',16,'2026-01-09',NULL);CREATETABLEsite(idTEXTPRIMARYKEY,labelTEXTNOTNULL);INSERTINTOsiteVALUES('A','River'),('B','Hill'),('C','Coast');-- BEGIN EXAMPLESELECTjson_set('{"site":"A","count":3}','$.count',4,'$.checked',json('true'))ASupdated,json_patch('{"site":"A","keep":1}','{"site":"B","keep":null}')ASpatched;-- END EXAMPLE
-- SQL-13-005: Aggregate ordered values into JSON-- Run against a fresh database; all inputs are synthetic.PRAGMAforeign_keys=ON;CREATETABLEsample(idINTEGERPRIMARYKEY,siteTEXTNOTNULL,valueREALNOTNULL,dayTEXTNOTNULL,noteTEXT);INSERTINTOsampleVALUES(1,'A',12,'2026-01-01',NULL),(2,'B',20,'2026-01-02','checked'),(3,'A',18,'2026-01-03',NULL),(4,'B',8,'2026-01-04','recheck'),(5,'C',10,'2026-01-05',NULL),(6,'A',6,'2026-01-06','checked'),(7,'C',10,'2026-01-08','archived'),(8,'D',16,'2026-01-09',NULL);CREATETABLEsite(idTEXTPRIMARYKEY,labelTEXTNOTNULL);INSERTINTOsiteVALUES('A','River'),('B','Hill'),('C','Coast');-- BEGIN EXAMPLESELECTjson_group_array(siteORDERBYsite)ASsitesFROM(SELECTDISTINCTsiteFROMsample);-- END EXAMPLE
-- SQL-13-006: Store SQLite JSONB-- Run against a fresh database; all inputs are synthetic.PRAGMAforeign_keys=ON;CREATETABLEsample(idINTEGERPRIMARYKEY,siteTEXTNOTNULL,valueREALNOTNULL,dayTEXTNOTNULL,noteTEXT);INSERTINTOsampleVALUES(1,'A',12,'2026-01-01',NULL),(2,'B',20,'2026-01-02','checked'),(3,'A',18,'2026-01-03',NULL),(4,'B',8,'2026-01-04','recheck'),(5,'C',10,'2026-01-05',NULL),(6,'A',6,'2026-01-06','checked'),(7,'C',10,'2026-01-08','archived'),(8,'D',16,'2026-01-09',NULL);CREATETABLEsite(idTEXTPRIMARYKEY,labelTEXTNOTNULL);INSERTINTOsiteVALUES('A','River'),('B','Hill'),('C','Coast');-- BEGIN EXAMPLESELECTtypeof(jsonb('{"site":"A","n":3}'))ASstorage,json(jsonb('{"site":"A","n":3}'))AStext_json,json_extract(jsonb('{"site":"A","n":3}'),'$.n')ASn;-- END EXAMPLE
CREATEVIRTUALTABLEdocsUSINGfts5(title,body);INSERTINTOdocs(rowid,title,body)VALUES(1,'River survey','pottery fragments near the river bank'),(2,'Hill archive','bronze tools from the hill settlement'),(3,'Coastal notes','pottery and shells from the coastal survey'),(4,'River laboratory','pottery analysis in the laboratory');SELECTrowid,titleFROMdocsWHEREdocsMATCH'pottery'ORDERBYrowid;
Actual SQLite result
Result 1 · 3 rows
rowid
title
1
River survey
3
Coastal notes
4
River laboratory
SQLite · exit 0
Clause or feature
Meaning
USING fts5
Create the full-text virtual table.
MATCH
Apply full-text query syntax.
Fixture
The remaining chapter examples use this same four-document corpus.
Complete standalone SQL and starting fixture
-- SQL-14-001: Search terms with FTS5-- Run against a fresh database; all inputs are synthetic.PRAGMAforeign_keys=ON;CREATETABLEsample(idINTEGERPRIMARYKEY,siteTEXTNOTNULL,valueREALNOTNULL,dayTEXTNOTNULL,noteTEXT);INSERTINTOsampleVALUES(1,'A',12,'2026-01-01',NULL),(2,'B',20,'2026-01-02','checked'),(3,'A',18,'2026-01-03',NULL),(4,'B',8,'2026-01-04','recheck'),(5,'C',10,'2026-01-05',NULL),(6,'A',6,'2026-01-06','checked'),(7,'C',10,'2026-01-08','archived'),(8,'D',16,'2026-01-09',NULL);CREATETABLEsite(idTEXTPRIMARYKEY,labelTEXTNOTNULL);INSERTINTOsiteVALUES('A','River'),('B','Hill'),('C','Coast');-- BEGIN EXAMPLECREATEVIRTUALTABLEdocsUSINGfts5(title,body);INSERTINTOdocs(rowid,title,body)VALUES(1,'River survey','pottery fragments near the river bank'),(2,'Hill archive','bronze tools from the hill settlement'),(3,'Coastal notes','pottery and shells from the coastal survey'),(4,'River laboratory','pottery analysis in the laboratory');SELECTrowid,titleFROMdocsWHEREdocsMATCH'pottery'ORDERBYrowid;-- END EXAMPLE
-- SQL-14-002: Search an exact phrase-- Run against a fresh database; all inputs are synthetic.PRAGMAforeign_keys=ON;CREATETABLEsample(idINTEGERPRIMARYKEY,siteTEXTNOTNULL,valueREALNOTNULL,dayTEXTNOTNULL,noteTEXT);INSERTINTOsampleVALUES(1,'A',12,'2026-01-01',NULL),(2,'B',20,'2026-01-02','checked'),(3,'A',18,'2026-01-03',NULL),(4,'B',8,'2026-01-04','recheck'),(5,'C',10,'2026-01-05',NULL),(6,'A',6,'2026-01-06','checked'),(7,'C',10,'2026-01-08','archived'),(8,'D',16,'2026-01-09',NULL);CREATETABLEsite(idTEXTPRIMARYKEY,labelTEXTNOTNULL);INSERTINTOsiteVALUES('A','River'),('B','Hill'),('C','Coast');CREATEVIRTUALTABLEdocsUSINGfts5(title,body);INSERTINTOdocs(rowid,title,body)VALUES(1,'River survey','pottery fragments near the river bank'),(2,'Hill archive','bronze tools from the hill settlement'),(3,'Coastal notes','pottery and shells from the coastal survey'),(4,'River laboratory','pottery analysis in the laboratory');-- BEGIN EXAMPLESELECTrowid,titleFROMdocsWHEREdocsMATCH'"river bank"'ORDERBYrowid;-- END EXAMPLE
SELECTrowid,titleFROMdocsWHEREdocsMATCH'pot* NOT laboratory'ORDERBYrowid;
Actual SQLite result
Result 1 · 2 rows
rowid
title
1
River survey
3
Coastal notes
SQLite · exit 0
Clause or feature
Meaning
pot*
Match indexed tokens beginning with pot.
NOT laboratory
Exclude that term from either indexed column.
Complete standalone SQL and starting fixture
-- SQL-14-003: Combine a prefix and an exclusion-- Run against a fresh database; all inputs are synthetic.PRAGMAforeign_keys=ON;CREATETABLEsample(idINTEGERPRIMARYKEY,siteTEXTNOTNULL,valueREALNOTNULL,dayTEXTNOTNULL,noteTEXT);INSERTINTOsampleVALUES(1,'A',12,'2026-01-01',NULL),(2,'B',20,'2026-01-02','checked'),(3,'A',18,'2026-01-03',NULL),(4,'B',8,'2026-01-04','recheck'),(5,'C',10,'2026-01-05',NULL),(6,'A',6,'2026-01-06','checked'),(7,'C',10,'2026-01-08','archived'),(8,'D',16,'2026-01-09',NULL);CREATETABLEsite(idTEXTPRIMARYKEY,labelTEXTNOTNULL);INSERTINTOsiteVALUES('A','River'),('B','Hill'),('C','Coast');CREATEVIRTUALTABLEdocsUSINGfts5(title,body);INSERTINTOdocs(rowid,title,body)VALUES(1,'River survey','pottery fragments near the river bank'),(2,'Hill archive','bronze tools from the hill settlement'),(3,'Coastal notes','pottery and shells from the coastal survey'),(4,'River laboratory','pottery analysis in the laboratory');-- BEGIN EXAMPLESELECTrowid,titleFROMdocsWHEREdocsMATCH'pot* NOT laboratory'ORDERBYrowid;-- END EXAMPLE
-- SQL-14-004: Order matches by BM25-- Run against a fresh database; all inputs are synthetic.PRAGMAforeign_keys=ON;CREATETABLEsample(idINTEGERPRIMARYKEY,siteTEXTNOTNULL,valueREALNOTNULL,dayTEXTNOTNULL,noteTEXT);INSERTINTOsampleVALUES(1,'A',12,'2026-01-01',NULL),(2,'B',20,'2026-01-02','checked'),(3,'A',18,'2026-01-03',NULL),(4,'B',8,'2026-01-04','recheck'),(5,'C',10,'2026-01-05',NULL),(6,'A',6,'2026-01-06','checked'),(7,'C',10,'2026-01-08','archived'),(8,'D',16,'2026-01-09',NULL);CREATETABLEsite(idTEXTPRIMARYKEY,labelTEXTNOTNULL);INSERTINTOsiteVALUES('A','River'),('B','Hill'),('C','Coast');CREATEVIRTUALTABLEdocsUSINGfts5(title,body);INSERTINTOdocs(rowid,title,body)VALUES(1,'River survey','pottery fragments near the river bank'),(2,'Hill archive','bronze tools from the hill settlement'),(3,'Coastal notes','pottery and shells from the coastal survey'),(4,'River laboratory','pottery analysis in the laboratory');-- BEGIN EXAMPLESELECTrowid,titleFROMdocsWHEREdocsMATCH'pottery'ORDERBYbm25(docs),rowid;-- END EXAMPLE
Surround each matching token with square brackets.
Complete standalone SQL and starting fixture
-- SQL-14-005: Highlight matching tokens-- Run against a fresh database; all inputs are synthetic.PRAGMAforeign_keys=ON;CREATETABLEsample(idINTEGERPRIMARYKEY,siteTEXTNOTNULL,valueREALNOTNULL,dayTEXTNOTNULL,noteTEXT);INSERTINTOsampleVALUES(1,'A',12,'2026-01-01',NULL),(2,'B',20,'2026-01-02','checked'),(3,'A',18,'2026-01-03',NULL),(4,'B',8,'2026-01-04','recheck'),(5,'C',10,'2026-01-05',NULL),(6,'A',6,'2026-01-06','checked'),(7,'C',10,'2026-01-08','archived'),(8,'D',16,'2026-01-09',NULL);CREATETABLEsite(idTEXTPRIMARYKEY,labelTEXTNOTNULL);INSERTINTOsiteVALUES('A','River'),('B','Hill'),('C','Coast');CREATEVIRTUALTABLEdocsUSINGfts5(title,body);INSERTINTOdocs(rowid,title,body)VALUES(1,'River survey','pottery fragments near the river bank'),(2,'Hill archive','bronze tools from the hill settlement'),(3,'Coastal notes','pottery and shells from the coastal survey'),(4,'River laboratory','pottery analysis in the laboratory');-- BEGIN EXAMPLESELECTrowid,highlight(docs,1,'[',']')ASexcerptFROMdocsWHEREdocsMATCH'pottery'ORDERBYrowid;-- END EXAMPLE
SELECTrowid,titleFROMdocsWHEREdocsMATCH'title:river AND body:analysis'ORDERBYrowid;
Actual SQLite result
Result 1 · 1 rows
rowid
title
4
River laboratory
SQLite · exit 0
Clause or feature
Meaning
title:river
Require a title token.
body:analysis
Require a body token in the same document.
Complete standalone SQL and starting fixture
-- SQL-14-006: Restrict a full-text query by column-- Run against a fresh database; all inputs are synthetic.PRAGMAforeign_keys=ON;CREATETABLEsample(idINTEGERPRIMARYKEY,siteTEXTNOTNULL,valueREALNOTNULL,dayTEXTNOTNULL,noteTEXT);INSERTINTOsampleVALUES(1,'A',12,'2026-01-01',NULL),(2,'B',20,'2026-01-02','checked'),(3,'A',18,'2026-01-03',NULL),(4,'B',8,'2026-01-04','recheck'),(5,'C',10,'2026-01-05',NULL),(6,'A',6,'2026-01-06','checked'),(7,'C',10,'2026-01-08','archived'),(8,'D',16,'2026-01-09',NULL);CREATETABLEsite(idTEXTPRIMARYKEY,labelTEXTNOTNULL);INSERTINTOsiteVALUES('A','River'),('B','Hill'),('C','Coast');CREATEVIRTUALTABLEdocsUSINGfts5(title,body);INSERTINTOdocs(rowid,title,body)VALUES(1,'River survey','pottery fragments near the river bank'),(2,'Hill archive','bronze tools from the hill settlement'),(3,'Coastal notes','pottery and shells from the coastal survey'),(4,'River laboratory','pottery analysis in the laboratory');-- BEGIN EXAMPLESELECTrowid,titleFROMdocsWHEREdocsMATCH'title:river AND body:analysis'ORDERBYrowid;-- END EXAMPLE
-- SQL-15-001: Inspect the schema catalog-- Run against a fresh database; all inputs are synthetic.PRAGMAforeign_keys=ON;CREATETABLEsample(idINTEGERPRIMARYKEY,siteTEXTNOTNULL,valueREALNOTNULL,dayTEXTNOTNULL,noteTEXT);INSERTINTOsampleVALUES(1,'A',12,'2026-01-01',NULL),(2,'B',20,'2026-01-02','checked'),(3,'A',18,'2026-01-03',NULL),(4,'B',8,'2026-01-04','recheck'),(5,'C',10,'2026-01-05',NULL),(6,'A',6,'2026-01-06','checked'),(7,'C',10,'2026-01-08','archived'),(8,'D',16,'2026-01-09',NULL);CREATETABLEsite(idTEXTPRIMARYKEY,labelTEXTNOTNULL);INSERTINTOsiteVALUES('A','River'),('B','Hill'),('C','Coast');-- BEGIN EXAMPLESELECTname,typeFROMsqlite_schemaWHEREtype='table'ORDERBYname;-- END EXAMPLE
Table-valued PRAGMAs let metadata participate in ordinary SELECT statements. A rowid-alias primary key is reported differently from an explicit NOT NULL column.
Expose column metadata as a table-valued function.
required flag
Report the declared NOT NULL property.
Complete standalone SQL and starting fixture
-- SQL-15-002: Query column metadata as a table-- Run against a fresh database; all inputs are synthetic.PRAGMAforeign_keys=ON;CREATETABLEsample(idINTEGERPRIMARYKEY,siteTEXTNOTNULL,valueREALNOTNULL,dayTEXTNOTNULL,noteTEXT);INSERTINTOsampleVALUES(1,'A',12,'2026-01-01',NULL),(2,'B',20,'2026-01-02','checked'),(3,'A',18,'2026-01-03',NULL),(4,'B',8,'2026-01-04','recheck'),(5,'C',10,'2026-01-05',NULL),(6,'A',6,'2026-01-06','checked'),(7,'C',10,'2026-01-08','archived'),(8,'D',16,'2026-01-09',NULL);CREATETABLEsite(idTEXTPRIMARYKEY,labelTEXTNOTNULL);INSERTINTOsiteVALUES('A','River'),('B','Hill'),('C','Coast');-- BEGIN EXAMPLESELECTname,type,"notnull"ASrequiredFROMpragma_table_info('sample')ORDERBYcid;-- END EXAMPLE
The table-valued foreign-key check returns violations. The starting fixture deliberately leaves sample.site unconstrained, so missing lookup D is not a declared foreign-key violation.
An unconstrained lookup gap is a separate data-quality question.
Complete standalone SQL and starting fixture
-- SQL-15-003: Check declared foreign-key relationships-- Run against a fresh database; all inputs are synthetic.PRAGMAforeign_keys=ON;CREATETABLEsample(idINTEGERPRIMARYKEY,siteTEXTNOTNULL,valueREALNOTNULL,dayTEXTNOTNULL,noteTEXT);INSERTINTOsampleVALUES(1,'A',12,'2026-01-01',NULL),(2,'B',20,'2026-01-02','checked'),(3,'A',18,'2026-01-03',NULL),(4,'B',8,'2026-01-04','recheck'),(5,'C',10,'2026-01-05',NULL),(6,'A',6,'2026-01-06','checked'),(7,'C',10,'2026-01-08','archived'),(8,'D',16,'2026-01-09',NULL);CREATETABLEsite(idTEXTPRIMARYKEY,labelTEXTNOTNULL);INSERTINTOsiteVALUES('A','River'),('B','Hill'),('C','Coast');-- BEGIN EXAMPLESELECTcount(*)ASviolationsFROMpragma_foreign_key_check;-- END EXAMPLE
Database consistency and domain correctness are different checks.
Complete standalone SQL and starting fixture
-- SQL-15-004: Run a database consistency check-- Run against a fresh database; all inputs are synthetic.PRAGMAforeign_keys=ON;CREATETABLEsample(idINTEGERPRIMARYKEY,siteTEXTNOTNULL,valueREALNOTNULL,dayTEXTNOTNULL,noteTEXT);INSERTINTOsampleVALUES(1,'A',12,'2026-01-01',NULL),(2,'B',20,'2026-01-02','checked'),(3,'A',18,'2026-01-03',NULL),(4,'B',8,'2026-01-04','recheck'),(5,'C',10,'2026-01-05',NULL),(6,'A',6,'2026-01-06','checked'),(7,'C',10,'2026-01-08','archived'),(8,'D',16,'2026-01-09',NULL);CREATETABLEsite(idTEXTPRIMARYKEY,labelTEXTNOTNULL);INSERTINTOsiteVALUES('A','River'),('B','Hill'),('C','Coast');-- BEGIN EXAMPLEPRAGMAquick_check;-- END EXAMPLE
-- SQL-15-005: Inspect affected-row counts-- Run against a fresh database; all inputs are synthetic.PRAGMAforeign_keys=ON;CREATETABLEsample(idINTEGERPRIMARYKEY,siteTEXTNOTNULL,valueREALNOTNULL,dayTEXTNOTNULL,noteTEXT);INSERTINTOsampleVALUES(1,'A',12,'2026-01-01',NULL),(2,'B',20,'2026-01-02','checked'),(3,'A',18,'2026-01-03',NULL),(4,'B',8,'2026-01-04','recheck'),(5,'C',10,'2026-01-05',NULL),(6,'A',6,'2026-01-06','checked'),(7,'C',10,'2026-01-08','archived'),(8,'D',16,'2026-01-09',NULL);CREATETABLEsite(idTEXTPRIMARYKEY,labelTEXTNOTNULL);INSERTINTOsiteVALUES('A','River'),('B','Hill'),('C','Coast');-- BEGIN EXAMPLEUPDATEsampleSETnote='none'WHEREid=-1;SELECTchanges()ASaffected;INSERTINTOsampleVALUES(9,'A',14,'2026-01-10','new');SELECTchanges()ASaffected;-- END EXAMPLE
The target file must not already contain a database.
Complete standalone SQL and starting fixture
-- SQL-15-006: Create and verify a database copy-- Run against a fresh database; all inputs are synthetic.PRAGMAforeign_keys=ON;CREATETABLEsample(idINTEGERPRIMARYKEY,siteTEXTNOTNULL,valueREALNOTNULL,dayTEXTNOTNULL,noteTEXT);INSERTINTOsampleVALUES(1,'A',12,'2026-01-01',NULL),(2,'B',20,'2026-01-02','checked'),(3,'A',18,'2026-01-03',NULL),(4,'B',8,'2026-01-04','recheck'),(5,'C',10,'2026-01-05',NULL),(6,'A',6,'2026-01-06','checked'),(7,'C',10,'2026-01-08','archived'),(8,'D',16,'2026-01-09',NULL);CREATETABLEsite(idTEXTPRIMARYKEY,labelTEXTNOTNULL);INSERTINTOsiteVALUES('A','River'),('B','Hill'),('C','Coast');-- BEGIN EXAMPLEVACUUMINTO'snapshot.sqlite3';ATTACHDATABASE'snapshot.sqlite3'ASsnapshot;SELECT(SELECTcount(*)FROMmain.sample)ASoriginal_rows,(SELECTcount(*)FROMsnapshot.sample)AScopied_rows;DETACHDATABASEsnapshot;-- END EXAMPLE
-- SQL-16-001: Pivot a small categorical summary-- Run against a fresh database; all inputs are synthetic.PRAGMAforeign_keys=ON;CREATETABLEsample(idINTEGERPRIMARYKEY,siteTEXTNOTNULL,valueREALNOTNULL,dayTEXTNOTNULL,noteTEXT);INSERTINTOsampleVALUES(1,'A',12,'2026-01-01',NULL),(2,'B',20,'2026-01-02','checked'),(3,'A',18,'2026-01-03',NULL),(4,'B',8,'2026-01-04','recheck'),(5,'C',10,'2026-01-05',NULL),(6,'A',6,'2026-01-06','checked'),(7,'C',10,'2026-01-08','archived'),(8,'D',16,'2026-01-09',NULL);CREATETABLEsite(idTEXTPRIMARYKEY,labelTEXTNOTNULL);INSERTINTOsiteVALUES('A','River'),('B','Hill'),('C','Coast');-- BEGIN EXAMPLESELECTsum(CASEWHENsite='A'THENvalueELSE0END)ASa,sum(CASEWHENsite='B'THENvalueELSE0END)ASb,sum(CASEWHENsite='C'THENvalueELSE0END)ASc,sum(CASEWHENsite='D'THENvalueELSE0END)ASdFROMsample;-- END EXAMPLE
-- SQL-16-002: Find islands of consecutive dates-- Run against a fresh database; all inputs are synthetic.PRAGMAforeign_keys=ON;CREATETABLEsample(idINTEGERPRIMARYKEY,siteTEXTNOTNULL,valueREALNOTNULL,dayTEXTNOTNULL,noteTEXT);INSERTINTOsampleVALUES(1,'A',12,'2026-01-01',NULL),(2,'B',20,'2026-01-02','checked'),(3,'A',18,'2026-01-03',NULL),(4,'B',8,'2026-01-04','recheck'),(5,'C',10,'2026-01-05',NULL),(6,'A',6,'2026-01-06','checked'),(7,'C',10,'2026-01-08','archived'),(8,'D',16,'2026-01-09',NULL);CREATETABLEsite(idTEXTPRIMARYKEY,labelTEXTNOTNULL);INSERTINTOsiteVALUES('A','River'),('B','Hill'),('C','Coast');-- BEGIN EXAMPLEWITHdistinct_daysAS(SELECTDISTINCTdayFROMsample),keyedAS(SELECTday,julianday(day)-row_number()OVER(ORDERBYday)ASkFROMdistinct_days)SELECTmin(day)ASstart,max(day)ASend,count(*)ASdaysFROMkeyedGROUPBYkORDERBYstart;-- END EXAMPLE
Filter a window result in a subsequent query stage.
At most two
Sites with fewer observations return fewer rows.
Complete standalone SQL and starting fixture
-- SQL-16-003: Return the top two within each group-- Run against a fresh database; all inputs are synthetic.PRAGMAforeign_keys=ON;CREATETABLEsample(idINTEGERPRIMARYKEY,siteTEXTNOTNULL,valueREALNOTNULL,dayTEXTNOTNULL,noteTEXT);INSERTINTOsampleVALUES(1,'A',12,'2026-01-01',NULL),(2,'B',20,'2026-01-02','checked'),(3,'A',18,'2026-01-03',NULL),(4,'B',8,'2026-01-04','recheck'),(5,'C',10,'2026-01-05',NULL),(6,'A',6,'2026-01-06','checked'),(7,'C',10,'2026-01-08','archived'),(8,'D',16,'2026-01-09',NULL);CREATETABLEsite(idTEXTPRIMARYKEY,labelTEXTNOTNULL);INSERTINTOsiteVALUES('A','River'),('B','Hill'),('C','Coast');-- BEGIN EXAMPLEWITHrankedAS(SELECTid,site,value,row_number()OVER(PARTITIONBYsiteORDERBYvalueDESC,id)ASpositionFROMsample)SELECTid,site,valueFROMrankedWHEREposition<=2ORDERBYsite,position;-- END EXAMPLE
This separate incoming table defines batch plus code as its business key. Keep the earliest row for that key; do not infer that equal observation values are duplicates.
Deduplication depends on the declared meaning of batch and code.
Earliest id
Choose the retained row deterministically.
Complete standalone SQL and starting fixture
-- SQL-16-004: Deduplicate an explicit ingestion key-- Run against a fresh database; all inputs are synthetic.PRAGMAforeign_keys=ON;CREATETABLEsample(idINTEGERPRIMARYKEY,siteTEXTNOTNULL,valueREALNOTNULL,dayTEXTNOTNULL,noteTEXT);INSERTINTOsampleVALUES(1,'A',12,'2026-01-01',NULL),(2,'B',20,'2026-01-02','checked'),(3,'A',18,'2026-01-03',NULL),(4,'B',8,'2026-01-04','recheck'),(5,'C',10,'2026-01-05',NULL),(6,'A',6,'2026-01-06','checked'),(7,'C',10,'2026-01-08','archived'),(8,'D',16,'2026-01-09',NULL);CREATETABLEsite(idTEXTPRIMARYKEY,labelTEXTNOTNULL);INSERTINTOsiteVALUES('A','River'),('B','Hill'),('C','Coast');-- BEGIN EXAMPLECREATETABLEincoming(idINTEGERPRIMARYKEY,batchTEXT,codeTEXT,valueINTEGER);INSERTINTOincomingVALUES(1,'b1','A',12),(2,'b1','A',12),(3,'b1','B',20),(4,'b2','A',18);DELETEFROMincomingWHEREidIN(SELECTidFROM(SELECTid,row_number()OVER(PARTITIONBYbatch,codeORDERBYid)ASpositionFROMincoming)WHEREposition>1);SELECTid,batch,code,valueFROMincomingORDERBYid;-- END EXAMPLE
Treat no observation as zero only for this stated model.
One row per day
This fixture has at most one observation on each day.
Complete standalone SQL and starting fixture
-- SQL-16-005: Calculate a calendar-based rolling total-- Run against a fresh database; all inputs are synthetic.PRAGMAforeign_keys=ON;CREATETABLEsample(idINTEGERPRIMARYKEY,siteTEXTNOTNULL,valueREALNOTNULL,dayTEXTNOTNULL,noteTEXT);INSERTINTOsampleVALUES(1,'A',12,'2026-01-01',NULL),(2,'B',20,'2026-01-02','checked'),(3,'A',18,'2026-01-03',NULL),(4,'B',8,'2026-01-04','recheck'),(5,'C',10,'2026-01-05',NULL),(6,'A',6,'2026-01-06','checked'),(7,'C',10,'2026-01-08','archived'),(8,'D',16,'2026-01-09',NULL);CREATETABLEsite(idTEXTPRIMARYKEY,labelTEXTNOTNULL);INSERTINTOsiteVALUES('A','River'),('B','Hill'),('C','Coast');-- BEGIN EXAMPLEWITHRECURSIVEdays(day)AS(VALUES('2026-01-01')UNIONALLSELECTdate(day,'+1 day')FROMdaysWHEREday<'2026-01-09'),filledAS(SELECTd.day,coalesce(s.value,0)ASvalueFROMdaysASdLEFTJOINsampleASsONs.day=d.day)SELECTday,value,sum(value)OVER(ORDERBYdayROWSBETWEEN2PRECEDINGANDCURRENTROW)AStotal3FROMfilledORDERBYday;-- END EXAMPLE
-- SQL-16-006: Compose a joined summary report-- Run against a fresh database; all inputs are synthetic.PRAGMAforeign_keys=ON;CREATETABLEsample(idINTEGERPRIMARYKEY,siteTEXTNOTNULL,valueREALNOTNULL,dayTEXTNOTNULL,noteTEXT);INSERTINTOsampleVALUES(1,'A',12,'2026-01-01',NULL),(2,'B',20,'2026-01-02','checked'),(3,'A',18,'2026-01-03',NULL),(4,'B',8,'2026-01-04','recheck'),(5,'C',10,'2026-01-05',NULL),(6,'A',6,'2026-01-06','checked'),(7,'C',10,'2026-01-08','archived'),(8,'D',16,'2026-01-09',NULL);CREATETABLEsite(idTEXTPRIMARYKEY,labelTEXTNOTNULL);INSERTINTOsiteVALUES('A','River'),('B','Hill'),('C','Coast');-- BEGIN EXAMPLEWITHtotalsAS(SELECTsite,count(*)ASn,sum(value)AStotalFROMsampleGROUPBYsite)SELECTt.site,coalesce(s.label,'(unmapped)')ASlabel,t.n,t.total,round(t.total/(SELECTsum(value)FROMsample),3)ASshareFROMtotalsAStLEFTJOINsiteASsONs.id=t.siteORDERBYt.totalDESC,t.site;-- END EXAMPLE