MySQL
 Computer >> コンピューター >  >> プログラミング >> MySQL

MySQLですべてのデータベースと各データベースの全テーブルを一覧表示する方法

INFORMATION_SCHEMAを使って一括取得する方法

MySQLでは通常、SHOW DATABASES;SHOW TABLES;コマンドを使って個別に確認できますが、「サーバー上のすべてのデータベース」と「それぞれのデータベースに属するすべてのテーブル」を一度に取得したい場合は、INFORMATION_SCHEMAを利用するのが効果的です。

基本となる構文は以下の通りです。

SELECT my_schema.SCHEMA_NAME, GROUP_CONCAT(tbl.TABLE_NAME)
FROM information_schema.SCHEMATA my_schema
LEFT JOIN information_schema.TABLES tbl
  ON my_schema.SCHEMA_NAME = tbl.TABLE_SCHEMA
GROUP BY my_schema.SCHEMA_NAME;

クエリのポイント

  • information_schema.SCHEMATA: サーバー上に存在するすべてのデータベース(スキーマ)の一覧を保持するテーブルです。
  • information_schema.TABLES: 各データベースに含まれるテーブルの情報を保持しています。
  • GROUP_CONCAT(): グループごとにテーブル名をカンマ区切りの文字列として連結します。
  • LEFT JOIN: 内部結合ではなくLEFT JOINを使うことで、テーブルが1つも存在しない空のデータベースも結果に表示されます(この場合NULLが返ります)。

実行例

実際に上記のクエリを実行してみましょう。

mysql> SELECT my_schema.SCHEMA_NAME, GROUP_CONCAT(tbl.TABLE_NAME)
    -> FROM information_schema.SCHEMATA my_schema
    -> LEFT JOIN information_schema.TABLES tbl
    ->   ON my_schema.SCHEMA_NAME = tbl.TABLE_SCHEMA
    -> GROUP BY my_schema.SCHEMA_NAME;

実行すると、データベース名とそれに対応するテーブル一覧が出力されます。実際の出力は非常に長くなるため、ここでは一部を抜粋して紹介します。

+----------------------+------------------------------------------------------------------+
| SCHEMA_NAME          | GROUP_CONCAT(tbl.TABLE_NAME)                                     |
+----------------------+------------------------------------------------------------------+
| bothinnodbandmyisam  | employee,gradedemo,student,student_information                   |
| business             | addconstraintdemo,addonedaydemo,autoincrementtozero,college,...  |
| commandline          | caseinsensitivedistinctdemo,insertmaxplus1demo,instructor,...    |
| customer-tracker     | NULL                                                             |
| customer_tracker_database | NULL                                                        |
| demo                 | mytable                                                          |
| education            | student,university                                               |
| hb_student_tracker   | demotable194,demotable202,demotable210,student,...               |
| hello                | NULL                                                             |
| information_schema   | COLUMNS,INNODB_CMP,VIEWS,ENGINES,TABLES,SCHEMATA,TRIGGERS,...    |
| mysql                | db,help_category,user,tables_priv,time_zone,func,...             |
| performance_schema   | accounts,cond_instances,events_statements_current,threads,...    |
| rdb                  | boy,girl                                                         |
| sample               | accumulateddemo,autoincrementdemo,columndoesnotexists,...        |
| sys                  | host_summary_by_file_io,schema_object_overview,user_summary,...  |
| test                 | customers,studentinfo,dateformatdemo,decimaldemo,...             |
| test3                | groupwithtopndemo,productdemo,studentinformation,posts,...       |
| tracker              | preventnegativenumbers                                           |
| web                  | demotable492,DemoTable,demotable605,select,demotable484,...      |
| web_tracker          | NULL                                                             |
+----------------------+------------------------------------------------------------------+
36 rows in set, 6 warnings (0.18 sec)

結果の読み方

この出力からは、以下のことが確認できます。

  • テーブルを持つデータベースには、そのすべてのテーブル名がカンマ区切りで表示されます。
  • 「customer-tracker」や「hello」など、テーブルを1つも持たないデータベースには「NULL」が表示されます。
  • information_schema、mysql、performance_schema、sysといったシステムデータベースも一覧に含まれます。これらを除外したい場合は、WHERE句でmy_schema.SCHEMA_NAME NOT IN ('information_schema','mysql','performance_schema','sys')のように条件を追加するとよいでしょう。

補足: テーブル数が多い場合の注意点

システム変数group_concat_max_lenのデフォルト値(1024バイト)を超えると、テーブル一覧が途中で切り捨てられます。多数のテーブルを持つデータベースを完全に表示したい場合は、事前に以下のように上限値を引き上げておきましょう。

SET SESSION group_concat_max_len = 1000000;

まとめ

INFORMATION_SCHEMAのSCHEMATAとTABLESを結合し、GROUP_CONCATを組み合わせることで、すべてのデータベースと各データベースの全テーブルをたった1つのクエリで効率よく確認できます。空のデータベースも漏れなく表示したい場合は、LEFT JOINを使用するのがポイントです。

  1. MySQLでデータベースやテーブルの情報を取得する方法|SHOW・DESCRIBEの使い方を解説

    はじめにデータベース名やテーブル名、テーブルの構造、カラム名などをうっかり忘れてしまうことは、開発現場でよくあることです。MySQLでは、データベースやテーブルに関する情報を取得するための便利なステートメントが多数用意されているため、このような問題も簡単に解決できます。本記事では、代表的な情報取得コマンドである「SHOW DATABASES」「DATABASE()」「SHOW TABLES」「DESCRIBE」の使い方を順番に解説します。サーバーが管理するデータベースの一覧を表示する「SHOW DATABASES」クエリを使うと、サーバーが管理しているすべてのデータベースの一覧を表示できます。

  2. PythonでMySQLのデータベースやサーバー内の全テーブル一覧を取得・表示する方法

    開発を進めていると、データベース内に存在するすべてのテーブルの一覧を確認したい場面があります。そんなときに役立つのが SHOW TABLES コマンドです。SHOW TABLES コマンドを使うことで、特定のデータベース内のテーブル名だけでなく、サーバー全体に存在するテーブル名も表示できます。基本構文データベース内のテーブルを表示する場合は、次のように記述します。SHOW TABLESこのステートメントをカーソルオブジェクト経由で実行すると、データベース内に存在するテーブル名が返されます。一方、サーバー全体のテーブルを表示する場合は、information_schema を参照します。SELE