DuckDB でデータファイル付きの SQL 課題を出す

SQL (DuckDB) は SQLite と並ぶ2つ目の SQL 言語で、タブは同じ2つです。生徒が書くクエリと、クエリの実行先となるデータベースを作るスキーマです。DuckDB は分析のためのデータベースなので、SQLite では扱えないことを教えられます。ウィンドウ関数、名前を指定するだけで CSV ファイルを読むこと、そしてクエリプランの読み方です。

何ができるか、いつ選ぶか

データの分析を扱う授業では SQL (DuckDB) を選びます。`OVER` による累計や順位、`QUALIFY`、計測値ファイルの集計、あるクエリが別のクエリより遅い理由などです。テーブルやキー、最初の `select` を扱う授業では SQLite を選びます。課題はどちらか一方に決まり、途中で方言が変わることはないので、生徒が戸惑うことはありません。

実行のたびに、専用のコンテナーの中で、空の新しいデータベースがメモリー上に作られ、スキーマ、続いてクエリが適用されます。SQL と同じです。ある生徒の操作が他の生徒に及ぶことはなく、実行から次の実行へ引き継がれるものもありません。

新しい DuckDB 課題は、小さな売上の表と、ウィンドウ関数を使ったクエリ、そして最初から合格する模範解答で始まります。

データファイルを付ける

出力欄の横にあるデータファイルのコントロールで、課題にファイルを1つ付けられます。クエリは名前で読み込みます:`select * from 'readings.csv'`、JSON Lines なら `read_json` です。課題に取り組む生徒は全員同じデータを読み、生徒は別の名前で自分のファイルを横に追加することもできます。

受け付けるのは CSV、TSV、JSON Lines のテキストファイルで、1ファイル 64 KB までです。Parquet ファイルは受け付けません。データファイルはテキストでなければならないからで、拡張子だけが違うファイルも同じです。断るときは、読めるファイルの種類をページが伝えます。ファイルだけでデータが足りる課題なら、スキーマは空でもかまいません。

クエリにできないこと

DuckDB はネットワークなしで、自分に何かを追加する手段もない状態で動きます。クエリが読めるのは課題のデータファイルだけです。ほかのファイルを読むことも、書くことも、データベースを接続することも、拡張機能を入れることも、コマンドを実行することもできません。試みはどれも DuckDB 自身の言葉(たとえばファイルシステムの操作が無効になっている、など)で断られるので、試した生徒は理由が分かり、教員はクラスに見せられます。

時間、メモリー、プロセス数の上限は SQL の実行と同じです。与えられた以上のメモリーを必要とするクエリは、DuckDB のメモリー不足のメッセージで止まります。

実行と採点

「実行」はクエリを実行して行をシンプルな表で表示します。「スキーマを実行」はデータベースを作り直し、横に表示されるテーブルを更新します。`EXPLAIN ANALYZE` は各段階の行数と時間つきでプランを表示するので、クエリが速い理由を説明するのに使えます。

採点は SQL と同じです。課題に模範解答を設定すると、「テストを実行」が生徒のクエリと先生のクエリを同じスキーマとデータファイルで実行し、行を比較します。順序は無視しますが、重複は数えます。結果は合格か不合格のどちらかだけで、実行できなかったクエリは「失敗」ではなく「実行できませんでした」と表示されます。

費用と試し方

学校は最初の365日間、生徒50人まで、カードなしで無料で使え、このページで説明したことはすべてその中に含まれます。その後は生徒1人あたりの年額で、教職員は無料、ラボ、仮想マシン、AIは公正利用の範囲で料金に含まれます。料金ページでは、お住まいの通貨での金額と計算ツールを確認できます。

よくある質問

生徒は Parquet ファイルを使えますか?
まだ使えません。データファイルはテキストなので、CSV、TSV、JSON Lines は受け付け、Parquet はその旨を伝える文とともに断られます。
クエリから拡張機能を入れたり、インターネットから読んだりできますか?
できません。実行にはネットワークがなく、設定はクエリが始まる前にロックされるので、元に戻すことはできません。
授業のレッスンで DuckDB を使えますか?
はい。レッスン内の DuckDB のコードブロックも同じ2つのタブを持ち、DuckDB で実行されます。