JSONファイル_1(DuckDB_07)

この連載では、DuckDBについて学んでいきます。前回の記事はこちらになります。

hirocom777.hatenadiary.org

前回は、CSVファイルの読み込み方法の詳細について学びました。DuckDBではCSVファイルを、ファイルのまま問い合わせたり、URLから直接読み込んだり、テーブルとして保存したりできます。

今回はJSONファイルです。DuckDBでJSONファイルを扱う方法を学びます。

JSONファイルとは

JSON(JavaScript Object Notation)は、データをテキスト形式で表現するためのフォーマットです。キーと値を組み合わせてデータを表現します。また、複数のデータを配列としてまとめることもできます。

[
    {
        "id": 1,
        "name": "田中",
        "department": "営業",
        "salary": 300000
    },
    {
        "id": 2,
        "name": "佐藤",
        "department": "総務",
        "salary": 350000
    },
    {
        "id": 3,
        "name": "鈴木",
        "department": "営業",
        "salary": 320000
    }
]

このような形式であれば、表形式のデータとして扱うことができます。このデータを「employees.json」というファイル名で保存してDuckDBで次のSQLを実行します。

memory D SELECT *
         FROM 'employees.json';
┌───────┬─────────┬────────────┬────────┐
│  id   │  name   │ department │ salary │
│ int64 │ varchar │  varchar   │ int64  │
├───────┼─────────┼────────────┼────────┤
│     1 │ 田中    │ 営業       │ 300000 │
│     2 │ 佐藤    │ 総務       │ 350000 │
│     3 │ 鈴木    │ 営業       │ 320000 │
└───────┴─────────┴────────────┴────────┘

入れ子構造のJSONファイル

JSONでは、データを入れ子構造で表現できます。以下のようなデータです。

{
    "id": 1,
    "name": "田中",
    "department": "営業",
    "salary": 300000,
    "address": {
        "prefecture": "東京都",
        "city": "新宿区"
    }
}

このデータを「employees2.json」というファイル名で保存して次のSQLを実行します。

memory D SELECT *
         FROM 'employees2.json';
┌───────┬─────────┬────────────┬────────┬──────────────────────────────────────────┐
│  id   │  name   │ department │ salary │                 address                  │
│ int64 │ varchar │  varchar   │ int64  │ struct(prefecture varchar, city varchar) │
├───────┼─────────┼────────────┼────────┼──────────────────────────────────────────┤
│     1 │ 田中    │ 営業       │ 300000 │ {'prefecture': 東京都, 'city': 新宿区}   │
└───────┴─────────┴────────────┴────────┴──────────────────────────────────────────┘

今回の例では、addressのような入れ子のオブジェクトが、DuckDBではSTRUCT型として認識されます。struct型は、異なるデータ型の複数のフィールド(キーと値のペア)を1つのまとまったデータとして保持する複合データ型(構造体・レコード)です。

JSONのパス

入れ子になったJSONの値を取り出すには、JSONのパス(JSONPath)を指定します。JSONPathは、JSONデータの中から特定の要素を指定するための記法です。キーを指定したり、配列のインデックスを指定したりすることで、目的のデータを参照できます。以下の記法をサポートしています。

  • ルート要素(\$): JSONデータ全体の起点を表します。JSONPathでは、通常、$からパスを指定します。
  • ドット記法(.): プロパティ(キー)を指定します(例: $.store.name)。
  • ブラケット記法 ([]): プロパティ名や、配列のインデックス(0から始まる番号)を指定します(例: $.store.book[0])。
  • ワイルドカード (*): すべての要素やプロパティを選択します(例: $.store.book[*])。

具体的なアクセス方法は、次回ご紹介します。

次回もJSONファイル

いかがでしょうか。JSONファイルは階層構造のデータも表せるところが便利ですね。次回もJSONファイルです。具体的なアクセス例を見ていきましょう。お楽しみに!!

DuckDB学習記事のまとめですはこちらから

CSVファイル_2(DuckDB_06)

この連載では、DuckDBについて学んでいきます。前回の記事はこちらになります。

hirocom777.hatenadiary.org

前回は、CSVファイルの読み込み方法について学びました。DuckDBでは、CSVファイルをさまざまな形で扱うことができます。

今回も、CSVファイルです。DuckDBではCSVファイルを、ファイルのまま問い合わせたり、URLから直接読み込んだり、テーブルとして保存したりできます。

