Turn Any File Into a SQL Table
The whole mental model is one sentence: one file becomes one table, and its alias letter is the table name. Once that clicks, everything else is just SQL you already know.
File in, table out
Drop a file on the File Select panel and it is parsed into rows and columns in memory, exactly as if you had loaded it into a database — except there is no database, no CREATE TABLE, and no import step. It is queryable the moment it appears.
This works identically for every supported format:
| Format | Extensions | Becomes |
|---|---|---|
| Delimited text | .csv, .tsv, .txt | One table, columns from the header row |
| Excel | .xlsx, .xls, .xlsm | One table per selected sheet |
| JSON | .json | One table, nesting flattened to dot-paths |
| XML | .xml | One table, repeated elements become rows |
| YAML | .yaml, .yml | One table, nesting flattened |
| Avro | .avro | One table, read via WebAssembly |
| Parquet | .parquet | One table, read via WebAssembly |
How the table gets its name
Each file is given a single-letter alias, shown in the Alias column. The letter comes from the start of the filename, so orders.csv becomes O and customers.csv becomes C. When two files would claim the same letter, the second is given another free one.
A. It is derived from the name, not the load order. Guessing is the single most common reason a first query fails with an unknown-table error. The Alias column is the authority — and the letter is editable, so type whatever you prefer.Seeing the schema
There is no separate schema browser; one query does the job:
SELECT * FROM O LIMIT 1
The result headers give you the full column list. For nested formats, each header shows the short name on top with the full dot-path underneath, so you can see where a flattened field came from.
How columns are named
- Spaces become underscores. A column headed
first nameis queried asfirst_name. - Nesting becomes dot-paths. A JSON field at
address.citygets its own column, with a short alias you can also use. - Reserved words are bracket-quoted for you when they appear as column names, so a column called
keyordatestill works.
SELECT COUNT(*) AS total fails because total is reserved; AS total_rows is fine.Up to 26 tables at once
Load as many files as you have letters for — A to Z. They can be different formats, and they are all queryable in the same statement.
SELECT O.order_id, C.name, P.category
FROM O
JOIN C ON O.customer_id = C.customer_id
JOIN P ON O.product_id = P.product_id
That joins a CSV, an Excel sheet and a Parquet file together, and the query does not care which was which.
Load a file and it is a table. That is the whole setup.
Open the tool →Stacking files instead of joining them
Monthly extracts with identical columns are a common case. Use UNION ALL to treat them as one table:
SELECT * FROM J
UNION ALL
SELECT * FROM F
UNION ALL
SELECT * FROM M
Use UNION instead of UNION ALL if you want duplicate rows removed.
Limits worth knowing
| Limit | Value |
|---|---|
| Files at once | 26 (one per alias letter) |
| File size | 50 MB each |
| Rows per file | 1,000,000 — a safety backstop, and truncation is always reported |
| Results paging | 1,000 rows per page |
Past those, you want a real database, and that is the honest answer rather than a grudging one.