MySQL 6 min read

MySQLでテーブル一覧を表示する ― SHOW TABLESとinformation_schema、ERROR 1046

MySQL のテーブル一覧は SHOW TABLES で出せます。先にデータベースを選んでおく必要があります。この記事の出力は MySQL 8.4.6 で採りました。

まず見る(結論)

  • USE データベース名; の後に SHOW TABLES;
  • 選ばずに見るなら SHOW TABLES FROM データベース名;
  • ビューと区別するなら SHOW FULL TABLES;
  • サイズや行数も見るなら information_schema.tables

SHOW TABLES

データベースを選ばずに実行すると、ERROR 1046 になります。

mysql> SHOW TABLES;
ERROR 1046 (3D000): No database selected

USE で選んでから実行します。

mysql> USE sugdb;
mysql> SHOW TABLES;
+-----------------+
| Tables_in_sugdb |
+-----------------+
| customers       |
| orders          |
| v_orders        |
+-----------------+

v_orders はビューですが、表と同じように並びます。区別したいときは FULL を付けます。

mysql> SHOW FULL TABLES;
+-----------------+------------+
| Tables_in_sugdb | Table_type |
+-----------------+------------+
| customers       | BASE TABLE |
| orders          | BASE TABLE |
| v_orders        | VIEW       |
+-----------------+------------+

別のデータベース・名前で絞る

FROM でデータベースを指定すると、USE しなくても見られます。LIKE で名前を絞れます(% は任意の文字列)。

mysql> SHOW TABLES FROM mysql LIKE 'time%';
+---------------------------+
| Tables_in_mysql (time%)   |
+---------------------------+
| time_zone                 |
| time_zone_leap_second     |
| time_zone_name            |
| time_zone_transition      |
| time_zone_transition_type |
+---------------------------+

コマンドラインから1行で出すなら mysql -u root -p -e "SHOW TABLES" sugdb のように、最後にデータベース名を付けます。

information_schema.tables でサイズや行数も出す

mysql> SELECT table_name, table_type, engine, table_rows,
    ->        ROUND((data_length + index_length) / 1024 / 1024, 2) AS mb
    ->   FROM information_schema.tables
    ->  WHERE table_schema = 'sugdb';
+------------+------------+--------+------------+------+
| TABLE_NAME | TABLE_TYPE | ENGINE | TABLE_ROWS | mb   |
+------------+------------+--------+------------+------+
| customers  | BASE TABLE | InnoDB |          5 | 0.02 |
| orders     | BASE TABLE | InnoDB |          5 | 0.03 |
| v_orders   | VIEW       | NULL   |       NULL | NULL |
+------------+------------+--------+------------+------+

InnoDB の TABLE_ROWS は統計からの見積もりで、正確な件数ではありません。行数が多い表では SELECT COUNT(*) と大きく違うことがあります。正確な数が要るときは COUNT(*) を使います。

table_schema の条件を外すと、全データベースの表が出ます。mysql、sys、information_schema、performance_schema はシステム用です。自分の表だけを見るなら WHERE table_schema NOT IN (...) で除きます。

関連