CSVファイルの読み込み例

それでは実際のCSVファイル読み込み例について見ていきましょう。以下のサイトは東京都の統計「住民基本台帳による東京都の世帯と人口」です。

https://www.toukei.metro.tokyo.lg.jp/juukiy/jy-index.htm

ここから、区市町村別世帯数(昭和60年~令和8年)のデータ「jy26rv0100.csv」を読み込んでみます。表示はマークダウン形式とします。

  1. シンプルな読み込み
    CSVファイルを直接指定して、テーブルとして扱うことができます。
   memory D SELECT 地域,地域_1,令和8年/総世帯数(世帯) FROM 'jy26rv0100.csv' LIMIT 3;
地域_1 令和8年/総世帯数(世帯)
総数 7778945
区部 5600989
千代田区 39737

最後の「LIMIT 3」は、取得するデータを3行に制限しています。また、このCSVファイルには「地域」という名前の列が2つあります。DuckDBでは、重複する列名に対して2番目以降の列名に1などが付加されます。そのため、2番目の「地域」列は「地域1」として指定しています。

  1. URLを指定した読み込み
    CSVファイルをあらかじめダウンロードしなくても、URLを指定することで直接読み込むことができます。
  memory D SELECT 地域_1,令和8年/総世帯数(世帯)
           FROM 'https://www.toukei.metro.tokyo.lg.jp/juukiy/jy26rv0100.csv' LIMIT 3;

結果は1.と同じです。

  1. テーブルの追加作成
    CSVファイルの内容から、新しいテーブルを作成できます。
  memory D CREATE TABLE NewTable AS FROM 'jy26rv0100.csv';
  memory D SHOW TABLES;
   |   name   |
   |----------|
   | NewTable |

read_csvのパラメーター

read_csvを使用するとパラメーターを指定することによって、読み込み方法を細かく制御できます。以下のように記述します。

read_csv(ファイル名 , パラメーター_1 = 値_1 , パラメーター_2 = 値_2 ・・・)

以下に代表的なパラメーターをご紹介します。

  • all_varchar
    CSVファイルの読み込み時に自動推論でデータ型を推定するのですが、「all_varchar」をtrueに指定するとすべての列がVARCHARとして扱われます。デフォルトではfalseです。

  • auto_detect
    自動推論を行います。デフォルトはtrueです。falseに指定した場合は、columnsパラメーターで列名、データ型を指定する必要があります。

  • columns
    列名、データ型を指定します。以下のように記述します。

  columns = {列名_1: データ型_1,列名_2: データ型_2, 列名_3: データ型_3, ・・・}
  • delim or delimiter
    各行内の列を区切るために使用される区切り文字を指定します。デフォルトは「,」です。最大4バイトまで指定可能です。

  • encoding
    文字コードを指定します。デフォルトではutf-8です。

  • header
    先頭行を列名として扱うかどうかを指定します。デフォルトはtrueです。

  • ignore_errors
    自動推論のエラーを無視します。デフォルトではfalseです。

  • max_line_size or maximum_line_size
    1行として読み込める最大サイズを指定します。

  • sample_size
    自動推論のサンプル行を指定します。デフォルトでは20480です。

  • skip
    先頭から読み込みをスキップする行数を指定します。デフォルトでは0です。

このように、DuckDBではCSVファイルを直接読み込むだけでなく、read_csvを使って読み込み方法を細かく指定することもできます。とくに、CSVの内容によっては自動推論が意図した結果にならない場合があるため、all_varchar、columns、sample_sizeなどのパラメーターを使って読み込み方法を調整できます。

次回はJSONファイル

いかがでしょうか。DuckDBを使うとCSVファイルを色々な形で扱えますね。次回はJSONファイルです。DuckDBでJSONファイルを扱う方法を学びます。お楽しみに!!

hirocom777.hatenadiary.org

DuckDB学習記事のまとめですはこちらから

CSVファイル_1(DuckDB_05)

この連載では、DuckDBについて学んでいきます。前回の記事はこちらになります。

hirocom777.hatenadiary.org

前回は、表示モードです。SQLの結果を表示する場合、いろいろな表示モードがあります。

今回は、CSVファイルです。DuckDBでは、CSVファイルをさまざまな形で扱うことができます。

CSVファイルの読み込み方法

CSV(Comma-Separated Values)は、各項目をカンマ(,)で区切ってデータを記録するテキストデータの形式です。データ交換用のデファクトスタンダードとして広く使用されています。DuckDBは、CSVファイルを直接読み込んで処理できます。

