CSV ファイルを、表のように SQL で読む
DuckDB では、CSV ファイルを表のように、そのまま SQL で問い合わせられます。
read_csv にファイルの名前を渡すだけで、列の名前と型を DuckDB が推測してくれます。データを表に取り込む手間はありません。
このレッスンのゴール
メモ
CSV ファイルを、名前を指定して、表のように問い合わせられる。
重要な言葉
| ことば | いみ | れい |
|---|---|---|
| read_csv | CSV ファイルを、表のように読む関数 | read_csv('bike_log.csv') |
| ヘッダー行 | ファイルの1行目にある、列の名前 | |
| 型の推測 | 値を見て、列の型を DuckDB が決めること | |
| 区切り文字 | 値と値を分ける文字 | カンマ、タブ |
| DESCRIBE | 列の名前と型を表示する命令 | |
| JSON Lines | 1行に1つの JSON を書くファイルの形 |
学生が入力するセルは、このプレビューでは空白です。
ファイルの名前を、表の名前の代わりに書く
from の後ろに表の名前を書く代わりに、read_csv('ファイル名') と書きます。すると、ファイルが1つの表として読まれます。
1行目が列の名前、2行目からがデータです。そのあとは、いつもの group by や where がそのまま使えます。
例: ファイルを読むクエリ
-- ファイル名を渡すと、ファイルが表のように読めます。
select station, count(*) as rides, sum(minutes) as total_minutes
from read_csv('bike_log.csv')
group by station
order by station;
この教材で、ファイルを読める場所
レッスンのページの中の Run は、ファイルを読めません。ファイルを読めるのは、プレイグラウンドで、自分でアップロードしたファイルだけです。
対応するのは、64 KB までの CSV、TSV、JSON Lines です。Parquet は使えません。
そこで、このレッスンの Run は、ファイルと同じ形に作った表で動かします。
試す: 列の型を調べる
-- 表の列の名前と型を調べます。
-- ファイルなら、read_csv の結果の列がこう調べられます。
describe select * from bike_log;
例: bike_log.csv の中身
| ride_id | station | minutes | started_at |
|---|---|---|---|
| 1 | 駅前 | 12 | 2026-05-01 08:10:00 |
| 2 | 公園 | 25 | 2026-05-01 09:30:00 |
| 3 | 駅前 | 8 | 2026-05-01 12:05:00 |
| 4 | 大学 | 31 | 2026-05-02 07:55:00 |
学生が入力するセルは、このプレビューでは空白です。
ファイルの数字は、BIGINT と推測される
実際に bike_log.csv を read_csv で読んでみました。ride_id と minutes は BIGINT と推測されました。
station は VARCHAR、started_at は TIMESTAMP です。
ところが、表を INTEGER で作ると、INTEGER のままです。ファイルの数字は、大きな値も入るように、広い型で読まれます。
例: 列に入っている値と、推測された型
| 列 | 入っている値 | 推測された型 |
|---|---|---|
| ride_id | 1, 2, 3 | BIGINT |
| station | 駅前, 公園 | VARCHAR |
| minutes | 12, 25, 8 | BIGINT |
| started_at | 2026-05-01 08:10:00 | TIMESTAMP |
学生が入力するセルは、このプレビューでは空白です。
試す: 駅ごとの貸出数
-- ファイルと同じ形の表で、同じクエリを動かします。
select station, count(*) as rides, sum(minutes) as total_minutes
from bike_log
group by station
order by station;
-- group by station を、日付ごとに変えてみましょう。
-- cast(started_at as date) を使います。
よくある間違い
注意
CSV の数字の列に n/a のような文字が1つ混ざると、その列は全部 VARCHAR になります。合計が出ないときは、まず describe で型を調べましょう。
さらに挑戦
タブ区切りのファイルは、read_csv に区切り文字を教えて読みます。JSON Lines は read_json で読みます。
自分でプレイグラウンドに 64 KB 以下の CSV をアップロードして、ファイルの名前で問い合わせてみましょう。まず describe で型を確かめます。