\dvコマンドでビュー一覧を確認する
PostgreSQLでビュー一覧を確認するには、psqlコマンドラインツールの\dvコマンドを使う。
testdb=# \dv
List of relations
Schema | Name | Type | Owner
--------+-------------+------+-------
public | user_orders | view | postgres
(1 row)
\dvは自分で作成したスキーマとpublicスキーマのビューだけを表示し、pg_catalogなどのシステムスキーマは除外される。
\dv+で所有者・サイズ・コメントも表示する
+を付けると永続性・サイズ・コメントの列が追加される。
testdb=# \dv+
List of relations
Schema | Name | Type | Owner | Persistence | Size | Description
--------+-------------+------+-------+-------------+---------+-------------
public | user_orders | view | postgres | permanent | 0 bytes |
(1 row)
ビューは実体データを持たないため、Size列は常に0 bytesになる。
名前で絞り込む
\dvの後ろにパターンを指定すると、特定のスキーマや名前のビューだけに絞り込める。
testdb=# \dv app.*
List of relations
Schema | Name | Type | Owner
--------+-------------+------+-------
app | user_orders | view | postgres
(1 row)
パターンを指定した場合はシステムスキーマも検索対象に含まれる。
\dとの違い
引数なしの\dはテーブル・ビュー・シーケンス・マテリアライズドビューなど、あらゆる種類のリレーションをまとめて表示する。
testdb=# \d
List of relations
Schema | Name | Type | Owner
--------+---------------+-------------------+-------
public | docs | table | postgres
public | docs_id_seq | sequence | postgres
public | events | partitioned table | postgres
public | events_2026 | table | postgres
public | invoice_seq | sequence | postgres
public | order_summary | materialized view | postgres
public | orders | table | postgres
public | orders_id_seq | sequence | postgres
public | user_orders | view | postgres
public | users | table | postgres
public | users_id_seq | sequence | postgres
(11 rows)
ビューだけに絞り込みたい場合は\dvを使う。
参考: 【PostgreSQL】SQLでテーブル一覧を取得する
information_schema.viewsでビュー一覧を確認する
SQLでビュー一覧を取得する場合はinformation_schema.viewsビューを参照する。
testdb=# SELECT table_schema, table_name
testdb-# FROM information_schema.views
testdb-# WHERE table_schema NOT IN ('pg_catalog', 'information_schema')
testdb-# ORDER BY table_schema, table_name;
table_schema | table_name
--------------+-------------
app | user_orders
public | user_orders
(2 rows)
information_schema.viewsにはビューの定義そのものを取得できるview_definition列もある。
testdb=# SELECT view_definition
testdb-# FROM information_schema.views
testdb-# WHERE table_schema = 'public' AND table_name = 'user_orders';
view_definition
----------------------------------------------
SELECT u.name, +
o.amount +
FROM (users u +
JOIN orders o ON ((u.id = o.user_id)));
(1 row)
同じテーブル名のビューが複数スキーマに存在する場合があるため、table_nameだけでなくtable_schemaも条件に含めて1件に絞り込む。
pg_classでビュー一覧を確認する
information_schema.viewsは権限に応じて見える範囲が絞られる。権限に関係なくすべてのビューを取得したい場合はpg_classをrelkind = 'v'で絞り込む。
testdb=# SELECT n.nspname, c.relname
testdb-# FROM pg_class c
testdb-# JOIN pg_namespace n ON n.oid = c.relnamespace
testdb-# WHERE c.relkind = 'v'
testdb-# AND n.nspname NOT IN ('pg_catalog', 'information_schema')
testdb-# ORDER BY 1, 2;
nspname | relname
---------+-------------
app | user_orders
public | user_orders
(2 rows)
relkindはvがビュー、mがマテリアライズドビュー、rが通常のテーブルを表す。psqlの\dvも内部的にはこのpg_classを参照している。
マテリアライズドビューは含まれない
\dv・information_schema.views・pg_class(relkind = 'v')のいずれも、マテリアライズドビュー(relkind = 'm')は含まない。マテリアライズドビュー一覧を確認する場合は\dmを使う。
testdb=# \dm
List of relations
Schema | Name | Type | Owner
--------+---------------+-------------------+-------
public | order_summary | materialized view | postgres
(1 row)
見た目は似ているが、CREATE VIEWで作る通常のビューとCREATE MATERIALIZED VIEWで作るマテリアライズドビューは別の種類のオブジェクトとして扱われる。
