SQLでテーブル一覧を確認する方法|MySQL・PostgreSQL・SQL Server別の完全ガイド

データベース・SQL

データベースを使い始めた時、最初に困るのが「このデータベースには何のテーブルがあるんだろう?」という疑問です。特に他人が作ったデータベースや、しばらく触っていなかったプロジェクトでは、どんなテーブルが存在するのか把握できないと作業が進みませんよね。

また、テーブル名を忘れてしまった時や、似た名前のテーブルがたくさんある時、一覧を見て確認したくなることもあるでしょう。

実は、SQLでテーブル一覧を取得する方法は、データベース管理システム(DBMS)によって少しずつ異なります。MySQLではSHOW TABLESが使えますが、PostgreSQLでは別のコマンドが必要です。

この記事では、主要なデータベースシステムごとに、テーブル一覧を確認する方法を分かりやすく解説していきます。基本的な方法から、条件を指定した検索まで、実践的な使い方を学びましょう。

スポンサーリンク
  1. テーブル一覧を見る基本的な方法
    1. MySQL/MariaDBの場合
    2. PostgreSQLの場合
    3. SQL Serverの場合
    4. Oracleの場合
  2. INFORMATION_SCHEMA を使った標準的な方法
    1. INFORMATION_SCHEMAとは
    2. 基本的な使い方
    3. TABLE_TYPEの種類
    4. 詳細情報も一緒に取得
  3. テーブル名を条件で絞り込む
    1. 部分一致検索
    2. 複数の条件で絞り込み
    3. 正規表現を使った検索
    4. 特定のサイズ以上のテーブルを探す
  4. テーブルの詳細情報を取得する
    1. テーブルの列情報を取得
    2. インデックス情報を確認
    3. テーブルの作成DDLを確認
  5. GUIツールでテーブル一覧を確認する
    1. MySQL Workbench
    2. pgAdmin(PostgreSQL用)
    3. DBeaver(複数のDBに対応)
    4. SQL Server Management Studio
  6. 実践的な使用例
    1. 例1:全テーブルのサイズを確認
    2. 例2:最近更新されたテーブルを探す
    3. 例3:命名規則に従っていないテーブルを探す
    4. 例4:主キーがないテーブルを探す
    5. 例5:ビューとテーブルを区別して表示
  7. データベース管理で役立つクエリ集
    1. 全テーブルの行数を集計
    2. テーブル名とコメントを表示
    3. エンジンごとにテーブルを分類
    4. 空のテーブルを見つける
  8. よくある質問と回答
    1. Q1:システムテーブルを除外するには?
    2. Q2:一時テーブルは表示される?
    3. Q3:他のユーザーが所有するテーブルも見える?
    4. Q4:テーブル一覧の取得は遅い?
    5. Q5:プログラムからテーブル一覧を取得したい
  9. データベース別の特殊な機能
    1. MySQLの便利な機能
    2. PostgreSQLの便利な機能
    3. SQL Serverの便利な機能
  10. まとめ:テーブル一覧を使いこなそう

テーブル一覧を見る基本的な方法

まずは、各データベースシステムで最も基本的なテーブル一覧の確認方法を見ていきます。

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

  1. データベースに接続
  2. 左側の「Schemas」タブをクリック
  3. データベース名を展開
  4. 「Tables」フォルダを展開

テーブル一覧が階層表示されます。各テーブルをクリックすると、列情報やインデックスも確認できます。

検索機能
上部の検索バーに文字を入力すると、テーブル名でフィルタリングできます。

pgAdmin(PostgreSQL用)

  1. サーバーに接続
  2. データベースを展開
  3. 「Schemas」→「public」を展開
  4. 「Tables」をクリック

右側のペインにテーブル一覧が表示されます。

DBeaver(複数のDBに対応)

  1. データベースに接続
  2. ナビゲータでデータベースを展開
  3. テーブル一覧が表示される

検索機能やフィルタリングも充実しており、大量のテーブルを扱う時に便利です。

SQL Server Management Studio

  1. オブジェクトエクスプローラーでデータベースを展開
  2. 「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でテーブル一覧を取得する方法について、理解が深まったでしょうか。

重要なポイントをおさらい

  1. MySQLSHOW TABLESが最もシンプル
  2. PostgreSQL\dtコマンドまたはinformation_schema
  3. 標準的な方法:INFORMATION_SCHEMAを使えばどのDBMSでも可
  4. 詳細情報:DESCRIBEやSHOW CREATE TABLEで構造を確認
  5. 実践的な活用:サイズ確認、命名規則チェックなど

データベースを使う上で、テーブル一覧の確認は基本中の基本です。特に以下のような場面で役立ちます。

  • 初めて触るデータベースの構造を把握する
  • 大規模なデータベースで特定のテーブルを探す
  • データベースの容量を管理する
  • 命名規則や設計の品質をチェックする

INFORMATION_SCHEMAを使った標準的な方法を覚えておけば、どのデータベースシステムでも応用できます。まずは基本のSELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLESから始めて、徐々に条件を追加したり、詳細情報を取得したりしてみてください。

データベース管理の第一歩として、テーブル一覧の取得方法をしっかりマスターしておきましょう!

コメント

タイトルとURLをコピーしました