matlab-read-database について
MATLAB Database Toolboxを使うユーザー向けのスキルです。フィルター、列選択、重複除外、結合をリレーショナルデータベース側で実行する方法を案内します。
主な機能
- 01テーブルとSQLクエリのインポート
- 02データベース側での行フィルター
- 03列選択と重複除外
- 042テーブル結合とSQLへの切り替え
- 05接続確認と終了処理
活用シーン
- 01フィルター済みテーブルデータのインポート
- 02分析に必要な列だけの読み込み
- 032テーブルを結合して結果を絞り込む
- 04複数テーブル結合や集約クエリの処理
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ matlab/ matlab-agentic-toolkit --skill matlab-read-databaseインストール後、Claude Code で/matlab-read-databaseを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
manifest.yamlreference/INDEX.mdreference/cards/import-options.mdpushdown-joins.mdsqlread-fetch.md詳細
MATLAB Database Toolbox のプッシュダウン設計者
MATLAB Database Toolbox のプッシュダウン機能を使ってリレーショナルデータベースからデータをインポートする場合に使用します。行のフィルター処理、列の選択、重複の除外、結合を MATLAB で処理するのではなく、データベースにオフロードします。
このスキルを使用する場合
- データベーステーブルまたは SQL クエリから MATLAB テーブルとしてデータをインポートする
- データベーステーブルまたは SQL クエリから行をフィルターする
- データベーステーブルまたは SQL クエリから特定の列を選択する
- データベーステーブルまたは SQL クエリ内の重複行を除外する
- 2 つのデータベーステーブルを結合する
- 結合とフィルター処理または列の選択を組み合わせる
- ユーザーが次のキーワードに言及している場合:import、sqlread、fetch、filter、rowfilter、join、sqlinnerjoin、sqlouterjoin、duplicates、databaseImportOptions、pushdown
使用しない場合
- データベースへのデータの書き込み/挿入 — 代わりに
sqlwrite/sqlupdate/executeのパターンを使用します - データが大きすぎてメモリに収まらない —
DatabaseDatastoreと tall 配列、またはsplitsqlqueryを使用します - クラスマッピングを使用したオブジェクト指向の読み込み — ORM(
Mappableクラスでormread)を使用します - MongoDB、Cassandra、Neo4j のクエリ — プッシュダウン関数はリレーショナルデータベースでのみ動作します
重要なルール
プッシュダウンの方針
- 必ずテーブルには
sqlread、SQL クエリにはfetchを使用します。 - 必ず
RowFilterを使用して行のフィルター処理をデータベースにプッシュダウンします。絶対にすべての行をインポートしてから MATLAB でフィルター処理してはいけません。 - 必要な列が一部だけの場合は、必ず
SelectedVariableNamesを指定してdatabaseImportOptionsを使用します。 - 操作の前に 必ず
isopen(conn)で接続を確認し、完了後にclose(conn)を呼び出します。
結合
- データベーステーブルをちょうど 2 つ結合する場合は、必ず
sqlinnerjoin/sqlouterjoinを使用します。 - 絶対に
databaseImportOptions(opts)をsqlinnerjoinまたはsqlouterjoinに渡してはいけません。これらの関数は受け付けません。結合後に MATLAB で列を選択するか、明示的な SQL を指定してfetchを使用します。 - 3 つ以上のテーブルを結合する場合や、集計を伴う結合では、絶対にプッシュダウン結合を使用してはいけません。代わりに明示的な SQL を指定して
fetchを使用します。
関数リファレンス
各関数が受け付けるもの
| 関数 | opts を受け付けるか | RowFilter を受け付けるか | MaxRows を受け付けるか | 列の選択 |
|---|---|---|---|---|
sqlread | はい | はい | はい | opts.SelectedVariableNames で指定 |
fetch | はい | はい | はい | opts.SelectedVariableNames で指定 |
sqlinnerjoin | いいえ | はい | はい | 非対応 — 結合後に列を選択 |
sqlouterjoin | いいえ | はい | はい | 非対応 — 結合後に列を選択 |
パラメーターの詳細については、reference/cards/pushdown-joins.md と reference/cards/import-options.md を参照してください。
判断の指針
どの関数を使えばよいですか?
| 状況 | 使用するもの | 理由 |
|---|---|---|
| 単一のテーブルからインポートする | sqlread | フィルター/列の選択を DB にプッシュダウンします |
| SQL クエリからインポートする | fetch | DB で任意の SQL を実行します |
| テーブルをちょうど 2 つ結合する(列の選択が不要) | sqlinnerjoin / sqlouterjoin | 結合は DB で実行されます |
| 2 つのテーブルを結合し、特定の列を選択する | sqlinnerjoin + MATLAB での列の選択 | 結合関数は opts を受け付けません |
| 2 つのテーブルを結合し、列を選択して重複を除外する | 明示的な SQL を指定した fetch | プッシュダウン結合では opts や DISTINCT を処理できません |
| 3 つ以上のテーブルを結合する、または集計を使用する | 明示的な SQL を指定した fetch | プッシュダウン結合は 2 つのテーブルに制限されます |
ExcludeDuplicates が必要 | opts を指定した sqlread/fetch | databaseImportOptions を受け付けるのはこれらの関数のみです |
完全な例
詳しい例については、ナレッジカードを参照してください。
- フィルター処理を伴う単一テーブルのインポート:
reference/cards/sqlread-fetch.md - 列の選択と重複の除外:
reference/cards/import-options.md - フィルター処理を伴う 2 テーブルの結合:
reference/cards/pushdown-joins.md - 複雑な複数テーブルの結合:
reference/cards/pushdown-joins.md(SQL へのフォールバックのセクション)
よくある間違い
% INCORRECT — passing import options to join functions (error!)
opts = databaseImportOptions(conn, "orders");
result = sqlinnerjoin(conn, "orders", "items", opts); % Error!
% CORRECT — join first, then select columns from the result
result = sqlinnerjoin(conn, "orders", "items", Keys="order_id");
result = result(:, ["order_id", "product", "quantity", "total"]);
% INCORRECT — using fetch without pushdown (pulls all data, filters in MATLAB)
data = fetch(conn, "SELECT * FROM orders");
filtered = data(data.total > 100, :);
% CORRECT — push the filter to the database
opts = databaseImportOptions(conn, "orders");
opts.RowFilter = opts.RowFilter.total > 100;
data = sqlread(conn, "orders", opts);
ベストプラクティス
- 簡単なフィルタリングには、
RowFilterを名前と値の引数としてsqlread/fetch/sqlinnerjoin/sqlouterjoinに直接指定します。列の選択や重複排除も必要な場合は、opts.RowFilterを使用します。 fetchでSQLクエリにRowFilterを重ねると、RowFilterの条件はSQLのWHERE句に加えて適用されます。同じ条件を両方に重複して指定しないでください。- 対象がちょうど2つのテーブルで、列の選択や集計が不要な場合は、JOIN SQLを手動で記述するより
sqlinnerjoin/sqlouterjoinを使用してください。 - JOINと列の選択を行う場合は、データ量に応じて選択してください。追加する列が少ない場合は、JOINしてからMATLABで列を選択します。テーブルの列数が多くデータ量も大きい場合は、
fetchで明示的なSQLを指定して、データベース上で列を選択します。 - 列数が50を超えるテーブルでは、必ず
SelectedVariableNamesを使用して列を絞り込みます。メモリに収まらない10万行を超える結果セットには、tall配列でDatabaseDatastoreを使用するか、メモリ外処理にsplitsqlqueryを使用します。
よくあるパターン
パターン1:単一テーブル — フィルター+列の選択
opts = databaseImportOptions(conn, "orders");
opts.SelectedVariableNames = ["OrderKey", "OrderStatus"];
opts.RowFilter = opts.RowFilter.OrderPriority == "URGENT";
T = sqlread(conn, "orders", opts);
パターン2:2テーブルのJOIN — フィルターのみ
rf = rowfilter("ShipMode");
T = sqlinnerjoin(conn, "orders", "lineitem", Keys="OrderKey", RowFilter=rf.ShipMode == "AIR");
パターン3:2テーブルのJOIN — フィルター+列の選択(JOIN後)
rf = rowfilter(["OrderPriority", "ShipMode"]);
T = sqlinnerjoin(conn, "orders", "lineitem", Keys="OrderKey", ...
RowFilter=rf.OrderPriority == "URGENT" & rf.ShipMode == "AIR");
result = T(:, ["OrderKey", "OrderStatus"]);
パターン4:複雑なクエリではSQLに切り替える
sqlquery = "SELECT o.OrderKey, o.OrderStatus " + ...
"FROM orders o INNER JOIN lineitem l ON o.OrderKey = l.OrderKey " + ...
"WHERE o.OrderPriority = 'URGENT' AND l.ShipMode = 'AIR'";
T = fetch(conn, sqlquery);
パターン5:エラー処理を含む安全なインポート
try
opts = databaseImportOptions(conn, "orders");
opts.SelectedVariableNames = ["id", "total", "status"];
opts.RowFilter = opts.RowFilter.total > 100;
data = sqlread(conn, "orders", opts);
catch ME
warning("Import failed: %s", ME.message);
data = table.empty;
end
チェックリスト
プッシュダウンインポートのコードを仕上げる前に、次の点を確認してください。
- データベーステーブルには
sqlreadを、SQLクエリにはfetchを使用している - 行フィルターには
RowFilterパラメーターを使用しており(データベースにプッシュダウンされる)、クライアント側でフィルタリングしていない -
databaseImportOptionsのSelectedVariableNamesを使用して、必要な列のみを選択している -
databaseImportOptionsをsqlinnerjoinまたはsqlouterjoinに渡していない - 重複排除にはMATLABの
unique()ではなくExcludeDuplicatesを使用している - JOINには
sqlinnerjoin/sqlouterjoinを使用している(テーブルは2つまで、optsなし) - 複雑なクエリ(テーブルが3つ以上、集計、JOINと列の選択)には、SQLを指定した
fetchを使用している - 接続の試行後に
isopen(conn)を確認している - 最後に
close(conn)を呼び出している
トラブルシューティング
問題:databaseImportOptionsを渡すとsqlinnerjoinでエラーが発生する
- 解決策:
sqlinnerjoinとsqlouterjoinはdatabaseImportOptionsを受け付けません。呼び出しからoptsを削除してください。JOIN後にMATLABで列を選択するか、明示的なSQLを指定してfetchを使用します。
問題:RowFilterが反映されず、すべての行が返される
- 解決策:
rowfilter("ColName")の列名がデータベースの列名と完全に一致していることを確認してください(データベースによっては大文字と小文字が区別されます)。
問題:「Key variable not found」というエラーがsqlinnerjoinで発生する
- 解決策:
Keysの値は、両方のテーブルに存在する列名と一致している必要があります。sqlfind(conn, "tableName")を使用して列名を確認してください。
問題:SQLクエリでdatabaseImportOptionsのエラーが発生する
- 解決策:SQLクエリが有効で、結果を返すことを確認してください。
databaseImportOptionsはメタデータクエリを実行します。基になるクエリに構文エラーがあると失敗します。
問題:ExcludeDuplicatesで想定どおりに重複が削除されない
- 解決策:
ExcludeDuplicatesは、選択したすべての変数の組み合わせに適用されます。先にSelectedVariableNamesで列を絞り込んでから、ExcludeDuplicates = trueを設定してください。
問題:sqlouterjoinが想定外のNULLを返す
- 解決策:外部JOINでは、一致しない行がNULLで埋められて含まれます。これはSQLの想定された動作です。JOIN後に行を除外するには
RowFilterを使用するか、一致する行のみが必要な場合はsqlinnerjoinに切り替えてください。
Copyright 2026 The MathWorks, Inc.