AskDB
·7 min read

PostgreSQL Cheat Sheet

PostgreSQL is the most advanced open-source relational database. This cheat sheet covers essential commands and features.

psql Commands

\l              # List databases
\c dbname       # Connect to database
\dt             # List tables
\d tablename    # Describe table
\di             # List indexes
\du             # List users/roles
\q              # Quit
\x              # Toggle expanded display

Database Management

CREATE DATABASE mydb;
DROP DATABASE mydb;
ALTER DATABASE mydb RENAME TO newdb;

Table Management

CREATE TABLE users (
  id SERIAL PRIMARY KEY,
  name VARCHAR(100) NOT NULL,
  email VARCHAR(255) UNIQUE NOT NULL,
  age INTEGER CHECK (age >= 0),
  status VARCHAR(20) DEFAULT 'active',
  created_at TIMESTAMP DEFAULT NOW()
);

ALTER TABLE users ADD COLUMN phone VARCHAR(20);
ALTER TABLE users DROP COLUMN phone;
ALTER TABLE users ALTER COLUMN name SET NOT NULL;
DROP TABLE users;

JSON Support

-- JSONB column
CREATE TABLE events (
  id SERIAL PRIMARY KEY,
  data JSONB
);

-- Query JSON
SELECT data->>'name' AS name FROM events;
SELECT * FROM events WHERE data->>'type' = 'click';
SELECT * FROM events WHERE data @> '{"status": "active"}';

Indexes

CREATE INDEX idx_users_email ON users(email);
CREATE INDEX idx_users_name ON users(name DESC);
CREATE UNIQUE INDEX idx_users_email ON users(email);
CREATE INDEX idx_events_data ON events USING GIN(data);
DROP INDEX idx_users_email;

Common Queries

-- Pagination
SELECT * FROM users ORDER BY id LIMIT 20 OFFSET 40;

-- Upsert
INSERT INTO users (email, name) VALUES ('a@b.com', 'Alice')
ON CONFLICT (email) DO UPDATE SET name = EXCLUDED.name;

-- CTE
WITH active AS (
  SELECT * FROM users WHERE status = 'active'
)
SELECT count(*) FROM active;

-- Window function
SELECT name, salary,
  RANK() OVER (ORDER BY salary DESC) AS rank
FROM employees;

Data Types

SERIAL          # Auto-increment integer
BIGSERIAL       # Auto-increment bigint
VARCHAR(n)      # Variable-length string
TEXT            # Unlimited string
INTEGER         # 4-byte integer
BIGINT          # 8-byte integer
DECIMAL(p,s)    # Exact numeric
BOOLEAN         # true/false
TIMESTAMP       # Date and time
JSONB           # Binary JSON (indexed)
UUID            # UUID type
ARRAY           # Array type (e.g., TEXT[])

Useful Functions

NOW()                 # Current timestamp
CURRENT_DATE          # Current date
GENERATE_SERIES(1,10) # Number series
STRING_AGG(col, ',')  # Concatenate strings
ARRAY_AGG(col)        # Aggregate to array
COALESCE(a, b)        # First non-null
NULLIF(a, b)          # NULL if equal

Practice

Format your PostgreSQL queries with the SQL Formatter and generate test data with CSV to SQL.