PostgreSQL には MySQL の SHOW DATABASES に当たる SQL がありません。この記事の出力は PostgreSQL 17.6 で採りました。
まず見る(結論)
- psql の中なら
\l。サイズも見るなら\l+ - シェルから1行で出すなら
psql -U postgres -l - SQL なら
SELECT datname FROM pg_database WHERE NOT datistemplate; - 別のデータベースに移るのは
\c データベース名(USEは無い)
\l で表示する
\l
List of databases
Name | Owner | Encoding | Locale Provider | Collate | Ctype | Locale | ICU Rules | Access privileges
-----------+----------+----------+-----------------+------------+------------+--------+-----------+-----------------------
postgres | postgres | UTF8 | libc | en_US.utf8 | en_US.utf8 | | |
sugdb | postgres | UTF8 | libc | en_US.utf8 | en_US.utf8 | | |
template0 | postgres | UTF8 | libc | en_US.utf8 | en_US.utf8 | | | =c/postgres +
| | | | | | | | postgres=CTc/postgres
template1 | postgres | UTF8 | libc | en_US.utf8 | en_US.utf8 | | | =c/postgres +
| | | | | | | | postgres=CTc/postgres
(4 rows)
自分で作っていなくても、postgres、template0、template1 の3つは最初からあります。
postgres: 接続先を指定しないときなどに使う既定のデータベース。空でもよいtemplate1:CREATE DATABASEのコピー元。ここに作った表や拡張は、以後に作るデータベースにも入るtemplate0: 初期状態のまま変えないためのテンプレート。接続もできない
3つとも削除しないでください。
\l+ にするとサイズ、表スペース、説明の列が増えます。
\l+
Name | Owner | ... | Size | Tablespace | Description
-----------+----------+-----+---------+------------+-------------
sugdb | postgres | ... | 7779 kB | pg_default |
(列を一部省略し、sugdb の行だけを示しています)
シェルから出す
psql に入らずに一覧だけ欲しいときは -l を付けます。出力は \l と同じです。
$ psql -U postgres -l
スクリプトで名前だけ取るなら、-At(整列なし・見出しなし)で SQL を流す方が扱いやすくなります。
$ psql -U postgres -At -c "SELECT datname FROM pg_database WHERE NOT datistemplate"
SQL で一覧とサイズを取る
SELECT datname, pg_size_pretty(pg_database_size(datname))
FROM pg_database
WHERE NOT datistemplate;
datname | pg_size_pretty
----------+----------------
postgres | 7507 kB
sugdb | 7779 kB
(2 rows)
WHERE NOT datistemplate で template0 と template1 を除いています。表がほとんど無いデータベースでも 7MB 台あるのは、システムカタログの分です。
データベースを切り替える
PostgreSQL では、1つの接続は1つのデータベースにしかつながりません。MySQL の USE は無く、psql の \c で接続し直します。
\c sugdb
You are now connected to database "sugdb" as user "postgres".
SELECT current_database();
current_database
------------------
sugdb
(1 row)
別のデータベースの表を、同じ SQL の中で sugdb.public.customers のように参照することもできません。データベースをまたいで結合したいなら、1つのデータベースの中でスキーマを分ける構成にします。
表の一覧は PostgreSQLでテーブル一覧を表示する にまとめています。