(最終更新月: 2025年7月15日)
✓当記事はこんな方におすすめです
「PostgreSQLでテーブル一覧を手軽に確認したい」
「SQL標準形式でテーブル情報を取得し、移植性の高いコードを書きたい」
「PostgreSQL専用の高度なメタデータや管理情報も取得したい」
✓当記事で理解できること
- PostgreSQLにおけるテーブル一覧取得の基本
- psqlコマンド、information_schema、pg_catalogの違いと具体的な使い方
- 現役エンジニアが選ぶ最適な手法とその選び方
本記事では、PostgreSQLのテーブル一覧取得を「psqlメタコマンド」「information_schema」「pg_catalog」という3つの公式アプローチごとに、基礎理論と実例、そしてユースケース比較まで徹底解説します。
プログラミング初学者・未経験エンジニア志望者でも“なぜこの方法を選ぶのか”まで理解できる構成になっています。ぜひ最後までお読みください!
それでは、一緒に見ていきましょう。
PostgreSQLのテーブル一覧取得3大アプローチとは
このセクションでは、PostgreSQLでテーブル一覧を取得するための主な3つの方法について説明します。
なぜなら、目的や作業環境によって「最適な取得方法」が大きく異なるからです。
- psqlメタコマンド(\dt)
- information_schemaビュー(SQL標準)
- pg_catalogビュー(PostgreSQL固有)
psqlメタコマンド(\dt)のイメージと特徴
psqlメタコマンドは、ターミナル操作ですぐにテーブル情報を確認したいときに最強の武器となります。
理由は、PostgreSQL公式クライアント『psql』からバックスラッシュで始まるショートカット(\dtなど)を打つだけで、即座にテーブル情報を出力できるからです。
実際にDB管理者として初めて実務現場に入った時、私はpsqlの\dtコマンドで「public」スキーマ全体のテーブルを一瞬で把握でき、とても安心感を得られました。
結果として、管理者やエンジニア、データアナリストがインタラクティブにテーブル名を知りたい場合は、まず\dtから始めると覚えておくと便利です。
information_schemaビュー(SQL標準)
移植性・セキュリティ重視のアプリケーション開発では、必ずinformation_schema.tablesビューを使うべきです。
なぜなら、これはSQL標準に準拠し、PostgreSQLのバージョンアップや他DB(MySQL, SQL Server等)でも同じ構文が利用できる安全な方法だからです。
たとえばデータ分析ツールやWebアプリで一括でスキーマ情報を取得する際、information_schemaからSQLで取れば、ユーザー権限を自動的に尊重した一覧情報が出力できます。
したがって、「移植性が高く、安心できる情報が欲しい場合は迷わずinformation_schema」を基準としましょう。
pg_catalog(PostgreSQL独自)の活用ポイント
PostgreSQL独自の高度なテーブル情報やパフォーマンス分析をしたいなら、pg_catalogビューを直接クエリしましょう。
理由は、pg_catalogはデータベースの中核そのものであり、物理的な情報や所有者・インデックス有無といった情報まで豊富に取得できるからです。
以前、権限管理や自作スクリプトで「どのユーザーがどのテーブルを持つか?」を一括抽出したいときに、pg_catalog.pg_tablesからtableowner列を参照することで一発集計ができて重宝しました。
PostgreSQL上級者やDBA(管理者)がカスタマイズされた深い管理を目指す場面では、pg_catalogへの直接SQLが最適です。
psqlメタコマンド「\dt」コマンドの実践的使い方
このセクションでは、psqlメタコマンドの基礎から高度な活用法までを解説します。
なぜなら、多くの現場エンジニアが「まずどのテーブルがあるか?」を一瞬で知るためにこの手法を多用しているからです。
- 基本の\dtコマンドと出力例
- フィルタ機能(スキーマ/テーブル名指定)
- \dt+で管理者向けの追加情報を取得する
基本の\dtコマンドと出力例
\dtを実行するだけで、検索パス内のユーザー定義テーブル一覧が即表示されます。
理由は、\dtが「display tables」の略で、psqlクライアントが自動で内部SQLを発行・整形出力してくれるためです。
例:
psql -U your_user -d your_database
your_database=> \dt
このコマンドで「Schema / Name / Type / Owner」列が分かりやすく見えるので、IT企業の朝会で「開発対象テーブルの全体像」を初見で把握できます。
結果として、数百テーブルのある大規模DBでも即時に全貌を知るコア機能だ、と実感できます。
フィルタ機能(スキーマ/テーブル名指定)
psqlの\dtコマンドは、スキーマ指定やワイルドカードによる柔軟なフィルタリングが可能です。
なぜなら、引数を組み合わせることで、特定スキーマや部分一致するテーブル名だけ取り出せる設計だからです。
例えば、publicスキーマだけ:
your_database=> \dt public.*
名前に「log」を含むテーブルだけ:
your_database=> \dt *.*log*
この柔軟性は、ITエンジニアが作業時に「必要な情報だけ」ピックアップする効率性を強力に高めてくれます。
結果的に、規模の大きい現場や複数プロジェクトの保守でも、混乱せず目的のテーブルに一発アクセスできるようになります。
\dt+で管理者向けの追加情報を取得する
\dt+コマンドを使えば、テーブルごとの実際のディスク容量や説明など、より詳細な情報を一括取得できます。
これは単なる一覧表示に留まらず、パフォーマンス管理やドキュメント整備の場面でも便利だからです。
たとえばdb容量が逼迫していたとき、\dt+でSize列を一目見て急増テーブルを発見・即対応できた、という経験も多く聞きます。
your_database=> \dt+
「Size」「Description」「Persistence」などの列は、管理効率やチームの情報共有を格段に高めます。
よって、容量問題やテーブルの役割把握で困ったらまず\dt+の活用を定石化してください。
SQLによる汎用的な方法:information_schemaとpg_catalogの徹底比較
このセクションでは、SQLクエリでテーブル一覧を取得する2つの方法「information_schema」と「pg_catalog」について具体的に掘り下げます。
なぜなら、アプリケーションから自動取得したり、移植性・詳細性の違いを理解することは現場開発で避けて通れないからです。
- information_schema.tables:SQL標準、多用途な例
- pg_catalog.pg_tables:PostgreSQL固有の応用力
- どちらを使う?比較とケース別推奨
information_schema.tables:SQL標準、多用途な例
移植性と安全性を求めるなら、まずはinformation_schema.tablesビューを使うべきです。
理由は、MySQL・Oracle・SQL Serverなどほかの主要DBでもほぼ同じ構文で使えるSQL標準ビューだからです。
publicスキーマから全テーブル・ビューを取得:
SELECT table_name, table_type FROM information_schema.tables WHERE table_schema = 'public' ORDER BY table_type, table_name;
ベーステーブル(物理テーブル)のみ:
SELECT table_schema, table_name FROM information_schema.tables WHERE table_type = 'BASE TABLE' AND table_schema NOT IN ('pg_catalog', 'information_schema') ORDER BY table_schema, table_name;
名前に「user」を含む場合:
SELECT table_schema, table_name FROM information_schema.tables WHERE table_type = 'BASE TABLE' AND table_name LIKE '%user%';
初心者の「SQL学習」を進めるなら【SQLの基本】LIKEの使い方|場面別の活用例を元に徹底解説で部分一致抽出もぜひ学んでみてください。
結果として、移植性や、エラー発生時の保守運用上も優れたやり方だと毎回実感します。
pg_catalog.pg_tables:PostgreSQL固有の応用力
PostgreSQL固有の詳細・高速なテーブル情報が必要な場合、pg_catalog.pg_tablesへのクエリが有効です。
理由は、tableownerやインデックス有無・格納先tablespaceなど、より管理者向けの情報が含まれるためです。
ユーザー定義テーブルのみ取り出す場合:
SELECT schemaname, tablename FROM pg_catalog.pg_tables WHERE schemaname NOT IN ('pg_catalog', 'information_schema') ORDER BY schemaname, tablename;
所有者ごとのテーブル抽出:
SELECT schemaname, tablename FROM pg_catalog.pg_tables WHERE tableowner = 'your_user';
インデックスがあるテーブルのみ:
SELECT schemaname, tablename FROM pg_catalog.pg_tables WHERE hasindexes = TRUE AND schemaname = 'public';
実際、「データ量が多いDBで、インデックス付きテーブルだけ早く集計したい」とき、本手法を活用することで、瞬時に分析用リストを作れました。
移植性不要&DBチューニングや棚卸し用途には最高な手法です。
どちらを使う?比較とケース別推奨
アプリや共通スクリプト→information_schema、管理や分析→pg_catalogという使い分けが基本方針です。
information_schemaは「将来のバージョン変更や他DBでも動くSQL」、pg_catalogは「PostgreSQLの情報をフルに引き出す力」をもちます。
例えば移行想定のあるプロジェクトや、開発チームで「安全なコード=information_schema」、一方で「運用監視・権限分析=pg_catalog」という使い方が王道です。
環境や将来の要件によって、今後の「保守運用コスト」も変わってくるため、用途と現場要件をよく考えて賢く選択しましょう。
PostgreSQLテーブル一覧取得:応用パターンと注意点
このセクションでは、実務現場でもよく求められる「応用的な一覧取得」のパターンや注意点について紹介します。
なぜなら、実際には単なる全件一覧だけでは業務要件を満たさないことが多いからです。
- 特定スキーマ/パターンで絞り込む例
- カラム・インデックス情報の取得法
- システムテーブル・情報漏洩に関する注意
特定スキーマ/パターンで絞り込む例
スキーマやテーブル名のパターンで絞り込み取得が可能です。
多くの企業案件で「子会社Aのデータだけ集計したい」などスキーマ単位の要望が出るからです。
publicスキーマのみ:
SELECT table_name FROM information_schema.tables WHERE table_schema = 'public';
テーブル名に「history」を含む:
SELECT table_name FROM information_schema.tables WHERE table_name LIKE '%history%';
この工夫により、自分の目的に応じて的確な情報抽出ができる=現場の作業効率UPにつながります。
カラム・インデックス情報の取得法
さらに踏み込んだ構造把握が必要なら、information_schema.columnsやpg_indexesビューの活用が便利です。
理由は、「どんな列があるか知りたい」「パフォーマンス改善でインデックス有無を調べたい」場面が頻発するからです。
カラム名・型:
SELECT column_name, data_type FROM information_schema.columns WHERE table_name = 'your_table';
インデックス構造の一覧:
SELECT indexname, indexdef FROM pg_indexes WHERE tablename = 'your_table';
新人エンジニア時代、カラム・インデックスの両一覧を取得し、パフォーマンス問題の元凶テーブルを一発特定できた経験が思い出されます。
結果として、単なるテーブル一覧以上の「構造&パフォーマンス理解」が現場での武器になります。
システムテーブル・情報漏洩に関する注意
システムスキーマ(pg_catalog, information_schema等)には重要な内部情報があるため、実運用環境では取得・公開に細心の注意が必要です。
理由は、運用保守の範囲を超えて不要に情報を扱うと、万が一設定情報や脆弱性が露呈する危険につながるからです。
システムテーブルのみを取得するには以下:
SELECT table_schema, table_name FROM information_schema.tables WHERE table_schema IN ('pg_catalog', 'information_schema');
知識と権限による適切なオペレーションが、現場エンジニアの信頼を勝ち取る最初の一歩です。
まとめると、業務要件だけでなく、セキュリティ意識を常に持ったデータベース運用を目指しましょう。
まとめ
PostgreSQLのテーブル一覧取得について、ここまで「psqlメタコマンド」「information_schema」「pg_catalog」それぞれの強みや実践例を解説しました。
- psqlの\dtは誰でも手早く一覧表示ができ、日々の管理や調査の出発点として最適
- information_schemaは移植性・安全性の高いSQL標準ビューで、アプリ開発や複数DB対応プロジェクトで活躍
- pg_catalogはPostgreSQL固有の管理・監査用途に強く、大規模運用や深い分析で頼もしい存在
初心者はまず「\dt」で全景を掴み、アプリや自動化には「information_schema」、本格管理には「pg_catalog」という使い分けをおすすめします。
あなたも早速、この記事を参考にご自身のPostgreSQL環境で実践してみてください。本格的なクラウドDB構築に挑戦したい方には DigitalOcean のクラウドサービスもおすすめです。
データベースの知識を一段深めて、エンジニアとして大きく成長しましょう!
また、MySQLとの違いに興味があればMySQLのテーブル一覧取得方法|コマンド例付きで詳しく解説も併せてご覧ください。