How to List Databases and Tables in PostgreSQL Using psql

Data Tutorial

When it comes to administering Postgres databases, there’s a wide variety of third party tools available such as SQL Workbench/J or pgAdmin III. However, Postgres itself comes bundled with a powerful command line tool called psql which is great for those familiar with the terminal or looking to script administration tasks. One of the most common tasks a database administrator performs is simply getting familiar with the environment. This involves asking questions like “Which databases reside on this server?” or “What tables are stored in a particular database on this server?”. In this tutorial, we will learn how to answer these key questions from the command line using psql.

Meta-Commands

In addition to being able to submit raw SQL queries to the server via psql you can also take advantage of the psql meta-commands to obtain information from the server. Meta-commands are commands that are evaluated by psql and often translated into SQL that is issued against the system tables on the server, saving administrators time when performing routine tasks. They are denoted by a backslash and then followed by the command and its arguments. We will see some examples of this below.

Listing Databases

A single Postgres server process can manage multiple databases at the same time. Each database is stored as a separate set of files in its own directory within the server’s data directory. To view all of the defined databases on the server you can use the \list meta-command or its shortcut \l.

postgres=# \l
                                  List of databases
   Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges
-----------+----------+----------+-------------+-------------+-----------------------
 postgres  | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
 sales     | ubuntu   | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
 template0 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
 template1 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
(4 rows)

Switching Databases

Most Postgres servers have three databases defined by default: template0, template1 and postgres. template0 and template1 are skeleton databases that are or can be used by the CREATE DATABASE command. postgres is the default database you will connect to before you have created any other databases. Once you have created another database you will want to switch to it in order to create tables and insert data. Often, when working with servers that manage multiple databases, you’ll find the need to jump between databases frequently. This can be done with the \connect meta-command or its shortcut \c.

postgres=# \c sales
You are now connected to database "sales" as user "ubuntu".
sales=#

Listing Tables

Once you’ve connected to a database, you will want to inspect which tables have been created there. This can be done with the \dt meta-command. However, if there are no tables you will get no output.

sales=# \dt
No relations found.
sales=#

After creating a table, it will be returned in a tabular list of created tables.

sales=# CREATE TABLE leads (id INTEGER PRIMARY KEY, name VARCHAR);
CREATE TABLE
sales=# \dt
        List of relations
 Schema | Name  | Type  | Owner
--------+-------+-------+--------
 public | leads | table | ubuntu
(1 row)

sales=#