読み込み方法は、「直接読み込み」、「read_csv」の2つのアプローチがあります。これらは自動推論の範囲と記述の手軽さが異なります。

このほかに「read_csv_auto」がありますが、これは旧来から使われている書き方です。現在のDuckDBではread_csvが基本的なCSV読み込み関数になっています。

1. 直接読み込み

FROM句に直接ファイルパスを記述する方法です。DuckDBがファイル拡張子を識別し、CSVとして自動的に読み込みます。 コードがもっとも短く、直感的に記述できます。詳細なパラメーター(区切り文字の強制変更、特定行のスキップなど)は指定できません。

2. read_csv

デフォルトでは自動推論を行いますが、パラメーターを指定することで、区切り文字やデータ型などを細かく制御できます。とくにパラメーター「columns」を指定すると、列名とデータ型を個別に明示できます。これにより自動推論に任せず、決められたスキーマでCSVを読み込むことができ、データ型の誤判定を防ぐことができます。また、スキーマの自動検出を省略できるため、不要な型推論の処理を減らせます。とくに大量のCSVを扱う場合などに有効です。

以下は読み込み方法のまとめです。

読み込み方法 構文の例 特徴・使いどころ
直接読み込み SELECT * FROM 'data.csv'; 手軽。 一時的な分析や、きれいなCSVを簡単に確認したいとき。
read_csv SELECT * FROM read_csv('data.csv', ...); 自動推論に頼りつつ、一部のオプション(エラー無視や型の上書きなど)を細かく調整したいとき。

自動推論

自動推論(Auto-detection)とは、CSVファイルを読み込む際に、DuckDBがファイルの中身を先頭から自動で分析し、データの構造(区切り文字、ヘッダー、データ型など)をすべて見つけ出してくれる機能のことです。 DuckDBはファイル全体をスキャンするのではなく、ファイルの一部をサンプルとして読み込み、そこからデータの構造を予測します。

1. 区切り文字の自動推論(Dialect Detection)

