データベースの構造を把握する第一歩は、テーブル一覧の取得です。新しいプロジェクトに参画したとき、レガシーDBを調査するとき、テスト環境と本番環境の差分を確認するとき――あらゆる場面でこのスキルが必要になります。
しかし、テーブル一覧の取得方法はRDBMS(データベース管理システム)ごとに異なります。この記事では、MySQL・PostgreSQL・Oracle・SQL Server・SQLiteの5大RDBMSそれぞれの方法を、基本から応用まで体系的に解説します。
さらに、SQL標準(ISO/IEC 9075)で定義された information_schema を使った移植性の高い方法も紹介するので、複数のRDBMSを扱う現場でも役立つ知識が身につきます。
RDBMS別テーブル一覧取得の早見表
まずは全体像を把握しましょう。各RDBMSでテーブル一覧を取得する主要な方法を一覧にまとめました。
| RDBMS |
専用コマンド |
SQL標準方式 |
システムカタログ |
| MySQL |
SHOW TABLES |
information_schema.tables |
− |
| PostgreSQL |
\dt(psql) |
information_schema.tables |
pg_tables |
| Oracle |
− |
非対応 |
USER_TABLES / ALL_TABLES |
| SQL Server |
− |
INFORMATION_SCHEMA.TABLES |
sys.tables |
| SQLite |
.tables(CLI) |
非対応 |
sqlite_master |
それでは、各RDBMSの詳細な使い方を見ていきましょう。
MySQL でテーブル一覧を取得する
MySQLでは SHOW TABLES コマンドが最も手軽な方法です。MySQL独自の拡張構文で、SQLクライアントから直接実行できます。
SHOW TABLES(基本)
現在接続しているデータベース内のすべてのテーブル名が一覧で返されます。
▼ 実行結果の例
| Tables_in_mydb |
| customers |
| orders |
| products |
| employees |
SHOW FULL TABLES(テーブル種類を表示)
FULL を付けると、各オブジェクトがテーブル(BASE TABLE)なのかビュー(VIEW)なのかを区別できます。
▼ 実行結果の例
| Tables_in_mydb |
Table_type |
| customers | BASE TABLE |
| orders | BASE TABLE |
| products | BASE TABLE |
| v_active_customers | VIEW |
SHOW TABLES FROM(別データベースのテーブル)
現在接続中のデータベース以外のテーブル一覧も、FROM(または IN)で指定して取得できます。
MySQL
-- 別のデータベースのテーブルを表示
SHOW TABLES FROM other_database;
-- IN でも同じ結果
SHOW TABLES IN other_database;
SHOW TABLES LIKE(パターンで絞り込み)
LIKE 句を使うと、テーブル名をパターンで絞り込めます。大規模なデータベースで特定のテーブルを探す際に便利です。
MySQL
-- 'user' で始まるテーブルのみ
SHOW TABLES LIKE 'user%';
-- '_log' で終わるテーブルのみ
SHOW TABLES LIKE '%_log';
-- 'order' を含むテーブル
SHOW TABLES LIKE '%order%';
SHOW TABLE STATUS(詳細情報の取得)
テーブル名だけでなく、行数・データサイズ・エンジン・作成日時などの詳細情報を一括取得できます。
MySQL
-- すべてのテーブルの詳細情報
SHOW TABLE STATUS;
-- 名前・エンジン・行数・更新日時だけ取得
SHOW TABLE STATUS WHERE Engine = 'InnoDB';
⚠ InnoDB の注意点
InnoDB ストレージエンジンを使用している場合、Rows(行数)は概算値です。正確な行数が必要な場合は SELECT COUNT(*) FROM テーブル名 を使いましょう。
MariaDB での互換性
MariaDB は MySQL からフォーク(派生)したRDBMSで、テーブル一覧の取得方法は MySQL とほぼ同じです。
MariaDB で使える方法
SHOW TABLES、SHOW FULL TABLES、SHOW TABLE STATUS、information_schema.tables がすべてそのまま使えます。MariaDB 10.5 以降では SHOW FULL TABLES の Table_type に SEQUENCE が追加されている点が MySQL との主な違いです。
MySQLのテーブル操作についてさらに学ぶなら、ALTER TABLEで列の追加や変更を行う方法やDROP TABLEでテーブルを削除する方法もご覧ください。phpMyAdmin を使用している場合は、左パネルのデータベース名をクリックするだけでテーブル一覧を確認できます。
PostgreSQL でテーブル一覧を取得する
PostgreSQLでは、psqlメタコマンド、information_schema、pg_tables ビューの3つの方法があります。
\dt メタコマンド(psql専用)
psql(PostgreSQLの対話型ターミナル)では、バックスラッシュコマンドで素早くテーブル一覧を確認できます。
PostgreSQL(psql)
-- テーブル一覧
\dt
-- 詳細情報付き(サイズ・説明)
\dt+
-- 特定スキーマのテーブル
\dt myschema.*
-- パターンで絞り込み
\dt user*
▼ \dt の実行結果例
| Schema |
Name |
Type |
Owner |
| public | customers | table | postgres |
| public | orders | table | postgres |
| public | products | table | postgres |
information_schema.tables(SQL標準)
information_schema はSQL標準で定められたメタデータビューです。PostgreSQLに限らず、MySQL・SQL Server でも同じ構文で使えます。
PostgreSQL
SELECT table_name
FROM information_schema.tables
WHERE table_schema = 'public'
AND table_type = 'BASE TABLE'
ORDER BY table_name;
table_schema = 'public' でpublicスキーマに限定し、table_type = 'BASE TABLE' でビューを除外しています。
pg_tables ビュー(PostgreSQL独自)
PostgreSQL独自のシステムカタログビューで、テーブルの所有者やテーブル空間の情報も取得できます。
PostgreSQL
SELECT schemaname, tablename, tableowner
FROM pg_tables
WHERE schemaname NOT LIKE 'pg_%'
AND schemaname != 'information_schema'
ORDER BY tablename;
WHERE 句でシステムテーブル(pg_ で始まるスキーマと information_schema)を除外して、ユーザー定義のテーブルだけを表示しています。
GUIツールを使用している場合、pgAdmin ではサーバー → データベース → スキーマ → テーブル とツリーを展開するだけでテーブル一覧を確認できます。DBeaver などの汎用クライアントでも同様にオブジェクトエクスプローラーから一覧表示が可能です。
Oracle でテーブル一覧を取得する
Oracleには SHOW TABLES コマンドがありません。代わりにデータディクショナリビューを使います。権限レベルに応じて3種類のビューが用意されています。
| ビュー名 |
対象範囲 |
必要な権限 |
| USER_TABLES |
自分が所有するテーブル |
不要(誰でも使用可) |
| ALL_TABLES |
アクセス権があるすべてのテーブル |
不要(権限に応じて結果が変化) |
| DBA_TABLES |
データベース全体のすべてのテーブル |
DBA権限 または SELECT ANY DICTIONARY |
USER_TABLES(自分のテーブル)
Oracle
SELECT table_name
FROM user_tables
ORDER BY table_name;
最もシンプルな方法です。ログインユーザーが所有するテーブルだけが返されます。
ALL_TABLES(アクセス可能なテーブル)
Oracle
-- 所有者別に一覧表示
SELECT owner, table_name
FROM all_tables
ORDER BY owner, table_name;
-- 特定の表領域に絞り込み
SELECT owner, table_name
FROM all_tables
WHERE tablespace_name = 'USERS'
ORDER BY owner, table_name;
DBA_TABLES(データベース全体)
Oracle
-- DBA権限が必要
SELECT owner, table_name, num_rows
FROM dba_tables
WHERE owner NOT IN ('SYS', 'SYSTEM', 'OUTLN')
ORDER BY owner, table_name;
Oracleのテーブル一覧取得についてさらに詳しく知りたい方は、Oracleでデータベース内の全テーブルを確認する方法も参考にしてください。
SQL Server でテーブル一覧を取得する
SQL Serverでは、sys.tables カタログビューと INFORMATION_SCHEMA.TABLES の2つの方法が主流です。
sys.tables(推奨)
SQL Server固有のシステムカタログビューで、最も詳細な情報を取得できます。
SQL Server
-- 基本的なテーブル一覧
SELECT name AS table_name
FROM sys.tables
ORDER BY name;
-- スキーマ名付きで取得
SELECT s.name AS schema_name,
t.name AS table_name,
t.create_date,
t.modify_date
FROM sys.tables t
JOIN sys.schemas s ON t.schema_id = s.schema_id
ORDER BY s.name, t.name;
INFORMATION_SCHEMA.TABLES(SQL標準)
SQL Server
SELECT TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE = 'BASE TABLE'
ORDER BY TABLE_SCHEMA, TABLE_NAME;
sys.objects(汎用的な方法)
sys.objects はテーブルだけでなく、ビュー・ストアドプロシージャなど全オブジェクトを管理するカタログビューです。type = 'U' でユーザーテーブルに限定できます。
SQL Server
SELECT name AS table_name
FROM sys.objects
WHERE type = 'U' -- U = User Table
ORDER BY name;
SQL Server Management Studio(SSMS)を使用している場合は、オブジェクトエクスプローラーの「データベース → テーブル」ノードを展開するだけでテーブル一覧を確認できます。フィルター機能で特定のテーブルだけを表示することも可能です。
SQLite でテーブル一覧を取得する
SQLiteは軽量なファイルベースのデータベースです。システムテーブル sqlite_master(または sqlite_schema)からテーブル一覧を取得します。
sqlite_master テーブル
SQLite
-- テーブル名の一覧
SELECT name
FROM sqlite_master
WHERE type = 'table'
ORDER BY name;
-- CREATE TABLE 文も確認
SELECT name, sql
FROM sqlite_master
WHERE type = 'table'
AND name NOT LIKE 'sqlite_%'
ORDER BY name;
sqlite_master の sql カラムには、テーブル作成時の CREATE TABLE 文がそのまま格納されています。テーブル構造の確認にも活用できます。
.tables コマンド(CLIツール)
SQLite(CLI)
-- すべてのテーブル
.tables
-- パターンで絞り込み
.tables user%
-- テーブルのスキーマ(CREATE TABLE文)を確認
.schema customers
information_schema とは?SQL標準のメタデータ
information_schema は、ISO/IEC 9075(SQL標準規格)で定義されたメタデータビューの集合です。データベースの構造(テーブル、カラム、制約など)に関する情報を統一的なインターフェースで提供します。
複数のRDBMSを扱う現場では、information_schema を使えば同じSQLで異なるRDBMSのテーブル一覧を取得できるため、移植性の高いスクリプトを書けます。
各RDBMSの information_schema 対応状況
| RDBMS |
対応 |
備考 |
| MySQL |
○ |
MySQL 5.0以降で対応 |
| PostgreSQL |
○ |
PostgreSQL 7.4以降で対応 |
| SQL Server |
○ |
SQL Server 2005以降で対応 |
| Oracle |
× |
独自のデータディクショナリ(USER_/ALL_/DBA_)を使用 |
| SQLite |
× |
sqlite_master を使用 |
information_schema.tables の共通クエリ
MySQL・PostgreSQL・SQL Server で共通して使える書き方です。
SQL標準(MySQL / PostgreSQL / SQL Server 共通)
SELECT table_catalog, -- データベース名
table_schema, -- スキーマ名
table_name, -- テーブル名
table_type -- BASE TABLE or VIEW
FROM information_schema.tables
WHERE table_type = 'BASE TABLE'
ORDER BY table_schema, table_name;
? ポイント
table_type の値は RDBMS によって微妙に異なります。BASE TABLE(実テーブル)は共通ですが、ビューは VIEW(MySQL/PostgreSQL)、VIEW(SQL Server)と同じです。
【応用】テーブル一覧 + レコード件数を一括取得
テーブル名だけでなく、各テーブルのレコード件数も同時に確認したい場面は多いです。データ量の把握やテスト環境の確認に役立ちます。
MySQL
MySQL
-- information_schema から概算行数を取得
SELECT table_name,
table_rows
FROM information_schema.tables
WHERE table_schema = 'your_database'
AND table_type = 'BASE TABLE'
ORDER BY table_rows DESC;
PostgreSQL
PostgreSQL
-- pg_stat_user_tables から概算行数を取得
SELECT schemaname,
relname AS table_name,
n_live_tup AS row_count
FROM pg_stat_user_tables
ORDER BY n_live_tup DESC;
Oracle
Oracle
-- 統計情報から概算行数を取得(要 ANALYZE 済み)
SELECT table_name, num_rows, last_analyzed
FROM user_tables
ORDER BY num_rows DESC NULLS LAST;
SQL Server
SQL Server
-- sys.dm_db_partition_stats から正確な行数を取得
SELECT t.name AS table_name,
SUM(p.rows) AS row_count
FROM sys.tables t
JOIN sys.dm_db_partition_stats p
ON t.object_id = p.object_id
WHERE p.index_id IN (0, 1) -- ヒープ or クラスタ化インデックス
GROUP BY t.name
ORDER BY row_count DESC;
【応用】テーブル一覧 + カラム情報を取得
テーブル構造を詳しく調べたいときは、information_schema.columns とJOINしてカラム情報も取得できます。
MySQL / PostgreSQL / SQL Server(共通)
SQL標準(MySQL / PostgreSQL / SQL Server 共通)
SELECT t.table_name,
c.column_name,
c.data_type,
c.is_nullable,
c.column_default
FROM information_schema.tables t
JOIN information_schema.columns c
ON t.table_schema = c.table_schema
AND t.table_name = c.table_name
WHERE t.table_type = 'BASE TABLE'
AND t.table_schema = 'public' -- スキーマ名は環境に合わせて変更
ORDER BY t.table_name, c.ordinal_position;
ordinal_position でソートすることで、テーブル定義順(CREATE TABLE時のカラム順)で表示されます。テーブル構造の把握に最適です。
Oracle
Oracle
SELECT t.table_name,
c.column_name,
c.data_type,
c.nullable,
c.data_default
FROM user_tables t
JOIN user_tab_columns c
ON t.table_name = c.table_name
ORDER BY t.table_name, c.column_id;
【応用】テーブルとビューを区別して表示
データベースには実テーブル(BASE TABLE)だけでなく、ビュー(VIEW)や一時テーブルも存在します。それぞれを区別して表示する方法を紹介します。
MySQL
-- テーブルとビューを種類別に表示
SELECT table_name,
table_type,
CASE table_type
WHEN 'BASE TABLE' THEN '実テーブル'
WHEN 'VIEW' THEN 'ビュー'
ELSE table_type
END AS type_label
FROM information_schema.tables
WHERE table_schema = DATABASE()
ORDER BY table_type, table_name;
Oracle
-- テーブルとビューを統合して表示
SELECT object_name, object_type
FROM user_objects
WHERE object_type IN ('TABLE', 'VIEW')
ORDER BY object_type, object_name;
【実務】よく使うシナリオ別クエリ集
実際の開発・運用で使えるシナリオ別のクエリを紹介します。
シナリオ1: 特定のカラムを持つテーブルを探す
「この名前のカラムって、どのテーブルにあったっけ?」という場面で使います。
MySQL
-- 'email' カラムを持つテーブルを検索
SELECT table_name, column_name, data_type
FROM information_schema.columns
WHERE table_schema = DATABASE()
AND column_name LIKE '%email%'
ORDER BY table_name;
シナリオ2: 空テーブル(レコード0件)を見つける
テスト後のクリーンアップや不要テーブルの特定に役立ちます。
MySQL
-- レコード0件のテーブルを表示
SELECT table_name
FROM information_schema.tables
WHERE table_schema = DATABASE()
AND table_type = 'BASE TABLE'
AND table_rows = 0;
シナリオ3: テーブルのデータサイズを確認
ディスク容量の把握やパフォーマンスチューニングの参考に。
MySQL
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
FROM information_schema.tables
WHERE table_schema = DATABASE()
AND table_type = 'BASE TABLE'
ORDER BY total_mb DESC;
シナリオ4: 最近更新されたテーブルを確認
SQL Server
-- 直近7日間に変更されたテーブル
SELECT name AS table_name,
create_date,
modify_date
FROM sys.tables
WHERE modify_date >= DATEADD(day, -7, GETDATE())
ORDER BY modify_date DESC;
シナリオ5: テスト環境と本番環境のテーブル差分を比較
デプロイやマイグレーション後に、テスト環境と本番環境のテーブル構成が一致しているか確認するクエリです。
MySQL(同一サーバー上の2つのDB比較)
-- 本番にあってテストにないテーブル
SELECT table_name, '本番のみ' AS status
FROM information_schema.tables
WHERE table_schema = 'production_db'
AND table_type = 'BASE TABLE'
AND table_name NOT IN (
SELECT table_name FROM information_schema.tables
WHERE table_schema = 'test_db'
)
UNION ALL
-- テストにあって本番にないテーブル
SELECT table_name, 'テストのみ' AS status
FROM information_schema.tables
WHERE table_schema = 'test_db'
AND table_type = 'BASE TABLE'
AND table_name NOT IN (
SELECT table_name FROM information_schema.tables
WHERE table_schema = 'production_db'
);
結果が空なら、両環境のテーブル構成は一致しています。マイグレーション漏れの早期発見に活用できます。
シナリオ6: テーブル間の依存関係(外部キー)を確認
テーブル一覧を取得した後、テーブル間の関連性(外部キー制約)を把握することで、DB構造の全体像が見えてきます。
MySQL
-- 外部キーの一覧(どのテーブルがどのテーブルを参照しているか)
SELECT kcu.TABLE_NAME AS child_table,
kcu.COLUMN_NAME AS child_column,
kcu.REFERENCED_TABLE_NAME AS parent_table,
kcu.REFERENCED_COLUMN_NAME AS parent_column
FROM information_schema.KEY_COLUMN_USAGE kcu
WHERE kcu.TABLE_SCHEMA = DATABASE()
AND kcu.REFERENCED_TABLE_NAME IS NOT NULL
ORDER BY child_table, child_column;
PostgreSQL
-- 外部キーの一覧
SELECT tc.table_name AS child_table,
kcu.column_name AS child_column,
ccu.table_name AS parent_table,
ccu.column_name AS parent_column
FROM information_schema.table_constraints tc
JOIN information_schema.key_column_usage kcu
ON tc.constraint_name = kcu.constraint_name
JOIN information_schema.constraint_column_usage ccu
ON tc.constraint_name = ccu.constraint_name
WHERE tc.constraint_type = 'FOREIGN KEY'
ORDER BY child_table;
テーブル一覧の取得でよくあるエラーと対処法
| エラー / 症状 |
原因 |
対処法 |
| No database selected |
USE文でDBを選択していない |
USE your_database; を実行 |
| テーブルが表示されない |
権限不足 / スキーマ指定ミス |
権限を確認 / スキーマ名を正しく指定 |
| ORA-00942: table or view does not exist |
DBA_TABLESにDBA権限なしでアクセス |
ALL_TABLES または USER_TABLES を使用 |
| システムテーブルまで表示される |
フィルタリング条件が不足 |
WHERE句でスキーマ/オーナーを絞り込む |
| 行数が実際と異なる |
統計情報が古い(概算値のため) |
ANALYZE TABLE で統計更新 or SELECT COUNT(*) で正確に取得 |
プログラミング言語からテーブル一覧を取得する
アプリケーションやスクリプトからテーブル一覧を動的に取得したい場面もあります。主要な言語での実装例を紹介します。
Python(MySQL)
Python
import mysql.connector
conn = mysql.connector.connect(
host='localhost', user='root',
password='pass', database='mydb'
)
cursor = conn.cursor()
cursor.execute('SHOW TABLES')
for (table_name,) in cursor:
print(table_name)
cursor.close()
conn.close()
PHP(PDO)
PHP
$pdo = new PDO('mysql:host=localhost;dbname=mydb', 'root', 'pass');
$stmt = $pdo->query('SHOW TABLES');
while ($row = $stmt->fetch(PDO::FETCH_NUM)) {
echo $row[0] . '\n';
}
Java(JDBC)
Java
// DatabaseMetaData を使う(RDBMS非依存)
Connection conn = DriverManager.getConnection(url, user, pass);
DatabaseMetaData meta = conn.getMetaData();
ResultSet rs = meta.getTables(
null, null, "%",
new String[]{"TABLE"}
);
while (rs.next()) {
System.out.println(rs.getString("TABLE_NAME"));
}
JavaのJDBCでは DatabaseMetaData.getTables() を使えば、RDBMS に依存しないコードでテーブル一覧を取得できます。MySQL、PostgreSQL、Oracle、SQL Server のいずれでも同じコードで動作します。
まとめ
テーブル一覧の取得方法は RDBMS ごとに異なりますが、基本的な考え方は共通しています。最後に要点を整理します。
| ポイント |
詳細 |
| 移植性重視なら |
information_schema.tables を使う(MySQL / PostgreSQL / SQL Server 共通) |
| 手軽さ重視なら |
各RDBMSの専用コマンド(SHOW TABLES、\dt、.tables など)が便利 |
| Oracle は独自路線 |
USER_TABLES / ALL_TABLES / DBA_TABLES を権限レベルに応じて使い分け |
| 応用テクニック |
レコード件数・カラム情報・データサイズの取得でDB構造を完全把握 |
| ビューの除外 |
table_type = 'BASE TABLE' や SHOW FULL TABLES で区別可能 |
関連記事