Query CSV with SQL: Run DuckDB SQL on Local Files

Run full SQL queries on CSV, JSON, and Parquet files in your browser using DuckDB-WASM. No upload, no signup.

First use downloads ~30 MB DuckDB compiled to WebAssembly. Runs full SQL queries on CSV, Parquet, and JSON files directly in your browser without uploading anything. Downloaded once and cached.
Add one or more .csv, .json, or .parquet files. Each becomes a SQL table named after the file.

Reference each file by the table name shown above. DuckDB dialect: full SELECT, JOIN, GROUP BY, window functions, CTEs.

About SQL on CSV

Drop a CSV, JSON, or Parquet file onto the page and query it with the same SQL dialect you would use in a data warehouse. Joins across multiple files, window functions, aggregations, and CTEs all work because the file is parsed by DuckDB compiled to WebAssembly. Results render as a paginated table and export to CSV in one click.

Querying flat files usually means importing them into Postgres, MySQL, or SQLite first. This tool removes that step. DuckDB-WASM runs the same analytical SQL engine used in production data pipelines, compiled to WebAssembly and loaded into your browser tab. Once loaded, you can read CSV, newline-delimited JSON, and Parquet files directly with read_csv_auto, read_json_auto, and read_parquet, then JOIN, GROUP BY, and aggregate across them.

DuckDB's dialect is close to PostgreSQL with extras for analytics: window functions, list and struct types, ASOF joins, and SUMMARIZE for quick column stats. Files larger than memory still work for many operations thanks to DuckDB's vectorized execution and out-of-core algorithms. Type inference happens automatically when you reference a file, and you can override it by passing options to read_csv_auto.

Upload as many files as you want. Each becomes a table named after the filename (without the extension), so customers.csv becomes the table customers. Reference the table in any FROM clause and the tool rewrites it to a DuckDB file reader before executing.

How to use the SQL on CSV
  1. 1

    Load your files

    Click Add files and pick one or more .csv, .json, or .parquet files. Each registers as a SQL table named after the filename.

  2. 2

    Write SQL

    Edit the query box. Reference tables by their sanitized filename. Full DuckDB syntax works including JOINs, window functions, and CTEs.

  3. 3

    Run and export

    Press Run query to execute against the in-browser engine. Results paginate at 50 rows per page and export to CSV with one click.

Common use cases

Ad-hoc analytics on exports

Run aggregate queries on a CSV exported from your CRM or analytics platform without setting up a database.

Join two CSVs

Load orders.csv and customers.csv, then JOIN them on customer_id to enrich orders with names and segments.

Convert Parquet to CSV

Query a Parquet file with SELECT *, then click Export to download the rows as CSV for downstream tools.

Validate a data dump

Run COUNT, SUM, and GROUP BY checks on a fresh export to confirm row counts and category totals before pushing it to a pipeline.

Frequently asked questions
Does my file get uploaded anywhere?

No. The file is read into a Uint8Array in your browser and registered with DuckDB-WASM running in a Web Worker on the same page. Nothing leaves your device.

How big a file can I query?

DuckDB-WASM is bounded by browser memory, which is typically 2 to 4 GB per tab. Parquet files compress well and query fastest; very wide CSVs stress memory more than narrow Parquet files of the same row count.

Which SQL dialect does this use?

DuckDB's dialect, which is PostgreSQL-compatible for most queries and adds analytical features like SUMMARIZE, ASOF joins, window functions, and list and struct types.

Can I join multiple files in one query?

Yes. Upload each file separately and reference both table names in the same SELECT. Example: SELECT * FROM orders JOIN customers USING (customer_id).

Why is the first run slower than later ones?

The first query downloads the DuckDB WebAssembly engine (about 30 MB). The browser caches it after that, so subsequent visits and queries start instantly.

developerconverterdata