PostgreSQLテーブル一覧の取得方法完全ガイド!psqlコマンドからSQLクエリまで

データベース・SQL

「データベースにどんなテーブルがあるか確認したい」
「テーブルの詳細情報も一緒に見たい」
「特定のスキーマのテーブルだけ表示したい」

PostgreSQLを使い始めると、必ず必要になるのがテーブル一覧の確認ですよね。

実は、テーブル一覧を取得する方法はたくさんあって、それぞれに便利な使い方があるんです。psqlコマンドの\dtから、SQLクエリを使った詳細な検索まで、状況に応じて使い分けることで作業効率が格段にアップします!

この記事を読めば、あなたもテーブル一覧取得のプロになれます。さっそく見ていきましょう!


スポンサーリンク

最速!psqlコマンドでテーブル一覧を見る

基本の\dtコマンド(これだけ覚えればOK)

psqlを使っているなら、これが一番簡単です。

-- 現在のデータベースの全テーブルを表示
\dt

-- 実行結果の例
              List of relations
 Schema |      Name       | Type  |  Owner
--------+-----------------+-------+----------
 public | users          | table | postgres
 public | products       | table | postgres
 public | orders         | table | postgres

たった3文字!これだけで、現在接続しているデータベースのテーブル一覧が見られます。

パターンマッチングで絞り込み

特定のテーブルだけを探したい時に便利です。

-- userで始まるテーブルを検索
\dt user*

-- orderを含むテーブルを検索
\dt *order*

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

💡 便利な使い方:
ワイルドカード(*)を使えば、部分一致検索ができます!

より詳しい情報を見る\dt+

テーブルのサイズや説明も一緒に表示できます。

-- 詳細情報付きでテーブル一覧を表示
\dt+

-- 実行結果の例
                          List of relations
 Schema |   Name    | Type  |  Owner   | Persistence | Size  | Description
--------+-----------+-------+----------+-------------+-------+-------------
 public | users     | table | postgres | permanent   | 16 MB | ユーザー情報
 public | products  | table | postgres | permanent   | 8 MB  | 商品マスタ
 public | orders    | table | postgres | permanent   | 120 MB| 注文データ

サイズが分かると、パフォーマンスチューニングの参考になりますね!


psqlの便利なメタコマンド集

\d:最強の情報取得コマンド

\dは、テーブルだけでなく様々なオブジェクトの情報を取得できます。

-- テーブルの詳細構造を表示
\d users

-- 結果例
                Table "public.users"
  Column   |          Type          | Nullable | Default
-----------+------------------------+----------+---------
 id        | integer                | not null | nextval('users_id_seq')
 name      | character varying(100) | not null |
 email     | character varying(255) | not null |
 created_at| timestamp              |          | now()

その他の便利なコマンド

-- すべてのリレーション(テーブル、ビュー、シーケンスなど)
\d

-- ビューの一覧
\dv

-- インデックスの一覧
\di

-- シーケンスの一覧
\ds

-- 外部テーブルの一覧
\det

-- スキーマの一覧
\dn

-- 現在のデータベース一覧
\l

SQLクエリでテーブル一覧を取得

information_schemaを使う方法(標準的)

SQLクエリでテーブル一覧を取得する最も標準的な方法です。

-- 基本的なテーブル一覧取得
SELECT table_name 
FROM information_schema.tables 
WHERE table_schema = 'public' 
AND table_type = 'BASE TABLE';

-- より詳しい情報を含めて取得
SELECT 
    table_schema AS schema,
    table_name AS table,
    table_type AS type
FROM information_schema.tables
WHERE table_schema NOT IN ('pg_catalog', 'information_schema')
ORDER BY table_schema, table_name;

メリット:

  • SQL標準に準拠
  • 他のデータベースでも似た構文が使える
  • プログラムから実行しやすい

pg_catalogを使う方法(PostgreSQL専用)

PostgreSQL固有の方法ですが、より詳細な情報が取得できます。

-- pg_catalogを使ったテーブル一覧取得
SELECT 
    schemaname AS schema,
    tablename AS table,
    tableowner AS owner
FROM pg_catalog.pg_tables
WHERE schemaname NOT IN ('pg_catalog', 'information_schema')
ORDER BY schemaname, tablename;

-- テーブルサイズも含めて取得
SELECT 
    schemaname,
    tablename,
    pg_size_pretty(pg_total_relation_size(schemaname||'.'||tablename)) AS size
