Lantide Data
返回部落格
數據分析實務

不裝資料庫,也能用 SQL 查 Excel/CSV:DuckDB 適合哪些人?

DuckDB 是嵌入式分析資料庫,可直接用 SQL 查本機 CSV、Parquet 與 Excel;適合檔案型 adhoc 分析,但不取代共享數倉與排程 ETL。

可以。DuckDB 是 in-process(嵌入應用程式行程內)的分析資料庫,能直接用 SQL 查 CSV、Parquet,也支援讀取 .xlsx;不必先架一台資料庫 server。它特別適合多個本機檔案的 adhoc 分析與跨檔 JOIN,但不是 nightly ETL、多人共用權限或企業數倉的替代品。

什麼是 in-process analytical database?

傳統 client-server 資料庫需要一個長期運行的 server,使用者透過網路連線。DuckDB 則可嵌入 CLI、Python 或桌面應用,在同一個 process 內執行分析查詢。對使用者而言,優勢是少了 server 安裝、帳號與連線管理,仍保留 SQL 的 filter、JOIN、aggregation 與 window function。

它不是「把 CSV 變成正式數倉」,而是讓檔案立刻成為可查詢的來源。依 DuckDB CSV 文件,最簡單的查法是:

SELECT *
FROM 'orders.csv'
LIMIT 20;

CSV 沒有固定 schema,DuckDB 會抽樣推斷格式與型別;重要分析仍應檢查推斷結果,必要時明確設定欄位型別、分隔符或 sample size。

從資料夾、Excel 到 JOIN 的三個例子

一次讀取一整個月份資料夾

DuckDB 支援 glob,可把多個同 schema 的 CSV 當成一張表:

SELECT region, sum(amount) AS revenue
FROM read_csv('exports/2026-06/*.csv', union_by_name = true)
GROUP BY region
ORDER BY revenue DESC;

union_by_name = true 會按欄名對齊不同檔案,缺少的欄位補 NULL。這很方便,但也可能掩蓋上游 schema drift;正式執行前應列出檔案來源與缺欄比例。DuckDB 多檔案文件 提供 glob、檔案清單與 filename 欄位的完整用法。

查 Excel 指定工作表

DuckDB Excel 文件.xlsx 範例是:

SELECT *
FROM read_xlsx('targets.xlsx', sheet = 'Q3 Targets');

官方 DuckDB read_xlsx 不支援舊 .xls。產品若宣稱支援 .xls,通常代表它另外做了轉換或載入層,不能把該能力直接算在原生 DuckDB 上。

把本機目標和訂單 JOIN

WITH targets AS (
  SELECT * FROM read_xlsx('targets.xlsx', sheet = 'Q3 Targets')
), actuals AS (
  SELECT region, sum(amount) AS revenue
  FROM 'orders/*.parquet'
  GROUP BY region
)
SELECT
  t.region,
  t.target,
  a.revenue,
  a.revenue / NULLIF(t.target, 0) AS attainment
FROM targets t
LEFT JOIN actuals a USING (region);

這比手動 VLOOKUP 更容易保留計算邏輯;但仍要先確認兩邊 region 是否唯一、命名是否一致,否則 JOIN 可能重複放大。

DuckDB 最適合的四種人

  • Excel 重度使用者:檔案已多到公式與複製貼上難以重跑,但還不需要建數倉。
  • 營運與分析師:常收到多個 CSV/Parquet,要快速合併、聚合與驗證。
  • 工程師與研究者:需要在本機或 notebook 直接查檔案,不想先把資料載入 server。
  • 小團隊試點:要先證明指標與資料價值,再決定是否投入正式 pipeline。

判斷方式很簡單:如果問題是「我桌面上有十個資料檔,今天要得到可重跑的答案」,DuckDB 通常很合適。

什麼時候不該只靠 DuckDB?

如果需求是多人同時存取、中央身份與 row-level 權限、穩定 nightly ETL、持續服務 dashboard、資料品質 SLA 或跨區備援,應評估資料倉庫、lakehouse、orchestrator 與 BI。DuckDB 可以是其中的查詢或開發元件,但單一 in-process 工作環境不會自動提供完整平台能力。

另外,直接讀檔代表結果依賴檔案版本與路徑。檔案被覆蓋後,相同 SQL 不一定得到相同結果;需要稽核時要保存來源版本、更新時間、SQL 與限制。

Lantide Data 把 DuckDB 變成可審閱的分析工作面

Lantide Data 內建統一 DuckDB 查詢層,使用者與 Agent 共用相同 SQL 管線。工作區可載入 CSV、TSV、JSON/JSONL、Parquet,以及 .xls.xlsx 工作表;後者是 Lantide 的載入能力,不等同 DuckDB 原生 read_xlsx 支援 .xls。也可 ATTACH PostgreSQL、MySQL、SQLite,讓本機檔與外部表跨源 JOIN。完整格式見 使用者指南 §1.5

持久 SQL 分頁執行後可產生暫存快取,後續 SQL 以分頁名引用;有上游依賴時可用 Source Run 按順序重跑並查看 lineage。這些快取在切換工作區或重啟後會清除,因此是分析中間結果,不是 durable warehouse table。詳見 快取與 Source Run統一查詢層

若讓 Agent 參與正式分析,Lantide 的價值不是「AI 直接給一個數字」,而是先把分母、grain、JOIN 與 checkpoint 寫進 Plan,由人核准 Execute,再把 SQL evidence 與 Report 留下。它仍不代替資料 owner 對口徑與品質的判斷。

結語

先拿兩個 CSV 或一份 .xlsx 做小實驗:用 SQL 完成 preview、group by 與一個 JOIN,並把查詢存下來。如果需求開始出現固定排程、多人共享與權限 SLA,再把穩定邏輯搬到正式資料平台;在那之前,DuckDB 能大幅降低「只是想查檔案卻先要架系統」的門檻。

參考資料