SQL on CSV

Run SQL on a CSV file in your browser

Free SQL on CSV, no signup, no database, nothing uploaded. Drop a CSV, Parquet, JSON or JSONL file up to 1.5 GB, type a SELECT, get up to 1,000,000 rows back from DuckDB running in a Web Worker inside your tab, and export them as CSV, Parquet, JSON, JSONL or Markdown.

.csv.tsv.json.jsonl.parquet
Drop a file here
Stays in your browserUp to 1.5 GB

No file handy? Open CO2 emissions by country and year (50k rows, 14 MB).

Your file is the table named data

Open a file and run SELECT country, max(co2) AS peak FROM data GROUP BY 1 ORDER BY 2 DESC LIMIT 10. Column names come from the header; quote them with double quotes if they contain spaces, like "Total revenue". Anything typed into the bar that starts with SELECT, WITH or FROM runs as SQL; anything else is treated as a filter.

It is full DuckDB SQL: CTEs, window functions, GROUP BY ALL, QUALIFY, regex functions, date arithmetic, UNNEST for nested JSON, PIVOT. The same dialect you'd use in the DuckDB CLI, so a query that works here works in a script later.

No SQL needed for the easy questions

The same bar takes a filter language: country:NL, amount:>500, year:2010..2020, -status:ok, sku:AB*, free words that search every text column, OR and parentheses. Click a header to sort, shift-click for a second key, hide columns, and the column panel shows non-null counts, distinct values, min, max and the top values.

Press the SQL toggle and the current filter, sort and visible columns are rewritten as a SELECT you can keep editing. It is the fastest way to learn what a filter compiles to.

Limits that matter

One file per page, up to 1.5 GB, read into the memory of your tab. Above that a CSV loads partially and a note says how many rows made it. Results are capped at 1,000,000 rows and a badge says first 1M when the cap hits; aggregate or LIMIT to stay under it.

There is one table, data, so joins across two files aren't possible here. Self-joins, subqueries and CTEs over that table are fine. Queries run in a Web Worker, so a slow GROUP BY doesn't freeze the page.

Export and share the result

Export writes the query result: CSV with a header, Parquet with zstd compression, a JSON array, JSONL, or a Markdown table of the first 1,000 rows. The CO2 sample is 13.7 MB as CSV and 4.3 MB as Parquet.

Press Share to upload the file once. On the hosted page the query, sort and visible columns live in the URL after #, so the link you copy opens on the same result for whoever gets it. Anonymous links take files up to 100 MB and are deleted 7 days after creation; a free account keeps 10.

When to use DuckDB on your machine instead

Files over 1.5 GB, joins across several files, or writing results back to disk: install DuckDB and run duckdb -c "SELECT count(*) FROM read_csv('data.csv')". It is the same engine and the same SQL, minus the browser's memory ceiling.

For a dataset that updates every night, push it instead: curl -T data.csv https://rows.page, then push again to the same link and the page shows how many rows are new, gone or changed, with the same SQL bar on top.

Limits for SQL on CSV in the browser

WhatLimit or price
Price$0, no account, nothing to install
File sizeUp to 1.5 GB per file: CSV, TSV, JSON, JSONL or Parquet
EngineDuckDB-WASM 1.33, queries run in a Web Worker inside your tab
Result rowsThe first 1,000,000 rows are shown and exported
TablesOne file per page, available as the table data
ExportCSV, Parquet (zstd), JSON, JSONL, Markdown (first 1,000 rows)
Share a link without an account$0, files up to 100 MB, link deleted 7 days after creation
Free account$0, 10 datasets kept, last 3 versions
Pro$12/month, 100 datasets, files up to 500 MB, private links
Max$39/month, 1,000 datasets, files up to 2 GB, private links

Questions

Is my file uploaded to run the query?

No. Opening a file reads it inside your browser tab. It only leaves your machine if you share it or push it with curl.

Which SQL dialect is it?

DuckDB, which is close to PostgreSQL. SELECT ... FROM data with CTEs, window functions, GROUP BY ALL, QUALIFY, string and date functions, and list and struct functions for nested JSON.

Can I join two CSV files?

Not in the browser; there is one table per page. Open DuckDB locally and query both files with read_csv, or combine them first and drop the result here.

How big can the file be?

1.5 GB per file. The 7.4 million row NYC taxi Parquet sample queries fine. A CSV over 1.5 GB loads partially with a note saying how many rows made it.

Can I save the query?

On a shared link, yes: the query is in the URL after #, so the URL you copy opens on the same result. For a local file the query goes when the tab closes, so share the file first if you want to keep it.

More tools

Pushing data from a script or agent? Read the docs.