【SQL】テーブル一覧を取得する方法|MySQL・PostgreSQL・Oracle・SQL Server・SQLite対応

【SQL】テーブル一覧を取得する方法|MySQL・PostgreSQL・Oracle・SQL Server・SQLite対応 SQL

データベースの構造を把握する第一歩は、テーブル一覧の取得です。新しいプロジェクトに参画したとき、レガシーDBを調査するとき、テスト環境と本番環境の差分を確認するとき――あらゆる場面でこのスキルが必要になります。

しかし、テーブル一覧の取得方法はRDBMS(データベース管理システム)ごとに異なります。この記事では、MySQL・PostgreSQL・Oracle・SQL Server・SQLiteの5大RDBMSそれぞれの方法を、基本から応用まで体系的に解説します。

さらに、SQL標準(ISO/IEC 9075)で定義された information_schema を使った移植性の高い方法も紹介するので、複数のRDBMSを扱う現場でも役立つ知識が身につきます。

スポンサーリンク
  1. RDBMS別テーブル一覧取得の早見表
  2. MySQL でテーブル一覧を取得する
    1. SHOW TABLES(基本)
    2. SHOW FULL TABLES(テーブル種類を表示)
    3. SHOW TABLES FROM(別データベースのテーブル)
    4. SHOW TABLES LIKE(パターンで絞り込み)
    5. SHOW TABLE STATUS(詳細情報の取得)
    6. MariaDB での互換性
  3. PostgreSQL でテーブル一覧を取得する
    1. \dt メタコマンド(psql専用)
    2. information_schema.tables(SQL標準)
    3. pg_tables ビュー(PostgreSQL独自)
  4. Oracle でテーブル一覧を取得する
    1. USER_TABLES(自分のテーブル)
    2. ALL_TABLES(アクセス可能なテーブル)
    3. DBA_TABLES(データベース全体)
  5. SQL Server でテーブル一覧を取得する
    1. sys.tables(推奨)
    2. INFORMATION_SCHEMA.TABLES(SQL標準)
    3. sys.objects(汎用的な方法)
  6. SQLite でテーブル一覧を取得する
    1. sqlite_master テーブル
    2. .tables コマンド(CLIツール)
  7. information_schema とは?SQL標準のメタデータ
    1. 各RDBMSの information_schema 対応状況
    2. information_schema.tables の共通クエリ
  8. 【応用】テーブル一覧 + レコード件数を一括取得
    1. MySQL
    2. PostgreSQL
    3. Oracle
    4. SQL Server
  9. 【応用】テーブル一覧 + カラム情報を取得
    1. MySQL / PostgreSQL / SQL Server(共通)
    2. Oracle
  10. 【応用】テーブルとビューを区別して表示
  11. 【実務】よく使うシナリオ別クエリ集
    1. シナリオ1: 特定のカラムを持つテーブルを探す
    2. シナリオ2: 空テーブル(レコード0件)を見つける
    3. シナリオ3: テーブルのデータサイズを確認
    4. シナリオ4: 最近更新されたテーブルを確認
    5. シナリオ5: テスト環境と本番環境のテーブル差分を比較
    6. シナリオ6: テーブル間の依存関係(外部キー)を確認
  12. テーブル一覧の取得でよくあるエラーと対処法
  13. プログラミング言語からテーブル一覧を取得する
    1. Python(MySQL)
    2. PHP(PDO)
    3. Java(JDBC)
  14. まとめ
    1. 関連記事

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(基本)

MySQL
SHOW TABLES;

現在接続しているデータベース内のすべてのテーブル名が一覧で返されます。

▼ 実行結果の例
Tables_in_mydb
customers
orders
products
employees

SHOW FULL TABLES(テーブル種類を表示)

FULL を付けると、各オブジェクトがテーブル(BASE TABLE)なのかビュー(VIEW)なのかを区別できます。

MySQL
SHOW FULL TABLES;
▼ 実行結果の例
Tables_in_mydb Table_type
customersBASE TABLE
ordersBASE TABLE
productsBASE TABLE
v_active_customersVIEW

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 TABLESSHOW FULL TABLESSHOW TABLE STATUSinformation_schema.tables がすべてそのまま使えます。MariaDB 10.5 以降では SHOW FULL TABLES の Table_type に SEQUENCE が追加されている点が MySQL との主な違いです。

MySQLのテーブル操作についてさらに学ぶなら、ALTER TABLEで列の追加や変更を行う方法DROP TABLEでテーブルを削除する方法もご覧ください。phpMyAdmin を使用している場合は、左パネルのデータベース名をクリックするだけでテーブル一覧を確認できます。

PostgreSQL でテーブル一覧を取得する

PostgreSQLでは、psqlメタコマンドinformation_schemapg_tables ビューの3つの方法があります。

\dt メタコマンド(psql専用)

psql(PostgreSQLの対話型ターミナル)では、バックスラッシュコマンドで素早くテーブル一覧を確認できます。

PostgreSQL(psql)
-- テーブル一覧
\dt

-- 詳細情報付き(サイズ・説明)
\dt+

-- 特定スキーマのテーブル
\dt myschema.*

-- パターンで絞り込み
\dt user*
▼ \dt の実行結果例
Schema Name Type Owner
publiccustomerstablepostgres
publicorderstablepostgres
publicproductstablepostgres

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_mastersql カラムには、テーブル作成時の 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 で区別可能

関連記事