FROM pg_tables
WHERE schemaname = 'public'
ORDER BY pg_total_relation_size(schemaname||'.'||tablename) DESC;

テーブルの詳細情報を取得する

カラム情報の取得

テーブルのカラム構成を確認する方法です。

-- 特定テーブルのカラム情報
SELECT 
    column_name,
    data_type,
    character_maximum_length,
    is_nullable,
    column_default
FROM information_schema.columns
WHERE table_name = 'users'
ORDER BY ordinal_position;

-- データ型の詳細も含めて
SELECT 
    c.column_name,
    c.data_type,
    CASE 
        WHEN c.character_maximum_length IS NOT NULL 
        THEN c.data_type || '(' || c.character_maximum_length || ')'
        WHEN c.numeric_precision IS NOT NULL 
        THEN c.data_type || '(' || c.numeric_precision || ',' || c.numeric_scale || ')'
        ELSE c.data_type
    END AS full_type,
    c.is_nullable,
    c.column_default
FROM information_schema.columns c
WHERE c.table_name = 'products';

テーブルのサイズと行数

パフォーマンス分析に役立つ情報です。

-- テーブルごとのサイズと行数
SELECT 
    schemaname AS schema,
    tablename AS table,
    pg_size_pretty(pg_total_relation_size(schemaname||'.'||tablename)) AS total_size,
    pg_size_pretty(pg_relation_size(schemaname||'.'||tablename)) AS table_size,
    pg_size_pretty(pg_indexes_size(schemaname||'.'||tablename)) AS indexes_size,
    n_live_tup AS row_count
FROM pg_tables
LEFT JOIN pg_stat_user_tables 
    ON pg_tables.tablename = pg_stat_user_tables.relname
    AND pg_tables.schemaname = pg_stat_user_tables.schemaname
WHERE pg_tables.schemaname = 'public'
ORDER BY pg_total_relation_size(pg_tables.schemaname||'.'||pg_tables.tablename) DESC;

インデックス情報の取得

-- テーブルに設定されているインデックス
SELECT 
    i.indexname,
    i.indexdef,
    pg_size_pretty(pg_relation_size(i.indexname::regclass)) AS size
FROM pg_indexes i
WHERE i.tablename = 'users';

-- すべてのテーブルのプライマリキー
SELECT 
    tc.table_name,
    kcu.column_name,
    tc.constraint_name
FROM information_schema.table_constraints tc
JOIN information_schema.key_column_usage kcu 
    ON tc.constraint_name = kcu.constraint_name
WHERE tc.constraint_type = 'PRIMARY KEY'
AND tc.table_schema = 'public'
ORDER BY tc.table_name;

条件付きでテーブルを検索

特定の条件でフィルタリング

-- 最近作成されたテーブル(PostgreSQL 12以降)
SELECT 
    schemaname,
    tablename,
    tableowner
FROM pg_tables
WHERE schemaname = 'public'
ORDER BY tablename DESC
LIMIT 10;

-- 特定のカラムを持つテーブルを検索
SELECT DISTINCT table_name
FROM information_schema.columns
WHERE column_name = 'email'
AND table_schema = 'public';

-- 特定のデータ型を使用しているテーブル
SELECT 
    table_name,
    column_name,
    data_type
FROM information_schema.columns
WHERE data_type = 'json'
OR data_type = 'jsonb'
ORDER BY table_name, column_name;

パーティションテーブルの確認

-- パーティションテーブルの親テーブル
SELECT 
    schemaname,
    tablename,
    tableowner
FROM pg_tables
WHERE tablename IN (
    SELECT DISTINCT inhparent::regclass::text
    FROM pg_inherits
);

-- パーティションの一覧
SELECT 
    nmsp_parent.nspname AS parent_schema,
    parent.relname AS parent_table,
    nmsp_child.nspname AS child_schema,
    child.relname AS child_table
FROM pg_inherits
JOIN pg_class parent ON pg_inherits.inhparent = parent.oid
JOIN pg_class child ON pg_inherits.inhrelid = child.oid
JOIN pg_namespace nmsp_parent ON parent.relnamespace = nmsp_parent.oid
JOIN pg_namespace nmsp_child ON child.relnamespace = nmsp_child.oid;

権限情報を含めたテーブル一覧

アクセス権限の確認

