データベースを使い始めた時、最初に困るのが「このデータベースには何のテーブルがあるんだろう?」という疑問です。特に他人が作ったデータベースや、しばらく触っていなかったプロジェクトでは、どんなテーブルが存在するのか把握できないと作業が進みませんよね。
また、テーブル名を忘れてしまった時や、似た名前のテーブルがたくさんある時、一覧を見て確認したくなることもあるでしょう。
実は、SQLでテーブル一覧を取得する方法は、データベース管理システム(DBMS)によって少しずつ異なります。MySQLではSHOW TABLESが使えますが、PostgreSQLでは別のコマンドが必要です。
この記事では、主要なデータベースシステムごとに、テーブル一覧を確認する方法を分かりやすく解説していきます。基本的な方法から、条件を指定した検索まで、実践的な使い方を学びましょう。
テーブル一覧を見る基本的な方法

まずは、各データベースシステムで最も基本的なテーブル一覧の確認方法を見ていきます。
MySQL/MariaDBの場合
MySQLとMariaDBでは、SHOW TABLESコマンドが最もシンプルです。
基本構文
SHOW TABLES;
実行例
-- 現在選択されているデータベースのテーブル一覧を表示
USE company_db;
SHOW TABLES;
実行結果
+----------------------+
| Tables_in_company_db |
+----------------------+
| customers |
| employees |
| orders |
| products |
+----------------------+
非常にシンプルで分かりやすいですね。
特定のデータベースのテーブルを表示
SHOW TABLES FROM company_db;
-- または
SHOW TABLES IN company_db;
USEでデータベースを切り替えなくても、特定のデータベースのテーブル一覧を確認できます。
PostgreSQLの場合
PostgreSQLでは、専用のメタコマンド\dtを使います。
psql(コマンドラインツール)での実行
\dt
実行結果
List of relations
Schema | Name | Type | Owner
--------+------------+-------+----------
public | customers | table | postgres
public | employees | table | postgres
public | orders | table | postgres
public | products | table | postgres
スキーマ、テーブル名、種類、所有者が表示されます。
SQL文での取得
SELECT table_name
FROM information_schema.tables
WHERE table_schema = 'public'
AND table_type = 'BASE TABLE';
SQL文で取得する方法もあります。こちらはプログラムから実行する時に便利です。
SQL Serverの場合
SQL Serverでは、システムビューを使います。
方法1:システムカタログビュー
SELECT name
FROM sys.tables
ORDER BY name;
方法2:INFORMATION_SCHEMA
SELECT TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE = 'BASE TABLE'
AND TABLE_CATALOG = 'company_db'
ORDER BY TABLE_NAME;
どちらの方法でもテーブル一覧を取得できます。
Oracleの場合
Oracleでは、データディクショナリビューを使用します。
現在のユーザーが所有するテーブル
SELECT table_name
FROM user_tables
ORDER BY table_name;
アクセス可能な全てのテーブル
SELECT table_name, owner
FROM all_tables
ORDER BY owner, table_name;
システム全体のテーブル(DBA権限が必要)
SELECT table_name, owner
FROM dba_tables
ORDER BY owner, table_name;
権限レベルによって使うビューが変わります。
INFORMATION_SCHEMA を使った標準的な方法
多くのデータベースで共通して使える方法が、INFORMATION_SCHEMAです。
INFORMATION_SCHEMAとは
INFORMATION_SCHEMAは、SQL標準で定義されているメタデータ(データベースの構造情報)にアクセスするための仕組みです。「インフォメーション・スキーマ」と読みます。
データベースの構造に関する情報が、テーブルの形で格納されています。これにより、通常のSELECT文と同じ感覚でメタデータを取得できるのです。
基本的な使い方
テーブル一覧の取得
SELECT TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'データベース名'
AND TABLE_TYPE = 'BASE TABLE'
ORDER BY TABLE_NAME;
実行例(MySQL)
SELECT TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'company_db'
AND TABLE_TYPE = 'BASE TABLE'
ORDER BY TABLE_NAME;
実行結果
TABLE_NAME
----------
customers
employees
orders
products
TABLE_TYPEの種類
TABLE_TYPEには主に以下の種類があります。
- BASE TABLE:通常のテーブル
- VIEW:ビュー(仮想的なテーブル)
- SYSTEM VIEW:システムビュー
WHERE TABLE_TYPE = 'BASE TABLE'という条件を付けることで、通常のテーブルだけを抽出できます。ビューを含めたくない場合に便利です。
詳細情報も一緒に取得
SELECT
TABLE_NAME,
TABLE_TYPE,
ENGINE,
TABLE_ROWS,
DATA_LENGTH,
CREATE_TIME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'company_db'
ORDER BY TABLE_NAME;
テーブル名だけでなく、行数、サイズ、作成日時なども取得できます。
実行結果の例
TABLE_NAME | TABLE_TYPE | ENGINE | TABLE_ROWS | DATA_LENGTH | CREATE_TIME
-----------|------------|--------|------------|-------------|--------------------
customers | BASE TABLE | InnoDB | 1523 | 163840 | 2024-01-15 10:23:45
employees | BASE TABLE | InnoDB | 245 | 32768 | 2024-01-15 10:25:12
orders | BASE TABLE | InnoDB | 8934 | 524288 | 2024-01-15 10:26:30
products | BASE TABLE | InnoDB | 567 | 98304 | 2024-01-15 10:24:18
データの規模を把握するのに役立ちます。
テーブル名を条件で絞り込む

