データベースのテーブル設計を調査しているとき、「id 系のカラムと title 系のカラムが両方入っているテーブルを一覧で出したい」という場面はありませんか?

テーブル数が多いと一つずつ確認するのは大変ですが、information_schema を活用すれば、一瞬で抽出可能です。今回は、特定のキーワードを含むカラムが共存するテーブルを探す便利なSQLを紹介します。

1. 実行するSQLクエリ

以下のクエリをSQLエディタ(MySQL WorkbenchやDBeaver、A5:SQL Mk-2など)で実行してください。

SELECT 
    TABLE_SCHEMA AS 'データベース名', 
    TABLE_NAME AS 'テーブル名',
    -- ヒットしたカラム名をまとめて表示(確認用)
    GROUP_CONCAT(DISTINCT COLUMN_NAME SEPARATOR ', ') AS '対象カラム'

FROM 
    information_schema.COLUMNS

WHERE 
    -- システム系DBを除外
    TABLE_SCHEMA NOT IN ('information_schema', 'mysql', 'performance_schema', 'sys')
    -- 検索したいキーワードをここで指定
    AND (COLUMN_NAME LIKE '%target_id%' OR COLUMN_NAME LIKE '%title%')

GROUP BY 
    TABLE_SCHEMA, 
    TABLE_NAME

HAVING 
    -- 1つ目のキーワードを含むカラムが1つ以上あること
    SUM(CASE WHEN COLUMN_NAME LIKE '%target_id%' THEN 1 ELSE 0 END) > 0
    AND 
    -- 2つ目のキーワードを含むカラムが1つ以上あること
    SUM(CASE WHEN COLUMN_NAME LIKE '%title%' THEN 1 ELSE 0 END) > 0;

2. クエリの解説

このクエリのポイントは、HAVING 句で「条件の掛け合わせ」を行っている点です。

  • information_schema.COLUMNS: データベース内の全カラム情報が格納されているメタデータです。
  • GROUP BY: テーブル単位で集計することで、複数のカラムを横断的にチェックできるようにしています。
  • SUM(CASE WHEN ...):
    • 普通の ANDWHERE 句で使うと「1つのカラムが両方の名前を持つ」という矛盾した条件になります。
    • この書き方(Conditional Aggregation)をすることで、「カラムAが条件1を満たし、かつカラムBが条件2を満たす」というテーブル単位の絞り込みが可能になります。

3. カスタマイズのヒント

  • 特定のDBだけに絞りたい場合 WHERE 句に AND TABLE_SCHEMA = 'your_db_name' を追加してください。
  • 3つ以上の条件にしたい場合 WHERE 句の OR を増やし、HAVING 句に同様の SUM(CASE...) > 0 を追加すればOKです。

まとめ

Aurora (MySQL) 環境などで「あのデータどこだっけ?」とテーブルを探す際、カラム名をヒントに検索できるこのクエリは非常に強力です。ぜひテンプレートとしてストックしてお役立てください!


この記事が気に入ったら『目黒で働く分析担当の作業メモ』ご支援をお願いします!

※OFUSEに飛びます


おすすめの記事