-- テーブルごとの権限
SELECT 
    schemaname,
    tablename,
    tableowner,
    HAS_TABLE_PRIVILEGE(tablename, 'SELECT') AS can_select,
    HAS_TABLE_PRIVILEGE(tablename, 'INSERT') AS can_insert,
    HAS_TABLE_PRIVILEGE(tablename, 'UPDATE') AS can_update,
    HAS_TABLE_PRIVILEGE(tablename, 'DELETE') AS can_delete
FROM pg_tables
WHERE schemaname = 'public';

-- 特定ユーザーの権限確認
SELECT 
    table_schema,
    table_name,
    privilege_type
FROM information_schema.table_privileges
WHERE grantee = 'username'
ORDER BY table_schema, table_name;

実用的なスクリプト集

テーブル定義書の自動生成

-- テーブル定義書用のSQL
WITH table_info AS (
    SELECT 
        t.table_name,
        obj_description(c.oid) AS table_comment
    FROM information_schema.tables t
    JOIN pg_class c ON c.relname = t.table_name
    WHERE t.table_schema = 'public'
),
column_info AS (
    SELECT 
        c.table_name,
        c.ordinal_position,
        c.column_name,
        c.data_type,
        c.character_maximum_length,
        c.is_nullable,
        c.column_default,
        col_description(pgc.oid, c.ordinal_position) AS column_comment
    FROM information_schema.columns c
    JOIN pg_class pgc ON pgc.relname = c.table_name
    WHERE c.table_schema = 'public'
)
SELECT 
    ti.table_name AS "テーブル名",
    ti.table_comment AS "テーブル説明",
    ci.column_name AS "カラム名",
    ci.data_type AS "データ型",
    ci.is_nullable AS "NULL許可",
    ci.column_default AS "デフォルト値",
    ci.column_comment AS "カラム説明"
FROM table_info ti
JOIN column_info ci ON ti.table_name = ci.table_name
ORDER BY ti.table_name, ci.ordinal_position;

メンテナンス用情報取得

-- VACUUM/ANALYZE実行状況
SELECT 
    schemaname,
    tablename,
    last_vacuum,
    last_autovacuum,
    last_analyze,
    last_autoanalyze,
    vacuum_count,
    autovacuum_count
FROM pg_stat_user_tables
WHERE schemaname = 'public'
ORDER BY last_vacuum DESC NULLS LAST;

よく使うパターンと便利な関数

テーブル存在チェック

-- テーブルが存在するかチェック
SELECT EXISTS (
    SELECT FROM information_schema.tables 
    WHERE table_schema = 'public' 
    AND table_name = 'users'
);

-- 関数として定義
CREATE OR REPLACE FUNCTION table_exists(p_table_name TEXT, p_schema TEXT DEFAULT 'public')
RETURNS BOOLEAN AS $$
BEGIN
    RETURN EXISTS (
        SELECT FROM information_schema.tables 
        WHERE table_schema = p_schema 
        AND table_name = p_table_name
    );
END;
$$ LANGUAGE plpgsql;

-- 使用例
SELECT table_exists('users');

動的なテーブル操作

-- すべてのテーブルに対して処理を実行
DO $$
DECLARE
    r RECORD;
BEGIN
    FOR r IN 
        SELECT tablename 
        FROM pg_tables 
        WHERE schemaname = 'public'
    LOOP
        EXECUTE 'ANALYZE ' || r.tablename;
        RAISE NOTICE 'Analyzed table: %', r.tablename;
    END LOOP;
END $$;

まとめ:状況に応じて最適な方法を選ぼう!

ここまで読んでいただき、ありがとうございました!

今すぐ使える3つの方法

  1. psqlなら\dt
  • 最速で簡単
  • インタラクティブな作業に最適
  1. プログラムからならinformation_schema
  • 標準SQL準拠
  • 移植性が高い
  1. 詳細情報ならpg_catalog
  • PostgreSQL専用
  • 最も詳しい情報が取得可能

用途別クイックリファレンス

ただテーブル名を見たい

\dt

サイズも含めて見たい

\dt+

特定のテーブルを探したい

\dt *user*

プログラムから取得

SELECT table_name FROM information_schema.tables WHERE table_schema = 'public';

詳細な分析

SELECT * FROM pg_tables WHERE schemaname = 'public';

テーブル一覧の取得は、データベース管理の基本中の基本。

この記事で紹介した方法を使い分けることで、効率的にデータベースを管理できるようになります。まずは\dtから始めて、徐々に高度な方法も試してみてくださいね!

コメント

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