Query 26 Files in One Statement
A spreadsheet starts to struggle at two files. This takes twenty-six, loaded together, as tables A through Z — reference lists, monthly extracts and everything in between, joined and stacked in ordinary SQL.
Where the Letter Comes From
Each file becomes a table named by a single letter, shown in the Alias column. The letter is taken from the first letter of the filename, and if that letter is already in use, the next free letter A–Z is assigned instead.
| File | Alias | Why |
|---|---|---|
sales.csv | S | First letter, and S is free |
regions.parquet | R | First letter, and R is free |
services.yaml | A | S is taken by sales.csv, so it falls back to the first free letter |
Loading Them All
- Click anywhere on the File Select panel to open the file picker.
- Select every file —
Ctrl+Ain the dialog, or click the first and shift-click the last. - They load together. The panel scrolls; each row shows the filename, type and alias.
A useful convention when you have many: prefix the filenames so the alphabet does the ordering for you. a-customers.csv, b-products.csv, c-regions.csv and so on gives you an alias map you can predict without reading it.
Select a folder's worth of files and query the lot.
Open the tool →Joining Across Four of Them
With a-customers.csv, b-products.csv, c-regions.csv and a monthly orders extract as E:
SELECT C.region, B.category, COUNT(*) AS orders, ROUND(SUM(E.amount)) AS revenue FROM E JOIN A ON E.customer_id = A.customer_id JOIN B ON E.product_id = B.product_id JOIN C ON A.region = C.region GROUP BY C.region, B.category ORDER BY revenue DESC
Four files, one statement, no import step and no database. Formats can be mixed freely — a Parquet extract joins to a CSV lookup list exactly as if they were two tables in the same schema.
Stacking Monthly Extracts
The other common shape: twenty-two monthly files that all have the same columns, and you want them as one table. UNION ALL does it.
SELECT '2025-08' AS month, COUNT(*) AS orders, ROUND(SUM(amount)) AS revenue FROM X UNION ALL SELECT '2025-09', COUNT(*), ROUND(SUM(amount)) FROM Y UNION ALL SELECT '2025-10', COUNT(*), ROUND(SUM(amount)) FROM Z
The literal month string in the first column is worth the extra typing — without it, the rows come back with no way to tell which file each one came from.
TOTAL is a reserved word in the SQL engine, so AS total is a parse error. Use AS revenue, AS total_amount or anything else. It is an easy five minutes to lose if you do not know.The Limits, Honestly
| Limit | Value |
|---|---|
| Files loaded at once | 26 — one per letter of the alphabet |
| Size per file | 50 MB |
| Rows per file | 1,000,000 |
| Tables in one join | No fixed limit below 26, but each join multiplies the work |
The real constraint is your machine. Twenty-six files of a few thousand rows each is comfortable on a laptop. Twenty-six files at the 50 MB ceiling is not what this is for, and a warehouse or DuckDB is the right answer at that point — that is a genuine recommendation, not a grudging one.
Reasonable Questions
Can I use the plain-English box across several files?
Yes. It infers relationships between the loaded files and writes the join for you, so a question spanning two files produces a join without you naming it. With twenty-six loaded it is better used for single-table questions; write the big joins yourself. See the guide.
What if I need a twenty-seventh file?
Remove one first. The alphabet is the hard limit, and it was chosen because a single-letter alias keeps queries readable.
Do the files have to be the same format?
No. Mix CSV, Excel, JSON, XML, YAML, Avro and Parquet in one query — see the formats guide.
Can I change an alias after loading?
Yes — type a different letter into the Alias box on that row. Queries you have already written will need updating to match.
Does loading 26 files send 26 uploads?
It sends nothing at all. Every file is read locally; the network panel stays empty throughout. Check it here.