「データベースにどんなテーブルがあるか確認したい」
「テーブルの詳細情報も一緒に見たい」
「特定のスキーマのテーブルだけ表示したい」
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つの方法
- psqlなら\dt
- 最速で簡単
- インタラクティブな作業に最適
- プログラムからならinformation_schema
- 標準SQL準拠
- 移植性が高い
- 詳細情報なら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から始めて、徐々に高度な方法も試してみてくださいね!
コメント