ファイルがどのようなルールで区切られているかを判別します。 カンマ(,:通常のCSV)、タブ(\t:TSV)、セミコロン(;)などを自動識別します。 文字列がダブルクォーテーション(")で囲まれているかどうかも同時に判断します。

2. ヘッダーの自動推論(Header Detection)

1行目が列名(ヘッダー)なのか、それともデータそのものなのかを判別します。 1行目と2行目以降のデータ型や文字列の傾向を比較し、1行目が列名である確率が高いと判断すれば、自動的にそれを列名として扱います。

3. データ型の自動推論(Type Inference)

各列にどのようなデータが入っているかを分析し、そのデータに適していると判断したデータ型を割り当てます。

  • 整数のみ:「integer」、「bigint」
  • 小数点ありの数値:「double」
  • 日付・時間形式:「date」、「timestamp」
  • その他(文字列など):「varchar」

自動推論の誤判定と対策

サンプルとして読み込まれた部分と、それ以降のデータで傾向が異なるとエラーの原因になります。先頭からある程度の行までは整数だったのに、後ろの方で突然文字列が登場した場合、自動推論されたデータ型に変換できずエラーが発生します。自動推論がうまくいかない場合は、read_csvのパラメーターで挙動を調整できます。

「sample_size = -1」とすると、ファイル全体をサンプルとして読み込んで推論します。 「all_varchar = true」とすると、推論を行わず、すべての列をVARCHAR型として読み込みます。

また、read_csvの自動推論の結果を確認したい場合は、「sniff_csv」を使用できます。

次回もCSVファイル

いかがでしょうか。DuckDBはCSVファイルの取り扱い機能が豊富です。次回もCSVファイルです。機能の詳細について見ていきます。お楽しみに!!

hirocom777.hatenadiary.org

DuckDB学習記事のまとめですはこちらから

表示モード(DuckDB_04)

この連載では、DuckDBについて学んでいきます。前回の記事はこちらになります。

hirocom777.hatenadiary.org

前回は、テーブル操作の基本を確認しました。結論から言うと、テーブル操作は他のデータベースシステムと同様のSQLで操作できます。

今回は、表示モードです。SQLの結果を表示する場合、色々な表示モードがあります。

表示モードの確認

DuckDBの出力結果を表示する際に、表示モードを指定できます。表示モードの指定はドットコマンド「.mode」で行います。以下のように記述します。

.mode 表示モード 

表示モードを指定しないで実行すると、現在の表示モードが確認できます。

PS > duckdb
DuckDB v1.5.5 (Variegata)
Enter ".help" for usage hints.
memory D .mode
current output mode: duckbox

デフォルトでは「duckbox」が選択されています。前回までの出力表示は、表示モードduckboxで表示されたものです。

  • duckbox
    ASCIIアートスタイルの出力形式です。先頭行には列名とデータ型が表示されます。オプション「.large_number_rendering」で大きな数字の表示形式を設定できます。デフォルトは「footer」です。次のSQLを投げた場合の結果を見ていきましょう。
  memory D SELECT pi() * 1000000000 AS A;
  • off
    通常の数値形式で表示されます。

    ┌───────────────────┐
    │         A         │
    │      double       │
    ├───────────────────┤
    │ 3141592653.589793 │
    └───────────────────┘
    
  • footer(デフォルト)
    大きな数値は、実際の値と人が読みやすい形式を併記します。単一行の結果にのみ適用されます。

    ┌───────────────────┐
    │         A         │
    │      double       │
    ├───────────────────┤
    │ 3141592653.589793 │
    │  (3.14 billion)   │
    └───────────────────┘
    
  • all
    大きな数字は、人が読みやすい形式で表示します。

    ┌───────────────┐
    │       A       │
    │     double    │
    ├───────────────┤
    │  3.14 billion │
    └───────────────┘
    

その他の代表的な表示モードについても見ていきましょう。次のSQLを投げた場合の結果を見ていきます。

memory D SELECT 'ABC' AS X , 123 AS Y , pi() * 1000000000 AS Z;
  • box
    Unicodeの枠線文字を使用した表です。
  ┌─────┬─────┬───────────────────┐
  │  X  │  Y  │         Z         │
  ├─────┼─────┼───────────────────┤
  │ ABC │ 123 │ 3141592653.589793 │
  └─────┴─────┴───────────────────┘
  • csv
    CSV形式(カンマ区切り)の表示です。
  X,Y,Z
  ABC,123,3141592653.589793
  • column
    列形式で出力します。
  X    Y    Z
  ---  ---  -----------------
  ABC  123  3141592653.589793
  • html
    HTMLの\タグ内で使用するコードとして出力されます。
      <tr><th>X</th>
      <th>Y</th>
      <th>Z</th>
      </tr>
      <tr><td>ABC</td>
      <td>123</td>
      <td>3141592653.589793</td>
      </tr>
    
    • json
      JSON配列で表示します。
      [{"X":"ABC","Y":123,"Z":3141592653.589793}]
    
    • markdown
      Markdownテーブル形式で表示します。
      |  X  |  Y  |         Z         |
      |-----|----:|------------------:|
      | ABC | 123 | 3141592653.589793 |
    
    • table
      ASCIIアートテーブルで表示します。
      +-----+-----+-------------------+
      |  X  |  Y  |         Z         |
      +-----+-----+-------------------+
      | ABC | 123 | 3141592653.589793 |
      +-----+-----+-------------------+
    
    • tabs
      タブ区切りで表示します。
      X       Y       Z
      ABC     123     3141592653.589793
    
    • trash
      結果を画面に表示しません。

    このように表示モードを変更すると、単に画面上の見た目を変えるだけでなく、CSVやJSONなど、別のツールで利用しやすい形式で結果を出力できます。

    次回はCSV

    いかがでしょうか。適切な表示モードを使うとデータ変換作業などが容易になります。次回はCSVです。DuckDBでは、CSVファイルを色々な形でアクセスできます。お楽しみに!!

    hirocom777.hatenadiary.org

    DuckDB学習記事のまとめですはこちらから

    テーブル操作(DuckDB_03)

    この連載では、DuckDBについて学んでいきます。前回の記事はこちらになります。

    hirocom777.hatenadiary.org

    前回は実際にDuckDBを起動して、データベースファイルの作成、テーブルの作成、CSVファイルの読み込みまで試してみました。

    今回は、テーブル操作です。作成したテーブルを操作します。

    テーブル情報の取得

    前回作成したデータベースファイル「my_database.duckdb」を使用してテーブル操作をしてみようと思います。ファイルの内容を確認してみましょう。 「SHOW TABLES;」と入力すると、テーブルの一覧が表示されます。

    my_database D SHOW TABLES;
    ┌──────────┐
    │   name   │
    │ varchar  │
    ├──────────┤
    │ my_table │
    │ users    │
    └──────────┘

    テーブルの構造を確認するには「DESCRIBE テーブル名」と入力します。

    my_database D DESCRIBE my_table;
    ┌──────────────┐
    │   my_table   │
    │              │
    │ 名前 varchar │
    │ 性別 varchar │
    │ 部署 varchar │
    │ 収入 bigint  │
    └──────────────┘
    my_database D DESCRIBE users;
    ┌──────────────┐
    │    users     │
    │              │
    │ id   integer │
    │ 名前 varchar │
    │ 日付 date    │
    └──────────────┘

    my_tableには3件のデータがあります。usersにはデータがありません。

    my_database D SELECT * FROM my_table;
    ┌─────────┬─────────┬─────────┬────────┐
    │  名前   │  性別   │  部署   │  収入  │
    │ varchar │ varchar │ varchar │ int64  │
    ├─────────┼─────────┼─────────┼────────┤
    │ 田中    │ 男      │ 営業    │ 300000 │
    │ 鈴木    │ 男      │ 開発    │ 400000 │
    │ 佐藤    │ 女      │ 営業    │ 350000 │
    └─────────┴─────────┴─────────┴────────┘

    テーブルの複写

    テーブルを複写する例をご紹介します。

    my_database D CREATE TABLE new_table AS SELECT * FROM my_table;
    my_database D SHOW TABLES;
    ┌───────────┐
    │   name    │
    │  varchar  │
    ├───────────┤
    │ my_table  │
    │ new_table │
    │ users     │
    └───────────┘
    my_database D SELECT * FROM new_table;
    ┌─────────┬─────────┬─────────┬────────┐
    │  名前   │  性別   │  部署   │  収入  │
    │ varchar │ varchar │ varchar │ int64  │
    ├─────────┼─────────┼─────────┼────────┤
    │ 田中    │ 男      │ 営業    │ 300000 │
    │ 鈴木    │ 男      │ 開発    │ 400000 │
    │ 佐藤    │ 女      │ 営業    │ 350000 │
    └─────────┴─────────┴─────────┴────────┘

    コピーする範囲を絞るには、取得するデータを絞ります。以下は、テーブルの構造(定義)だけをコピーする例です。

    CREATE TABLE new_table AS SELECT * FROM my_table LIMIT 0;

    レコードの追加・削除

    レコードの追加には、INSERT文を使用します。以下はレコード追加の例です。

    my_database D INSERT INTO new_table (名前, 性別, 部署, 収入)
                  VALUES ('伊藤', '女', '製造', 380000);

    レコードの削除には、DELETE文を使用します。以下はレコード削除の例です。レコードの指定はWHERE句を使用します。

    my_database D DELETE FROM new_table WHERE 性別 = '男';

    WHERE句を指定しないと、テーブル内のすべてのレコードが削除されます。

    列の追加・削除

    列の追加・削除はALTER TABLE文を使います。追加にはADD COLUMN句を使います。

    my_database D ALTER TABLE new_table ADD COLUMN 役職 INTEGER;

    列は一番右に追加されます。削除にはDROP COLUMN句を使います。

    my_database D ALTER TABLE new_table DROP COLUMN 部署;

    テーブルの削除

    ここまでの処理を実行すると、new_tableの内容は以下のようになります。

    my_database D SELECT * FROM new_table;
    ┌─────────┬─────────┬────────┬───────┐
    │  名前   │  性別   │  収入  │ 役職  │
    │ varchar │ varchar │ int64  │ int32 │
    ├─────────┼─────────┼────────┼───────┤
    │ 佐藤    │ 女      │ 350000 │  NULL │
    │ 伊藤    │ 女      │ 380000 │  NULL │
    └─────────┴─────────┴────────┴───────┘

    テーブルの削除はDROP TABLE文を使います。

    my_database D DROP TABLE new_table;
    my_database D SHOW TABLES;
    ┌──────────┐
    │   name   │
    │ varchar  │
    ├──────────┤
    │ my_table │
    │ users    │
    └──────────┘

    テーブルが削除されました。

    次回は表示モード

    いかがでしょうか。今後DuckDBの挙動を確認していく中で、テーブル操作の基本を確認しました。結論から言うと、テーブル操作は他のデータベースシステムと同様のSQLで操作できます。次回は表示モードです。DuckDBの表示モードについて見ていきます。お楽しみに!!

    hirocom777.hatenadiary.org

    DuckDB学習記事のまとめですはこちらから

    使ってみる(DuckDB_02)

    この連載では、DuckDBについて学んでいきます。前回の記事はこちらになります。

    hirocom777.hatenadiary.org

    前回はDuckDBの概要について触れました。DuckDBとは、SQLite3と同様にローカル環境で使用できるデータベースシステムです。

    今回は、DuckDBを実際に起動して、使ってみようと思います。

    データベースファイルを作る

    DuckDBのデータベースファイルには、決められた拡張子はありません。しかしながら、他のファイルと区別がつかないと不便なので、「.duckdb」としようと思います。データベースファイルを作るには以下のように記述します。

    duckdb ファイル名

    実際の使用例を見てみましょう。

    PS > duckdb my_database.duckdb
    DuckDB v1.5.5 (Variegata)
    Enter ".help" for usage hints.
    my_database D 

    このように表示され、データベースに接続されます。指定したファイルが存在しない場合は、新しいデータベースファイルが作成されます。プロンプトの先頭には、接続しているデータベース名が表示されています。

    テーブルを作成する

    データベースファイルにテーブルを作成してみましょう。他のデータベースシステム同様、SQLのCREATE TABLE文を使ってテーブルを作成できます。

    my_database D CREATE TABLE users (id INT, 名前 VARCHAR, 日付 DATE);
    my_database D SELECT * FROM users;
    ┌───────┬─────────┬──────┐
    │  id   │  名前   │ 日付 │
    │ int32 │ varchar │ date │
    └───────┴─────────┴──────┘
              0 rows 

    作成したテーブルの内容は、SQLのSELECT文を使用して確認できます。空のテーブルが作成されました。

    CSVファイルを読み込む

    CSVファイルを読み込み、その内容からテーブルを作成することもできます。今回は、以下のCSVファイル「Member.csv」を読み込んでみましょう。

    名前,性別,部署,収入
    田中,男,営業,300000
    鈴木,男,開発,400000
    佐藤,女,営業,350000
    my_database D CREATE TABLE my_table AS SELECT * FROM read_csv_auto('Member.csv');
    my_database D SELECT * FROM my_table;
    ┌─────────┬─────────┬─────────┬────────┐
    │  名前   │  性別   │  部署   │  収入  │
    │ varchar │ varchar │ varchar │ int64  │
    ├─────────┼─────────┼─────────┼────────┤
    │ 田中    │ 男      │ 営業    │ 300000 │
    │ 鈴木    │ 男      │ 開発    │ 400000 │
    │ 佐藤    │ 女      │ 営業    │ 350000 │
    └─────────┴─────────┴─────────┴────────┘

    各列のデータ型は自動的に判定できています。

    データ型

    DuckDBで使用されるデータ型のうち、よく使うデータ型をいくつかご紹介します。

    分類 データ型 説明 具体例
    整数 integer, bigint 整数(実行結果では int32, int64と表示される) 1, 42, -100
    浮動小数点 float, double 小数点を含む数値 3.14, -0.005
    固定小数点 decimal(p, s) 固定精度で扱う誤差のない高精度な数値(通貨や売上など) 10500.50
    文字列 varchar, text 可変長のテキストデータ(どちらも同じ扱い) 'Taro', 'こんにちは'
    真偽値 boolean 真(正しい)または 偽(間違い) true, false
    バイナリ blob バイナリデータ(画像やファイルなど) \x00\x01\x02
    日付 date 日付のみ '2026-09-04'
    時刻 time 時刻のみ '08:58:00'
    日時 timestamp 日付と時刻(タイムゾーンなし) '2026-09-04 08:58:00'
    日時(TZ付き) timestamptz タイムゾーン付きの日付と時刻 '2026-09-04 08:58:00+09'
    時間隔 interval 時間の長さや間隔 3 days, 1 month
    リスト list (または 型[]) 同じ型の要素を順序づけて格納 [1, 2, 3]
    構造体 struct 固定のキーと値のペア(値の型が違ってもOK) {'name': 'Taro', 'age': 30}
    マップ map キーと値を組み合わせた辞書型のデータ map(['a', 'b'], [1, 2])
    識別子 uuid 一意のID(識別子) '123e4567-e89b-12d3-a456-426614174000'
    JSON json JSON形式のデータ '{"key": "value"}'

    見慣れない型もありますが、おいおい見ていきたいと思います。

    次回はテーブル操作

    いかがでしょうか。DuckDBの基本的な使い方が、少し見えてきたのではないでしょうか。次回はテーブル操作です。お楽しみに!!

    hirocom777.hatenadiary.org

    DuckDB学習記事のまとめですはこちらから

DuckDBとは(DuckDB_01)

皆さんこんにちは。HiroCom777です。僕は過去にSQLite3について学びながらブログを書いていました。

hirocom777.hatenadiary.org

SQLite3は手軽に使えるデータベースシステムです。ブログを通してデータベースについて多くの学びを得ました。

ところで、最近気になるデータベースシステムを見かけました。「DuckDB」と称するものです。「分析版SQLite3」とのサブタイトルが付いていたりします。SQLite3とは何が違うのでしょうか。

DuckDBとは

DuckDBとは、SQLite3同様のローカル環境で使用できるデータベースシステムです。SQLite3とは何が違うのでしょうか。DuckDBの特徴は以下の通りです。

  • 列指向
    多くのデータベースシステムは行単位で処理を行いますが、DuckDBは列単位の処理が中心です。そのため、大量データの集計や統計・分析処理に最適化されています。半面、高頻度のトランザクション処理(複数のデータ操作をひとまとめの単位で行う処理)は苦手です。

  • 組み込み型データベース
    アプリケーションに組み込んで利用でき、データベースサーバーを別途起動する必要がありません。

  • 豊富なデータ形式に対応
    CSV、JSON、Parquetなど、多くのデータ形式に対応しています。データをDuckDB用に変換することなく、直接読み込んでクエリを実行できます。

オフラインで使用可能なデータベースシステムにはSQLite3やMicrosoftのAccessなどがあります。これらは行指向のデータベースで、データの登録・更新・検索などを手軽に行える一方、大量のデータを対象とした集計や分析処理に特化したデータベースではありません。

一方、データ分析を得意とするBigQueryなどのクラウド型データウェアハウスは、サーバーを自分で管理する必要がない反面、基本的にはクラウド上で利用します。

つまり、DuckDBはオフラインで動作するデータ分析向けのデータベースシステムに位置付けられます。DuckDBは列指向を採用しており、とくに大量のデータを対象とした集計や統計・分析処理を効率的に実行できるよう設計されています。

インストール

それでは早速使ってみましょう。以下のサイトでダウンロードできます。

duckdb.org

私の環境はWindows11です。「duckdb_cli-windows-amd64.zip」をダウンロードして解凍すると「duckdb.exe」が現れるので、任意のフォルダーに配置しましょう。フォルダーのパスを設定すれば使用可能です。アンインストールする際には、このファイルとフォルダーを削除してパス設定も削除してください。

PowerShellなどで以下のように入力して起動してみましょう。

PS > duckdb
DuckDB v1.5.5 (Variegata)
Enter ".help" for usage hints.
memory D

DuckDBのCLI(Command Line Interface)が起動しました。この時点では、バージョンは1.5.5が表示されています。 「D」はDuckDBのプロンプトを表す記号です。この表示の後にコマンドを入力して操作します。その前の「memory」はDuckDBがインメモリデータベースで起動していることを示します。

使用方法のヒントを表示するには「.help」と入力します。

memory D .help
.bail on|off                             Stop after hitting an error.  Default OFF
.binary on|off                           Turn binary output on or off.  Default OFF
                                  ・
                                  ・
                                  ・

出力が長くなるので冒頭部分のみ表示します。「.」で始まるコマンドの一覧が表示されました。これらは「ドットコマンド」と呼ばれるものでDuckDB CLIで使用できる特別なコマンドです。.helpもドットコマンドです。

表示の最終行には以下のように表示されます。

Run .help --all for extended information
Run .help shortcuts for keyboard shortcuts

「.help --all」と入力すると、詳しい情報が表示されます。「.help shortcuts」と入力すると、CLIのショートカット一覧が表示されます。

CLIを終了するにはドットコマンド「.exit」か「.quit」を入力します。「Ctrl + D」でも可能です。

次回から使ってみる

いかがでしょうか。今回はDuckDBの概要とCLIの基本操作を確認しました。次回からは実際にデータベースシステムとして使ってみたいと思います。お楽しみに!!

hirocom777.hatenadiary.org

DuckDB学習記事のまとめですはこちらから