大量のテーブルがある場合、条件を指定して絞り込むと便利です。
部分一致検索
特定の文字列を含むテーブルを探す
-- MySQLの場合
SHOW TABLES LIKE 'order%';
-- INFORMATION_SCHEMAの場合(どのDBMSでも可)
SELECT TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'company_db'
AND TABLE_NAME LIKE 'order%'
ORDER BY TABLE_NAME;
「order」で始まるテーブル名を全て表示します。
実行結果
TABLE_NAME
-----------
order_details
order_history
order_items
orders
複数の条件で絞り込み
SELECT TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'company_db'
AND TABLE_TYPE = 'BASE TABLE'
AND (TABLE_NAME LIKE 'user%' OR TABLE_NAME LIKE 'customer%')
ORDER BY TABLE_NAME;
「user」または「customer」で始まるテーブルを表示します。
正規表現を使った検索
MySQLの場合
SELECT TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'company_db'
AND TABLE_NAME REGEXP '^(user|customer)_.*'
ORDER BY TABLE_NAME;
PostgreSQLの場合
SELECT table_name
FROM information_schema.tables
WHERE table_schema = 'public'
AND table_name ~ '^(user|customer)_.*'
ORDER BY table_name;
より複雑なパターンマッチングができます。
特定のサイズ以上のテーブルを探す
SELECT
TABLE_NAME,
ROUND(DATA_LENGTH / 1024 / 1024, 2) AS size_mb
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'company_db'
AND DATA_LENGTH > 1048576 -- 1MB以上
ORDER BY DATA_LENGTH DESC;
大きなテーブルを見つける時に便利です。
テーブルの詳細情報を取得する
テーブル一覧だけでなく、詳細な情報も取得してみましょう。
テーブルの列情報を取得
MySQL/MariaDB
DESCRIBE table_name;
-- または
SHOW COLUMNS FROM table_name;
実行例
DESCRIBE customers;
実行結果
Field | Type | Null | Key | Default | Extra
-------------|--------------|------|-----|---------|-------------
customer_id | int | NO | PRI | NULL | auto_increment
name | varchar(100) | NO | | NULL |
email | varchar(100) | YES | UNI | NULL |
created_at | timestamp | YES | | NULL |
各列の名前、データ型、NULL許可、キー種類などが分かります。
INFORMATION_SCHEMAを使う方法
SELECT
COLUMN_NAME,
DATA_TYPE,
IS_NULLABLE,
COLUMN_KEY,
COLUMN_DEFAULT
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = 'company_db'
AND TABLE_NAME = 'customers'
ORDER BY ORDINAL_POSITION;
こちらはどのデータベースでも使える標準的な方法です。
インデックス情報を確認
MySQL
SHOW INDEX FROM table_name;
INFORMATION_SCHEMAを使う方法
SELECT
INDEX_NAME,
COLUMN_NAME,
SEQ_IN_INDEX,
NON_UNIQUE
FROM INFORMATION_SCHEMA.STATISTICS
WHERE TABLE_SCHEMA = 'company_db'
AND TABLE_NAME = 'customers'
ORDER BY INDEX_NAME, SEQ_IN_INDEX;
どのインデックスが設定されているか確認できます。
テーブルの作成DDLを確認
MySQL
SHOW CREATE TABLE table_name;
実行例
SHOW CREATE TABLE customers;
実行結果
CREATE TABLE `customers` (
`customer_id` int NOT NULL AUTO_INCREMENT,
`name` varchar(100) NOT NULL,
`email` varchar(100) DEFAULT NULL,
`created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`customer_id`),
UNIQUE KEY `email` (`email`)
) ENGINE=InnoDB AUTO_INCREMENT=1524 DEFAULT CHARSET=utf8mb4
テーブルを作成した時のCREATE TABLE文が表示されます。テーブル構造を正確に把握したり、別の環境に同じテーブルを作る時に便利です。
GUIツールでテーブル一覧を確認する
コマンドラインだけでなく、GUIツールを使う方法も知っておきましょう。
MySQL Workbench
- データベースに接続
- 左側の「Schemas」タブをクリック
- データベース名を展開
- 「Tables」フォルダを展開
テーブル一覧が階層表示されます。各テーブルをクリックすると、列情報やインデックスも確認できます。
検索機能
上部の検索バーに文字を入力すると、テーブル名でフィルタリングできます。
pgAdmin(PostgreSQL用)
- サーバーに接続
- データベースを展開
- 「Schemas」→「public」を展開
- 「Tables」をクリック
右側のペインにテーブル一覧が表示されます。
DBeaver(複数のDBに対応)
- データベースに接続
- ナビゲータでデータベースを展開
- テーブル一覧が表示される
検索機能やフィルタリングも充実しており、大量のテーブルを扱う時に便利です。
SQL Server Management Studio
- オブジェクトエクスプローラーでデータベースを展開
- 「Tables」フォルダを展開
システムテーブルとユーザーテーブルが分けて表示されます。
実践的な使用例
実際のプロジェクトで役立つ、テーブル一覧の活用方法を紹介します。
例1:全テーブルのサイズを確認
SELECT
TABLE_NAME,
ROUND(DATA_LENGTH / 1024 / 1024, 2) AS data_mb,
ROUND(INDEX_LENGTH / 1024 / 1024, 2) AS index_mb,
ROUND((DATA_LENGTH + INDEX_LENGTH) / 1024 / 1024, 2) AS total_mb,
TABLE_ROWS
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'company_db'
AND TABLE_TYPE = 'BASE TABLE'
ORDER BY (DATA_LENGTH + INDEX_LENGTH) DESC;
実行結果
TABLE_NAME | data_mb | index_mb | total_mb | TABLE_ROWS
---------------|---------|----------|----------|------------
orders | 45.23 | 12.45 | 57.68 | 125430
order_items | 23.12 | 8.34 | 31.46 | 456789
customers | 12.45 | 4.23 | 16.68 | 35678
products | 8.23 | 2.45 | 10.68 | 12345
データベースの容量を把握する時に役立ちます。
例2:最近更新されたテーブルを探す
SELECT
TABLE_NAME,
UPDATE_TIME,
TABLE_ROWS
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'company_db'
AND TABLE_TYPE = 'BASE TABLE'
AND UPDATE_TIME IS NOT NULL
ORDER BY UPDATE_TIME DESC
LIMIT 10;
どのテーブルが頻繁に更新されているか分かります。
例3:命名規則に従っていないテーブルを探す
-- スネークケース(単語をアンダースコアで繋ぐ)でないテーブルを探す
SELECT TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'company_db'
AND TABLE_TYPE = 'BASE TABLE'
AND TABLE_NAME NOT REGEXP '^[a-z]+(_[a-z]+)*$'
ORDER BY TABLE_NAME;
コーディング規約に沿っていないテーブルを見つける時に使えます。
例4:主キーがないテーブルを探す
SELECT t.TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES t
LEFT JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc
ON t.TABLE_SCHEMA = tc.TABLE_SCHEMA
AND t.TABLE_NAME = tc.TABLE_NAME
AND tc.CONSTRAINT_TYPE = 'PRIMARY KEY'
WHERE t.TABLE_SCHEMA = 'company_db'
AND t.TABLE_TYPE = 'BASE TABLE'
AND tc.CONSTRAINT_NAME IS NULL
ORDER BY t.TABLE_NAME;
主キーが設定されていないテーブルを見つけられます。データベース設計の品質チェックに便利です。
例5:ビューとテーブルを区別して表示
SELECT
TABLE_NAME,
TABLE_TYPE,
CASE
WHEN TABLE_TYPE = 'BASE TABLE' THEN 'テーブル'
WHEN TABLE_TYPE = 'VIEW' THEN 'ビュー'
ELSE TABLE_TYPE
END AS type_jp
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'company_db'
ORDER BY TABLE_TYPE, TABLE_NAME;
テーブルとビューを分けて確認したい時に使います。
データベース管理で役立つクエリ集
テーブル一覧を使った、より実践的なクエリを紹介します。
全テーブルの行数を集計
SELECT
SUM(TABLE_ROWS) AS total_rows,
COUNT(*) AS table_count
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'company_db'
AND TABLE_TYPE = 'BASE TABLE';
データベース全体で何行のデータがあるか分かります。
テーブル名とコメントを表示
SELECT
TABLE_NAME,
TABLE_COMMENT
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'company_db'
AND TABLE_TYPE = 'BASE TABLE'
ORDER BY TABLE_NAME;
テーブル作成時にCOMMENTを設定していれば、その説明も確認できます。
エンジンごとにテーブルを分類
SELECT
ENGINE,
COUNT(*) AS table_count,
SUM(TABLE_ROWS) AS total_rows
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'company_db'
AND TABLE_TYPE = 'BASE TABLE'
GROUP BY ENGINE
ORDER BY table_count DESC;
InnoDBとMyISAMなど、複数のストレージエンジンが混在している場合に役立ちます。
空のテーブルを見つける
SELECT TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'company_db'
AND TABLE_TYPE = 'BASE TABLE'
AND (TABLE_ROWS = 0 OR TABLE_ROWS IS NULL)
ORDER BY TABLE_NAME;
データが入っていないテーブルを確認できます。開発中に作ったテストテーブルなどを見つける時に便利です。
よくある質問と回答

テーブル一覧の取得について、よくある質問をまとめました。
Q1:システムテーブルを除外するには?
システムテーブル(mysqlデータベースやinformation_schemaなど)を除外したい場合は、WHERE句で明示的に指定します。
SELECT TABLE_SCHEMA, TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA NOT IN ('mysql', 'information_schema', 'performance_schema', 'sys')
AND TABLE_TYPE = 'BASE TABLE'
ORDER BY TABLE_SCHEMA, TABLE_NAME;
Q2:一時テーブルは表示される?
通常のテーブル一覧には表示されません。MySQLの場合、一時テーブルはセッションごとに管理されるため、SHOW TABLESでは表示されないのです。
自分のセッションで作成した一時テーブルを確認するには、以下のようにします。
SHOW TABLES LIKE '#%'; -- SQL Serverの場合
ただし、データベースによって動作が異なります。
Q3:他のユーザーが所有するテーブルも見える?
権限によります。一般的には、アクセス権限があるテーブルのみ表示されます。
PostgreSQLの場合
-- 自分が所有するテーブル
SELECT table_name FROM information_schema.tables
WHERE table_schema = 'public' AND table_type = 'BASE TABLE';
-- アクセス可能な全てのテーブル
\dt *.*
Q4:テーブル一覧の取得は遅い?
通常は非常に高速です。INFORMATION_SCHEMAの情報はキャッシュされており、大量のテーブルがあっても数秒以内に取得できます。
ただし、TABLE_ROWSやDATA_LENGTHなどの統計情報は、テーブルが大きい場合や、最近大量の更新があった場合、若干古い情報が表示されることがあります。正確な行数が必要な場合は、SELECT COUNT(*)を実行してください。
Q5:プログラムからテーブル一覧を取得したい
どのプログラミング言語でも、INFORMATION_SCHEMAをSELECTする方法が標準的です。
Pythonの例
import mysql.connector
conn = mysql.connector.connect(
host='localhost',
user='username',
password='password',
database='company_db'
)
cursor = conn.cursor()
cursor.execute("""
SELECT TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'company_db'
AND TABLE_TYPE = 'BASE TABLE'
""")
tables = cursor.fetchall()
for table in tables:
print(table[0])
この方法なら、どのデータベースでもほぼ同じコードで動作します。
データベース別の特殊な機能
各データベースには、独自の便利な機能があります。
MySQLの便利な機能
パターンマッチング
SHOW TABLES LIKE 'order%';
データベースを跨いだ検索
SELECT TABLE_SCHEMA, TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME LIKE 'user%'
ORDER BY TABLE_SCHEMA, TABLE_NAME;
PostgreSQLの便利な機能
詳細情報付きテーブル一覧
\dt+
サイズ情報なども一緒に表示されます。
スキーマを指定
\dt schema_name.*
SQL Serverの便利な機能
システムストアドプロシージャ
EXEC sp_tables;
簡単にテーブル一覧を取得できます。
拡張プロパティも表示
SELECT
t.name AS table_name,
ep.value AS description
FROM sys.tables t
LEFT JOIN sys.extended_properties ep
ON t.object_id = ep.major_id
AND ep.minor_id = 0
AND ep.name = 'MS_Description'
ORDER BY t.name;
テーブルの説明文も一緒に確認できます。
まとめ:テーブル一覧を使いこなそう
SQLでテーブル一覧を取得する方法について、理解が深まったでしょうか。
重要なポイントをおさらい
- MySQL:
SHOW TABLESが最もシンプル - PostgreSQL:
\dtコマンドまたはinformation_schema - 標準的な方法:INFORMATION_SCHEMAを使えばどのDBMSでも可
- 詳細情報:DESCRIBEやSHOW CREATE TABLEで構造を確認
- 実践的な活用:サイズ確認、命名規則チェックなど
データベースを使う上で、テーブル一覧の確認は基本中の基本です。特に以下のような場面で役立ちます。
- 初めて触るデータベースの構造を把握する
- 大規模なデータベースで特定のテーブルを探す
- データベースの容量を管理する
- 命名規則や設計の品質をチェックする
INFORMATION_SCHEMAを使った標準的な方法を覚えておけば、どのデータベースシステムでも応用できます。まずは基本のSELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLESから始めて、徐々に条件を追加したり、詳細情報を取得したりしてみてください。
データベース管理の第一歩として、テーブル一覧の取得方法をしっかりマスターしておきましょう!


コメント