DuckDB

A SQL engine with no server, no install drama — that queries your files directly. This one earns its keep daily.

▶ Watch this reel

What you'll learn

  1. What is DuckDB
  2. Query files directly
  3. Joins across files
  4. Python integration
  5. DuckDB vs SQLite vs SQL Server
  6. Persisting & exporting

Remember this

What it is

Query files directly

Joins across files

Python integration

DuckDB vs SQLite vs SQL Server

EngineJob
SQLiteembedded OLTP (app storage, transactions)
DuckDBembedded OLAP (analytics over files)
SQL Serverenterprise system of record

Persisting & exporting

Code: DuckDB — the daily workflow in one script

import duckdb

# --- explore files directly -------------------------------------
rel = duckdb.sql("""
    SELECT status, COUNT(*) AS n, SUM(amount) AS total
    FROM 'data/events.csv'
    GROUP BY status
    ORDER BY total DESC
""")
print(rel)                     # lazy relation — pretty-prints a sample

# --- join CSV to a partitioned Parquet lake ----------------------
duckdb.sql("""
    CREATE VIEW events AS
    SELECT e.*, c.team
    FROM 'data/events.csv' e
    JOIN 'lake/customers/year=*/month=03/*.parquet' c USING (cust_id)
""")

# --- register a live pandas DataFrame ----------------------------
import pandas as pd
flags = pd.DataFrame({"status": ["P1", "P2"], "sla_h": [1, 24]})
duckdb.register("flags", flags)

result = duckdb.sql("""
    SELECT e.team, f.sla_h, AVG(e.amount) AS avg_amt
    FROM events e
    JOIN flags f USING (status)
    GROUP BY ALL
    ORDER BY avg_amt DESC
""").df()

# --- persist the pipeline -----------------------------------------
duckdb.sql("""
    COPY (SELECT * FROM events WHERE status = 'P1')
    TO 'out/p1_cases.parquet' (FORMAT PARQUET, COMPRESSION 'snappy')
""")

# Parameterized (the only safe way to mix variables + SQL):
city = "Paris"
safe = duckdb.sql("SELECT * FROM events WHERE city = ?", params=[city])