データベースのテーブル設計を調査しているとき、「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 ...):- 普通の
ANDをWHERE句で使うと「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) 環境などで「あのデータどこだっけ?」とテーブルを探す際、カラム名をヒントに検索できるこのクエリは非常に強力です。ぜひテンプレートとしてストックしてお役立てください!


