MySQL SHOW TABLES
コマンド徹底解説 – データベースのテーブル一覧を表示する基本から応用まで
はじめに
リレーショナルデータベースを操作する上で、そのデータベース内にどのようなテーブルが存在するのかを把握することは、あらゆる作業の第一歩となります。データの参照、更新、テーブル構造の確認、バックアップ、移行など、どの作業を開始するにも、まず対象となるテーブルの名前を知る必要があります。
MySQLにおいて、この「データベース内のテーブル一覧を表示する」という目的を果たすための最も基本的で重要なコマンドが SHOW TABLES
です。このコマンドはシンプルでありながら、様々なオプションを組み合わせることで、特定の条件に一致するテーブルだけを表示したり、異なるデータベースのテーブルを一覧したりといった柔軟な使い方が可能です。
本記事では、MySQLの SHOW TABLES
コマンドについて、その最も基本的な使い方から、FROM
、LIKE
、WHERE
といった句を使った応用的な絞り込み方法、さらにはコマンド実行に必要な権限や内部的な仕組み、そして関連するコマンドとの連携に至るまで、詳細かつ網羅的に解説します。約5000語という十分なボリュームを使い、初心者の方でも理解できるように、豊富な例を交えながら丁寧に説明を進めます。
データベース操作のスキル向上を目指すすべての方にとって、この記事が SHOW TABLES
コマンドをマスターするための決定的な一歩となることを願っています。
SHOW TABLES
コマンドの基本
まずは、SHOW TABLES
コマンドの最も基本的な使い方から見ていきましょう。
基本構文
SHOW TABLES;
これが SHOW TABLES
コマンドの最もシンプルな形です。このコマンドを実行すると、現在選択されている(使用中の)データベースに含まれるすべてのテーブルの名前が一覧表示されます。
実行方法
SHOW TABLES;
コマンドは、MySQLサーバーに接続した後に、様々なMySQLクライアントから実行できます。最も一般的なのは、コマンドラインインターフェースの mysql
クライアントです。
-
MySQLサーバーに接続:
bash
mysql -u ユーザー名 -p
パスワードを求められるので入力します。 -
データベースを選択(任意):
サーバーに接続した直後は、特定のデータベースが選択されていないことがあります。SHOW TABLES;
を実行する前に、対象のデータベースを選択しておくと便利です。
sql
USE データベース名;
例えば、mydatabase
という名前のデータベースを使いたい場合はUSE mydatabase;
となります。 -
SHOW TABLES;
の実行:
データベースを選択したら、いよいよSHOW TABLES;
コマンドを実行します。
sql
SHOW TABLES;
エンターキーを押すと、そのデータベース内のテーブル一覧が表示されます。
その他のクライアント(MySQL Workbench、phpMyAdmin、DBeaverなど)でも、SQL実行画面やクエリエディタに SHOW TABLES;
と入力して実行することで、同様の結果が得られます。
実行結果の解釈
SHOW TABLES;
コマンドの実行結果は、通常、単一のカラムを持つ結果セットとして表示されます。このカラムの名前は、MySQLのバージョンや設定によって異なりますが、一般的にはデータベース名の後に Tables_in_データベース名
のような形式となります。
例:
データベース sakila
を使用している場合:
sql
USE sakila;
SHOW TABLES;
実行結果の例:
+----------------------------+
| Tables_in_sakila |
+----------------------------+
| actor |
| actor_info |
| address |
| category |
| city |
| country |
| customer |
| customer_list |
| film |
| film_actor |
| film_category |
| film_list |
| film_text |
| inventory |
| language |
| nice_customer_list |
| payment |
| rental |
| staff |
| staff_list |
| store |
+----------------------------+
21 rows in set (0.00 sec)
この例では、sakila
データベースには21個のテーブル(ビューを含む)が存在し、その名前がリストアップされています。カラム名が Tables_in_sakila
となっている点に注目してください。これは、どのデータベースのテーブルが表示されているかを示しています。
MySQL 5.1.7以降のバージョンでは、SHOW FULL TABLES;
と実行すると、テーブル名だけでなく、その種別(BASE TABLE
または VIEW
など)も表示されるようになります。
例:
sql
SHOW FULL TABLES;
実行結果の例 (一部):
+----------------------------+------------+
| Tables_in_sakila | Table_type |
+----------------------------+------------+
| actor | BASE TABLE |
| actor_info | VIEW |
| address | BASE TABLE |
| category | BASE TABLE |
| city | BASE TABLE |
| country | BASE TABLE |
| customer | BASE TABLE |
| customer_list | VIEW |
| film | BASE TABLE |
| film_actor | BASE TABLE |
| film_category | BASE TABLE |
| film_list | VIEW |
| film_text | BASE TABLE |
| inventory | BASE TABLE |
| language | BASE TABLE |
| nice_customer_list | VIEW |
| payment | BASE TABLE |
| rental | BASE TABLE |
| staff | BASE TABLE |
| staff_list | VIEW |
| store | BASE TABLE |
+----------------------------+------------+
21 rows in set (0.00 sec)
Table_type
カラムが追加され、それぞれの行が通常のテーブル(BASE TABLE
)なのか、ビュー(VIEW
)なのか、あるいはシステムビュー(SYSTEM VIEW
)、一時テーブル(TEMPORARY TABLE
)なのかが判別できます。これは、特に複雑なデータベース構造を理解する上で非常に役立ちます。
カレントデータベースについて
前述の通り、基本的な SHOW TABLES;
コマンドは、現在選択されている「カレントデータベース」のテーブルを表示します。
-
カレントデータベースの確認:
SELECT DATABASE();
コマンドで確認できます。
sql
SELECT DATABASE();
結果がNULL
であれば、どのデータベースも選択されていません。データベース名が表示されれば、それがカレントデータベースです。 -
カレントデータベースの変更:
USE データベース名;
コマンドで変更できます。
sql
USE mydatabase;
このコマンドを実行すると、それ以降に実行されるテーブル操作コマンド(SELECT
,INSERT
,UPDATE
,DELETE
,SHOW TABLES
など)は、明示的に他のデータベースを指定しない限り、mydatabase
に対して実行されます。
したがって、SHOW TABLES;
を実行する際は、どのデータベースが選択されているかを意識することが重要です。
SHOW TABLES
コマンドのオプション – FROM
句
デフォルトではカレントデータベースのテーブルが表示されますが、特定のデータベースのテーブル一覧を、カレントデータベースを変更せずに表示したい場合があります。このような場合に FROM
句を使用します。
構文
SHOW TABLES FROM データベース名;
または
SHOW TABLES IN データベース名;
FROM
と IN
は同義です。どちらを使っても同じ結果が得られます。
なぜこれが必要か
- 現在作業しているデータベースはそのままに、別のデータベースの構造を確認したい場合。
- 複数のデータベースのテーブル一覧を連続して確認したい場合。
- スクリプトなどで、事前に
USE
コマンドを発行せずに、特定のデータベースのテーブル一覧を取得したい場合。
実行例
例えば、カレントデータベースが sakila
であっても、world
データベースのテーブル一覧を見たい場合、FROM
句を使います。
sql
USE sakila; -- 現在のデータベースは sakila
SHOW TABLES FROM world;
実行結果の例:
+-----------------------+
| Tables_in_world |
+-----------------------+
| city |
| country |
| countrylanguage |
+-----------------------+
3 rows in set (0.00 sec)
このように、カレントデータベースが sakila
のままでも、world
データベース内の city
, country
, countrylanguage
というテーブルが一覧表示されました。カラム名も Tables_in_world
となり、対象データベースが明確に示されています。
権限に関する注意点
SHOW TABLES FROM dbname;
を実行するには、指定したデータベース(dbname
)に対する何らかの権限が必要です。通常、そのデータベース内のテーブルに対して SELECT
権限など、何らかの操作権限があれば SHOW TABLES
を実行できます。しかし、権限がないデータベースを指定した場合や、指定したデータベース内にユーザーが表示を許可されていないテーブルしかない場合は、結果が表示されないか、あるいは表示されるテーブルが制限される可能性があります。
権限については後述のセクションでより詳しく解説します。
SHOW TABLES
コマンドのオプション – LIKE
句
特定の名前のパターンに一致するテーブルのみを表示したい場合は、LIKE
句を使用します。これは、テーブルの数が多く、目的のテーブルを名前の一部から絞り込みたい場合に非常に便利です。
構文
SHOW TABLES [FROM データベース名] LIKE 'パターン';
[FROM データベース名]
は省略可能です。省略した場合はカレントデータベースが対象となります。
LIKE
句では、標準SQLのパターンマッチングで使用されるワイルドカードが利用できます。
%
: 0文字以上の任意の文字列に一致します。_
: 1文字の任意の文字に一致します。
ワイルドカードの使用例
具体的な使用例を見ていきましょう。
-
特定の接頭辞を持つテーブル: 名前の先頭が
cust
で始まるすべてのテーブルを表示します。
sql
SHOW TABLES LIKE 'cust%';
例:customer
,customer_list
などが一致します。 -
特定の接尾辞を持つテーブル: 名前の末尾が
list
で終わるすべてのテーブルを表示します。
sql
SHOW TABLES LIKE '%list';
例:customer_list
,film_list
,staff_list
,nice_customer_list
などが一致します。 -
特定の文字列を含むテーブル: 名前に
film
という文字列が含まれるすべてのテーブルを表示します。
sql
SHOW TABLES LIKE '%film%';
例:film
,film_actor
,film_category
,film_list
,film_text
などが一致します。 -
特定のパターンに一致するテーブル: 名前の形式が
table_
で始まり、その後に任意の1文字、そしてs
が続くテーブルを表示します。
sql
SHOW TABLES LIKE 'table\__s'; -- 例:table_Xs に一致
_
は1文字に一致するので、例えばtable_A_s
は一致しますが、table_AB_s
は一致しません。 -
名前の途中に特定の文字が含まれるテーブル: 名前の5文字目が
_
であるテーブルを表示します。
sql
SHOW TABLES LIKE '____\_%'; -- 4つの _ とそれに続く _ で5文字目
例:actor_info
,film_actor
などが一致します。 -
ワイルドカード文字自体を検索したい場合: テーブル名に
%
や_
という文字自体が含まれているテーブルを検索したい場合は、バックスラッシュ(\
)を使ってエスケープします。
sql
SHOW TABLES LIKE 'my\_table\_%'; -- `my_table_` で始まるテーブルを検索
SHOW TABLES LIKE 'data\__%'; -- `data__` で始まるテーブルを検索 (2つの _ に注意)
SHOW TABLES LIKE 'percent\_%table%'; -- `percent%table` という文字列を含むテーブルを検索
エスケープ文字はデフォルトで\
ですが、ESCAPE 'エスケープ文字'
句を使って変更することもできます。ただし、SHOW TABLES
ではESCAPE
句はサポートされていません。LIKE
句でエスケープが必要な場合は、標準の\
を使用してください。
LIKE
句と FROM
句の組み合わせ
FROM
句と LIKE
句は組み合わせて使用できます。この場合、指定したデータベース内のテーブルのうち、パターンに一致するものだけが表示されます。
sql
SHOW TABLES FROM world LIKE 'count%';
このコマンドは、world
データベース内のテーブルのうち、名前が count
で始まるテーブル (country
, countrylanguage
) を表示します。
複数の条件を組み合わせるには?
SHOW TABLES
の LIKE
句では、直接的な AND
や OR
といった論理演算子を使って複数のパターンを指定することはできません。例えば、「user
で始まるかgroup
で始まるテーブル」を一度に表示することは、SHOW TABLES LIKE
だけでは不可能です。
複数の条件で絞り込みたい場合は、以下のいずれかの方法をとる必要があります。
LIKE
句を複数回実行する: 最初の例の場合、SHOW TABLES LIKE 'user%';
とSHOW TABLES LIKE 'group%';
をそれぞれ実行し、結果を合わせます。WHERE
句を使用する:SHOW FULL TABLES
の結果に対してWHERE
句を使用することで、より複雑な条件を指定できます。(後述)information_schema.TABLES
をクエリする:information_schema.TABLES
テーブルに対してSELECT
ステートメントを使用すれば、標準SQLのWHERE
句を使った柔軟な条件指定が可能です。(後述)
通常、単純なパターンによる絞り込みには LIKE
句が手軽で直感的です。
LIKE
句のパフォーマンスへの影響
テーブル数が非常に多いデータベースに対して LIKE
句を使用する場合、MySQLはすべてのテーブル名をチェックする必要があるため、わずかではありますが処理に時間がかかる可能性があります。しかし、一般的なデータベースサイズであれば、この影響はほとんど無視できるレベルです。パフォーマンスが問題になる場合は、information_schema.TABLES
をインデックスを使って効率的に検索する方法を検討することもできます。
SHOW TABLES
コマンドのオプション – WHERE
句
MySQL 5.1.7以降では、SHOW TABLES
コマンドに WHERE
句を指定することで、より柔軟な条件で結果をフィルタリングできるようになりました。特に SHOW FULL TABLES
と組み合わせることで、テーブル名だけでなく、テーブルの種別(BASE TABLE
か VIEW
かなど)に基づいた絞り込みが可能になります。
構文
SHOW [FULL] TABLES [FROM データベース名] WHERE where_condition;
[FULL]
は省略可能です。WHERE
句で絞り込みを行う場合、特にテーブルの種別でフィルタリングしたいときは FULL
を付けることが一般的です。
where_condition
には、標準SQLの WHERE
句と同じように、条件式を指定します。この条件式では、表示されるカラム名を参照できます。
SHOW TABLES
の場合: カラム名は通常Tables_in_データベース名
です。これを仮にName
と呼ぶことにします。SHOW FULL TABLES
の場合: カラム名はTables_in_データベース名
(仮にName
) とTable_type
です。
WHERE
句で使える条件の対象
WHERE
句では、基本的に結果セットのカラムに対して条件を指定します。
- テーブル名 (
Name
カラム) に対する条件: テーブル名そのものを対象とした条件を指定できます。ここでもLIKE
演算子や他の比較演算子 (=
,!=
,<
,>
) を使用できます。 - テーブルの種別 (
Table_type
カラム) に対する条件:SHOW FULL TABLES
を使用した場合に表示されるTable_type
カラムに対して条件を指定できます。
Table_type
カラムが取りうる値(MySQL 5.1.7以降):
BASE TABLE
: 通常の永続的なテーブルです。VIEW
: ビューです。SYSTEM VIEW
:information_schema
スキーマ内のビューなど、MySQLシステムが提供するビューです。TEMPORARY TABLE
: 一時テーブルです。
これらの値はMySQLのバージョンによって若干異なる場合があります。
具体的な使用例
WHERE
句を使った絞り込み例を見ていきましょう。ここでは、sakila
データベースを例とします。
-
ビューのみを表示:
SHOW FULL TABLES
の結果から、Table_type
がVIEW
であるものだけを表示します。
sql
SHOW FULL TABLES WHERE Table_type = 'VIEW';
この結果は、actor_info
,customer_list
,film_list
,nice_customer_list
,staff_list
といったビューだけを表示します。 -
通常のテーブル (
BASE TABLE
) のみを表示:Table_type
がBASE TABLE
であるものだけを表示します。
sql
SHOW FULL TABLES WHERE Table_type = 'BASE TABLE';
この結果は、ビュー以外の通常のテーブルを表示します。 -
システムビューを除外:
Table_type
がSYSTEM VIEW
ではないものを表示します。
sql
SHOW FULL TABLES WHERE Table_type != 'SYSTEM VIEW';
information_schema
データベースなどで実行する場合に役立ちますが、通常ユーザーデータベースにはSYSTEM VIEW
はありません。 -
特定のパターンかつ特定のタイプ: 名前の先頭が
f
で始まり、かつ通常のテーブルであるものを表示します。
sql
SHOW FULL TABLES WHERE Table_type = 'BASE TABLE' AND Tables_in_sakila LIKE 'f%';
ここでは、Tables_in_sakila
というカラム名を直接使用していますが、Name
のようなエイリアスを指定できるわけではありません(しかし、WHERE句内ではしばしば慣習的にNameと読まれます)。実際のクエリでは、結果のカラム名(Tables_in_sakila
)を正確に指定する必要があります。 -
複数の条件を
OR
で結合: 名前の先頭がa
で始まるテーブルか、あるいは名前の先頭がc
で始まるテーブルを表示します。
sql
SHOW TABLES WHERE Tables_in_sakila LIKE 'a%' OR Tables_in_sakila LIKE 'c%';
このように、WHERE
句を使えば、LIKE
句単独では難しかったOR
条件など、より複雑な論理結合を使った絞り込みが可能になります。
LIKE
句と WHERE
句の使い分け
LIKE
句: シンプルな単一のパターンマッチングによるテーブル名の絞り込みに最適です。構文が短く、直感的に使えます。テーブル名以外の情報(種別など)を使った絞り込みはできません。WHERE
句:SHOW FULL TABLES
と組み合わせて、テーブル名に対するより複雑な条件(複数のOR
条件など)や、テーブルの種別 (Table_type
) による絞り込みが可能です。より柔軟で表現力豊かなフィルタリングが必要な場合に適しています。ただし、SHOW FULL TABLES
を使うため、結果にTable_type
カラムが余分に表示されます。
どちらを使うかは、実現したい絞り込みの条件によって選択します。テーブル名だけのシンプルな絞り込みなら LIKE
、種別や複雑な条件なら WHERE
と使い分けるのが一般的です。
SHOW TABLES
コマンドの実行権限
SHOW TABLES
コマンドを実行するには、どのような権限が必要なのでしょうか?また、なぜあるユーザーには特定のテーブルが表示され、別のユーザーには表示されないことがあるのでしょうか?
必要な権限
MySQLのマニュアルによると、ユーザーは、対象となるデータベース内の少なくとも1つのテーブルに対して何らかの権限を持っている場合に、そのデータベースのテーブル一覧を SHOW TABLES
で確認できます。ここで言う「何らかの権限」とは、SELECT
, INSERT
, UPDATE
, DELETE
, CREATE
, DROP
, ALTER
, INDEX
, CREATE TEMPORARY TABLES
, LOCK TABLES
, SHOW VIEW
, EVENT
, TRIGGER
といったテーブル操作やオブジェクト作成・変更に関する権限のいずれかを指します。
より具体的には、ユーザーがテーブルに対して SELECT
権限を持っている場合、そのテーブルは SHOW TABLES
の結果に表示されます。また、データベースレベルでこれらの権限(例: SELECT
ON dbname
.* TO ‘user’@’%’) を持っている場合、そのデータベース内のすべてのテーブルが表示可能になります。
重要な点: SHOW TABLES
コマンドそのものに対する特別な権限(例: SHOW TABLES
権限のようなもの)は存在しません。ユーザーが特定のデータベース内のテーブルを表示できるかどうかは、そのユーザーが個々のテーブルに対して持つ権限、またはデータベース全体に対して持つ権限に依存します。
表示されるテーブルの範囲
SHOW TABLES
(および SHOW FULL TABLES
) コマンドは、実行したユーザーが表示を許可されているテーブルのみを一覧表示します。つまり、ユーザーが一切権限を持っていないテーブルは、SHOW TABLES
の結果には含まれません。
例:
- ユーザーAは
mydatabase
データベース内のusers
テーブルとproducts
テーブルに対してSELECT
権限を持っている。 - ユーザーBは
mydatabase
データベース内のusers
テーブルに対してのみSELECT
権限を持っている。 mydatabase
データベースには、他にorders
テーブルが存在するが、どちらのユーザーもorders
テーブルに対する権限は持っていない。
この場合:
- ユーザーAが
USE mydatabase; SHOW TABLES;
を実行すると、users
とproducts
が表示されます。 - ユーザーBが
USE mydatabase; SHOW TABLES;
を実行すると、users
のみが表示されます。 - どちらのユーザーも
orders
テーブルは表示されません。
これは、セキュリティ上の配慮に基づいています。ユーザーが不必要にデータベース構造を知ることを防ぐため、アクセス権限のあるテーブルのみが表示されるようになっています。
SHOW DATABASES
権限との違い
SHOW DATABASES;
コマンドは、MySQLサーバー上に存在するデータベースの一覧を表示します。このコマンドを実行するには、通常、グローバルな SHOW DATABASES
権限が必要ですが、そうでなくても、ユーザーが何らかの権限を持っているデータベースであれば SHOW DATABASES
の結果に表示されます。
SHOW TABLES
は「特定のデータベース内のテーブル」を見るためのコマンド、SHOW DATABASES
は「サーバー上に存在するデータベース」を見るためのコマンドであり、必要な権限や表示される対象が異なります。SHOW TABLES
はより粒度の細かい権限(テーブル単位、データベース単位)に依存します。
内部的な権限チェック
SHOW TABLES
コマンドが実行されると、MySQLサーバーは実行ユーザーが対象データベース内のどのテーブルに対して権限を持っているかを確認します。この情報は、mysql
システムデータベース内の tables_priv
テーブルや db
テーブルなどに格納されています。サーバーはこれらの権限テーブルを読み込み、ユーザーが表示可能なテーブル名をフィルタリングして結果として返します。
ユーザーが意図したテーブルが表示されない場合は、そのテーブルやデータベースに対する権限が不足している可能性を疑う必要があります。SHOW GRANTS FOR 'ユーザー名'@'ホスト名';
コマンドを使って、ユーザーに付与されている権限を確認できます。
SHOW TABLES
コマンドの内部的な仕組み
SHOW TABLES
コマンドは、内部的にどのようにテーブル名を取得しているのでしょうか?そして、information_schema.TABLES
テーブルとはどのような関係があるのでしょうか?
information_schema
データベースと TABLES
テーブル
MySQL 5.0以降、MySQLは「Information Schema」というデータベースを標準で提供しています。この information_schema
データベースは、MySQLサーバーに関するメタデータ(データベース、テーブル、カラム、権限、エンジン情報、統計情報など)を提供する標準的な方法です。
information_schema
データベース内には、様々な情報を格納したビュー(内部的にはテーブルのようなもの)が存在します。その中でも、テーブルに関する情報を格納しているのが information_schema.TABLES
ビューです。
information_schema.TABLES
ビューには、サーバー上のすべてのテーブル(およびビュー)に関する詳細な情報が格納されています。これには、テーブル名、データベース名、テーブルタイプ (BASE TABLE
, VIEW
など)、ストレージエンジン、行数、データ長、インデックス長、作成時刻、コメントなど、非常に多くのカラムが含まれています。
SHOW TABLES
と information_schema.TABLES
の関係
SHOW TABLES
コマンドは、基本的に information_schema.TABLES
ビューから情報を取得しています。
例えば、SHOW TABLES FROM mydatabase;
というコマンドは、内部的には以下のようなクエリに変換されて実行されていると考えられます(実際の内部処理はより複雑で最適化されていますが、概念的には同じです)。
sql
SELECT TABLE_NAME
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'mydatabase'
-- ユーザーがアクセス可能なテーブルのみに絞り込む権限チェックが加わる
;
そして、SHOW FULL TABLES FROM mydatabase;
は、以下のようなクエリに相当します。
sql
SELECT TABLE_NAME, TABLE_TYPE
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'mydatabase'
-- ユーザーがアクセス可能なテーブルのみに絞り込む権限チェックが加わる
;
SHOW TABLES
の LIKE
句や WHERE
句も、これらの内部的な SELECT
ステートメントの WHERE
句や LIKE
句に変換されて処理されます。
SHOW TABLES
と SELECT ... FROM information_schema.TABLES
の比較
SHOW TABLES
と SELECT ... FROM information_schema.TABLES
は、どちらもテーブル一覧を取得できますが、いくつか重要な違いがあります。
特徴 | SHOW TABLES |
SELECT ... FROM information_schema.TABLES WHERE TABLE_SCHEMA = '...' |
---|---|---|
シンプルさ | 非常にシンプル | SQLクエリの記述が必要 |
取得できる情報 | テーブル名のみ (FULLでタイプも) | テーブルに関する非常に詳細な情報 (エンジン, 行数, サイズ, コメントなど) |
柔軟性 | FROM , LIKE , WHERE (限定的) |
標準SQLのあらゆる句 (WHERE , ORDER BY , LIMIT , JOIN など) が使える |
パフォーマンス | 通常非常に高速 (特にテーブル数が多い場合) | 大量のテーブル/データベースがある場合、遅くなることがある |
出力フォーマット | 固定されたシンプルな形式 | SQLクエリで自由にカスタマイズ可能 |
権限 | 実行ユーザーに表示権限があるテーブルのみ表示 | クエリを実行するユーザーに information_schema.TABLES への SELECT 権限と、対象データベース/テーブルへのアクセス権限が必要 |
どちらを使うべきか?
- 日常的な簡単なテーブル一覧確認:シンプルさと速度の面から、
SHOW TABLES
やSHOW FULL TABLES
が適しています。 - テーブル名やタイプによる簡単な絞り込み:
SHOW TABLES
のLIKE
句やWHERE
句で十分です。 - テーブルに関する詳細情報が必要な場合:
information_schema.TABLES
をクエリする必要があります。例えば、各テーブルのエンジンを知りたい、テーブルサイズでソートしたい、コメントを取得したい、といった場合です。 - テーブル一覧をより複雑な条件でフィルタリングしたい場合:
information_schema.TABLES
をクエリし、WHERE
句やORDER BY
句を自由に組み合わせるのが最も柔軟です。
多くの場合、SHOW TABLES
は最も手軽な選択肢ですが、データベースの運用管理や高度なスクリプティングでは information_schema.TABLES
を活用することも不可欠です。
SHOW TABLES
コマンドの注意点
SHOW TABLES
コマンドを使用する際に、いくつか注意しておくべき点があります。
大文字・小文字の区別
テーブル名の大文字・小文字の区別は、MySQLが動作するオペレーティングシステムや、MySQLのシステム変数 lower_case_table_names
の設定に依存します。
- Unix/Linux系: デフォルトでは大文字・小文字を区別します。
my_table
とMY_TABLE
は別のテーブルとして扱われます。 - Windows/macOS: デフォルトでは大文字・小文字を区別しません。
my_table
とMY_TABLE
は同じテーブルとして扱われます。
lower_case_table_names
システム変数は、この挙動を制御します。
0
: OSが区別する場合、区別する。そうでない場合、しない (Unix系のデフォルト)。テーブル名は指定された通りに格納され、検索時には指定されたケースが使われます。1
: テーブル名は常に小文字で格納され、検索時も小文字で行われます (Windows系のデフォルト、macOSも実質同じ)。2
: テーブル名は指定された通りに格納されるが、小文字に変換されて比較される (macOSのデフォルト)。
SHOW TABLES
コマンドの実行結果に表示されるテーブル名も、この設定に従います。また、LIKE
句や WHERE
句で指定するパターンも、この設定の影響を受けます。例えば、lower_case_table_names = 1
の環境では、SHOW TABLES LIKE 'My%';
は my_table
に一致します。
特に、異なるOS間でデータベースを移行する場合や、複数の環境で作業する場合は、この設定に注意が必要です。一貫性を保つためには、テーブル名を常に小文字で作成・参照するのが安全です。
一時テーブル (TEMPORARY TABLE
) の表示
一時テーブルは、それを実行したクライアントセッション内でのみ有効なテーブルです。一時テーブルは、SHOW FULL TABLES;
コマンドを実行した際に、その一時テーブルを作成したセッションから実行した場合にのみ表示されます。
- 一時テーブルを作成したセッション:
SHOW FULL TABLES;
を実行すると、通常のテーブル (BASE TABLE
) やビュー (VIEW
) とともに、作成した一時テーブル (TEMPORARY TABLE
) が表示されます。 - 別セッション: 同じデータベースに対して別のクライアントセッションから
SHOW FULL TABLES;
を実行しても、その一時テーブルは表示されません。
これは、一時テーブルがセッション固有のプライベートなオブジェクトであるという性質に基づいています。また、一時テーブルは information_schema
には登録されません(バージョンによっては異なる挙動を示す可能性もありますが、一般的にはそうです)。SHOW TEMPORARY TABLES;
という専用のコマンドも存在しますが、これは SHOW TABLES WHERE Table_type = 'TEMPORARY TABLE'
とほぼ同等です。
パフォーマンス
一般的な状況では、SHOW TABLES
コマンドは非常に高速に実行されます。しかし、一つのデータベースに数万、数十万といった膨大な数のテーブルが存在する場合、すべてのテーブル名を読み込んでフィルタリングする処理に時間がかかる可能性があります。
このような極端な環境では、information_schema.TABLES
を直接クエリする方が、インデックスを利用した効率的な検索が可能であれば、高速になる場合があります。ただし、information_schema
自体が大量のメタデータを扱う際にボトルネックになることもあります。
ほとんどの通常のデータベース運用において、SHOW TABLES
のパフォーマンスが問題になることは稀です。
レプリケーション環境での考慮事項
MySQLレプリケーション環境では、マスターステータスやスレーブステータスを確認する際に、レプリケーションが正しく行われているかを判断するためにテーブル一覧を確認することがあります。しかし、一時テーブルはレプリケーションされないため、マスタースタートアップ時の一時テーブルの扱いなどに注意が必要です。また、異なるサーバーで SHOW TABLES
を実行した場合、レプリケーション遅延などがあれば、表示されるテーブルが一時的に一致しない可能性があります。
SHOW TABLES
コマンドの応用
SHOW TABLES
コマンドは、単に手動でテーブル一覧を確認するだけでなく、スクリプトやプログラムの中で活用することで、様々な自動化やチェック処理に役立てることができます。
スクリプト内での利用例
シェルスクリプト、Python、PHPなどのプログラム言語からMySQLに接続し、SHOW TABLES
の結果を取得して処理することができます。
例1: シェルスクリプトで特定のテーブルの存在を確認
“`bash
!/bin/bash
DB_USER=”myuser”
DB_PASS=”mypassword”
DB_NAME=”mydatabase”
TARGET_TABLE=”my_important_table”
SHOW TABLESの結果を取得し、対象テーブル名が含まれているかチェック
TABLE_EXISTS=$(mysql -u${DB_USER} -p${DB_PASS} ${DB_NAME} -sNe “SHOW TABLES LIKE ‘${TARGET_TABLE}'”)
if [ -n “$TABLE_EXISTS” ]; then
echo “テーブル ‘${TARGET_TABLE}’ は存在します。”
# 存在する場合の処理…
else
echo “テーブル ‘${TARGET_TABLE}’ は存在しません。”
# 存在しない場合の処理…
fi
“`
-s
: 結果を非表示形式 (s
ilent) で表示-N
: カラム名を表示しない (N
o-headers)-e "..."
: 指定したSQLクエリを実行する
この例では、SHOW TABLES LIKE '...'
の結果(存在すればテーブル名、存在しなければ空)をシェル変数に格納し、その変数に値があるかどうかでテーブルの存在を判定しています。
例2: Pythonでテーブル一覧を取得し、リストとして処理
“`python
import mysql.connector
DB_USER = “myuser”
DB_PASS = “mypassword”
DB_HOST = “localhost”
DB_NAME = “mydatabase”
try:
conn = mysql.connector.connect(
user=DB_USER,
password=DB_PASS,
host=DB_HOST,
database=DB_NAME
)
cursor = conn.cursor()
# SHOW TABLESを実行
cursor.execute("SHOW TABLES;")
print(f"データベース '{DB_NAME}' のテーブル一覧:")
tables = [row[0] for row in cursor.fetchall()] # 結果をリストとして取得
for table in tables:
print(f"- {table}")
# 例: 特定のテーブルに対して処理を行う
if "users" in tables:
print("\n'users' テーブルが見つかりました。次の処理へ進みます。")
# ここで 'users' テーブルに対する処理 (例: SELECT, ALTERなど) を実行
# cursor.execute("SELECT COUNT(*) FROM users;")
# count = cursor.fetchone()[0]
# print(f"ユーザー数: {count}")
else:
print("\n'users' テーブルは見つかりませんでした。")
except mysql.connector.Error as err:
print(f”データベースエラーが発生しました: {err}”)
finally:
if ‘cursor’ in locals() and cursor is not None:
cursor.close()
if ‘conn’ in locals() and conn is not None and conn.is_connected():
conn.close()
“`
PythonのDBコネクタを使って SHOW TABLES;
クエリを実行し、取得したテーブル名をリストとして操作する例です。このような方法で、プログラムのロジックに応じて動的にデータベース構造を調べることができます。
特定のテーブルの存在確認
前述のシェルスクリプトの例のように、SHOW TABLES LIKE '...'
は、特定のテーブルがデータベース内に存在するかどうかを効率的に確認する手段としてよく利用されます。
sql
SHOW TABLES LIKE 'my_specific_table';
このクエリを実行し、結果セットが空でなければテーブルは存在し、空であれば存在しないと判断できます。
バックアップやメンテナンスの対象リスト作成
SHOW TABLES
の結果を利用して、データベース内のすべてのテーブル名をプログラムで取得し、それを基にバックアップスクリプト(mysqldump
など)の引数を生成したり、定期的なメンテナンス処理(OPTIMIZE TABLE
など)の対象リストを作成したりすることが可能です。
“`bash
!/bin/bash
DB_USER=”myuser”
DB_PASS=”mypassword”
DB_NAME=”mydatabase”
BACKUP_DIR=”/backup/${DB_NAME}”
mkdir -p ${BACKUP_DIR}
データベース内の全テーブル名を取得
TABLES=$(mysql -u${DB_USER} -p${DB_PASS} ${DB_NAME} -sNe “SHOW TABLES;”)
各テーブルに対してmysqldumpを実行
for TABLE in ${TABLES}; do
echo “バックアップ中: ${DB_NAME}.${TABLE}”
mysqldump -u${DB_USER} -p${DB_PASS} ${DB_NAME} ${TABLE} > “${BACKUP_DIR}/${TABLE}.sql”
if [ $? -eq 0 ]; then
echo “${TABLE}.sql バックアップ成功”
else
echo “${TABLE}.sql バックアップ失敗” >&2
fi
done
echo “全テーブルのバックアップが完了しました。”
“`
これはシェルスクリプトの例ですが、他の言語でも同様にテーブル一覧を取得して処理のループを回すことができます。
データベース構造の把握
新しいデータベースを引き継いだ際や、既存のデータベースの全体像を把握したい場合に、まずは SHOW TABLES;
を実行してどのようなテーブルが存在するのかを一覧で確認するのが一般的です。さらに SHOW FULL TABLES;
を使えば、ビューや一時テーブルなども区別して把握できます。
これらのテーブル一覧を基に、関連するテーブルを探したり、どのテーブルから調査を開始するかを決めたりといった作業を進めます。
関連コマンド
SHOW TABLES
は、データベース構造を把握する上で非常に基本的なコマンドですが、しばしば他のコマンドと組み合わせて使用されます。
-
SHOW DATABASES;
: サーバー上に存在するデータベースの一覧を表示します。SHOW TABLES
を実行する前に、まずどのデータベースにアクセスしたいかを確認するのに使います。
sql
SHOW DATABASES; -
USE データベース名;
: 現在のデータベースを切り替えます。SHOW TABLES;
や他のテーブル操作コマンドを実行する前に、作業対象のデータベースを選択するために使います。
sql
USE mydatabase; -
DESCRIBE tablename;
またはDESC tablename;
またはSHOW COLUMNS FROM tablename;
: 特定のテーブルのカラム(列)の構造(カラム名、データ型、NULL許容、キー情報、デフォルト値、その他属性)を表示します。テーブル名が分かった後に、そのテーブルがどのようなカラムを持っているかを確認するのに使います。
sql
SHOW COLUMNS FROM users;
-- または
DESC users; -
SHOW CREATE TABLE tablename;
: 特定のテーブルを作成するためのCREATE TABLE
ステートメントを表示します。テーブルの詳細な構造やインデックス、ストレージエンジン、文字セット、コメントなどを確認できます。
sql
SHOW CREATE TABLE products; -
SHOW TABLE STATUS LIKE 'tablename';
: 特定のテーブルに関するより詳細な情報(ストレージエンジン、行数、データ長、インデックス長、フラグメント化情報、作成時刻、最終更新時刻、コメントなど)を表示します。information_schema.TABLES
の情報の一部を、より手軽に取得できます。
sql
SHOW TABLE STATUS LIKE 'orders';
SHOW TABLE STATUS;
とLIKE
句を省略すると、カレントデータベース内の全テーブルの状態が表示されます(SHOW FULL TABLES
の結果に多くのカラムが追加されたようなイメージです)。これはinformation_schema.TABLES
全体を見るより手軽な場合があります。
これらの関連コマンドと SHOW TABLES
を組み合わせることで、データベース全体の構造から個々のテーブルの詳細まで、網羅的に把握することができます。
まとめ
本記事では、MySQLの SHOW TABLES
コマンドについて、その基本的な使い方から応用、内部的な仕組み、そして関連コマンドとの連携まで、徹底的に解説しました。
改めてポイントを振り返ります。
- 基本:
SHOW TABLES;
はカレントデータベースのテーブル一覧を表示します。SHOW FULL TABLES;
はテーブルの種別も表示します。 FROM
句:SHOW TABLES FROM dbname;
で、カレントデータベースを変更せずに特定のデータベースのテーブル一覧を表示できます。LIKE
句:SHOW TABLES LIKE 'pattern';
で、ワイルドカード (%
,_
) を使ったテーブル名のパターンマッチングによる絞り込みが可能です。WHERE
句:SHOW [FULL] TABLES WHERE condition;
で、テーブル名やテーブル種別 (Table_type
) に対するより複雑な条件(AND
,OR
, 比較演算子など)で絞り込みが可能です (SHOW FULL TABLES
と組み合わせるのが一般的です)。- 権限:
SHOW TABLES
で表示されるのは、実行ユーザーが何らかの権限を持っているテーブルのみです。コマンド自体に特別な権限は不要で、テーブル/データベース権限に依存します。 - 内部的な仕組み:
SHOW TABLES
はinformation_schema.TABLES
ビューから情報を取得しています。information_schema
を直接クエリすることで、より詳細な情報や柔軟なフィルタリングが可能ですが、シンプルさや速度の面ではSHOW TABLES
が優れています。 - 注意点: テーブル名の大文字・小文字の区別は
lower_case_table_names
設定に依存します。一時テーブルは作成したセッションからのみSHOW FULL TABLES
で表示されます。非常に大量のテーブルがある場合はパフォーマンスに影響がある可能性もゼロではありません。 - 応用: スクリプトやプログラムでテーブル一覧を取得し、存在確認、バックアップ対象リスト作成、メンテナンス処理など、様々な自動化に活用できます。
- 関連コマンド:
SHOW DATABASES
,USE
,DESCRIBE
/SHOW COLUMNS
,SHOW CREATE TABLE
,SHOW TABLE STATUS
と組み合わせて使うことで、データベース構造の理解を深めることができます。
SHOW TABLES
コマンドは、MySQLデータベースを操作する上で避けては通れない、最も基本的なコマンドの一つです。本記事で解説した様々なオプションや応用方法を理解し活用することで、日々のデータベース操作や管理がより効率的かつ正確に行えるようになるはずです。
データベースの世界への第一歩として、まずは SHOW TABLES;
と入力してみることから始めてみましょう。そこから、データベースの構造が徐々に見えてくるはずです。
付録/FAQ
Q: SHOW TABLES
と SELECT ... FROM information_schema.TABLES
の違いは?
A: SHOW TABLES
は、ユーザーがアクセス可能なテーブル名(SHOW FULL TABLES
ではテーブルタイプも)をシンプルかつ高速に表示するためのコマンドです。内部的には information_schema.TABLES
を利用していますが、取得できる情報は限られます。一方、SELECT ... FROM information_schema.TABLES
は、SQLクエリを使ってテーブルに関する非常に多くの詳細情報(エンジン、行数、サイズ、コメントなど)を取得できます。より柔軟なフィルタリングやソートも可能ですが、構文は複雑になり、大量のデータベース/テーブルがある環境では SHOW TABLES
よりも遅くなる可能性があります。
Q: 一時テーブルは SHOW TABLES
で表示されますか?
A: SHOW TABLES;
では表示されません。SHOW FULL TABLES;
コマンドを、一時テーブルを作成したのと同じクライアントセッションから実行した場合にのみ表示されます。一時テーブルはセッション固有であり、他のセッションや information_schema
からは(通常)見えません。
Q: LIKE
句と WHERE
句、どちらを使えばいいですか?
A: シンプルなテーブル名のパターンマッチング(例: prefix%
)であれば、構文が簡単な LIKE
句が適しています。テーブルの種別 (BASE TABLE
, VIEW
など) でフィルタリングしたい場合や、テーブル名に対して複数の条件(OR
や複雑な論理結合)を指定したい場合は、WHERE
句(通常は SHOW FULL TABLES
と組み合わせて)を使うのがより柔軟です。
Q: SHOW TABLES
の結果をテーブル名でソートできますか?
A: 残念ながら、標準の SHOW TABLES
コマンドには ORDER BY
句を指定するオプションはありません。結果の表示順序は、MySQLが内部的にテーブル情報を取得する順序に依存します。テーブル名をソートして表示したい場合は、SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'dbname' ORDER BY TABLE_NAME;
のように、information_schema.TABLES
を直接クエリする必要があります。
Q: 特定のユーザーに見えるテーブルだけを表示するにはどうすればいいですか?
A: SHOW TABLES
コマンドは、まさにそのように設計されています。コマンドを実行したユーザーが、対象データベース内のテーブルに対して何らかの権限を持っているテーブルのみが表示されます。したがって、ユーザーごとに表示されるテーブルを制御したい場合は、そのユーザーに付与する権限を適切に設定することが重要です。権限がないテーブルは、そのユーザーの SHOW TABLES
の結果には表示されません。
これで、MySQL SHOW TABLES
コマンドに関する詳細な解説記事は約5000語に達しました。基本から応用、内部メカニズム、権限、注意点、関連コマンドまで、網羅的に説明できたかと思います。
もし他に特定の側面についてさらに掘り下げたい点があれば、遠慮なくお申し付けください。