PostgreSQL Cheat Sheet
Advanced PostgreSQL cheatsheet designed for real-world usage, based on common production patterns and official PostgreSQL features.
psql Basics
PostgreSQL interactive terminal commands.
psql -h hostname -U username db_name
\q
\l
\c db_name
\dt
\d table_name
\?
\copy (SELECT * FROM table) TO '/tmp/out.csv' CSV HEADER
\i /path/to/file.sql
Database Management
Creating and removing databases.
CREATE DATABASE mydb;
DROP DATABASE mydb;
Table Creation
Defining tables, constraints, and relationships.
CREATE TABLE users (
id SERIAL PRIMARY KEY,
email TEXT UNIQUE NOT NULL,
created_at TIMESTAMPTZ DEFAULT now()
);
CREATE TABLE orders (
id SERIAL PRIMARY KEY,
user_id INT REFERENCES users(id),
total NUMERIC(10,2) NOT NULL
);
Data Types
Common PostgreSQL data types.
INTEGER, BIGINT, SERIAL, BIGSERIAL
TEXT, VARCHAR(n), CHAR(n)
BOOLEAN
NUMERIC, REAL, DOUBLE PRECISION
DATE, TIME, TIMESTAMP, TIMESTAMPTZ
INTERVAL
UUID
JSON, JSONB
INSERT
Inserting data into tables.
INSERT INTO users (email) VALUES ('a@test.com');
INSERT INTO orders (user_id, total)
VALUES (1, 99.99);
SELECT
Querying data.
SELECT column_list
FROM table
WHERE condition
ORDER BY column
LIMIT n OFFSET m;
SELECT email FROM users WHERE email LIKE '%@test.com';
WHERE Operators
Filtering expressions.
= <> != < > <= >=
IN, BETWEEN, LIKE, ILIKE
IS NULL, IS NOT NULL
JOINs
Combining tables.
INNER JOIN
LEFT JOIN
RIGHT JOIN
FULL JOIN
CROSS JOIN
SELECT u.email, o.total
FROM users u
JOIN orders o ON o.user_id = u.id;
Aggregation
Grouping and aggregation.
COUNT(), SUM(), AVG(), MIN(), MAX()
SELECT user_id, SUM(total)
FROM orders
GROUP BY user_id;
HAVING
Filtering aggregated results.
SELECT user_id, COUNT(*)
FROM orders
GROUP BY user_id
HAVING COUNT(*) > 1;
Subqueries
Nested queries.
SELECT *
FROM users
WHERE id IN (SELECT user_id FROM orders);
EXISTS
Checking row existence.
SELECT *
FROM users u
WHERE EXISTS (
SELECT 1 FROM orders o WHERE o.user_id = u.id
);
UNION
Combining result sets.
UNION
UNION ALL
SELECT email FROM users
UNION
SELECT email FROM newsletter;
JSON / JSONB
Working with JSON data.
SELECT data->'key' FROM table;
SELECT data->>'key' FROM table;
SELECT *
FROM products
WHERE attributes @> '{"color":"red"}';
CREATE INDEX idx_products_attr
ON products USING GIN (attributes);
Indexes
Improving query performance.
CREATE INDEX idx_name ON table(column);
CREATE UNIQUE INDEX idx_unique ON table(column);
DROP INDEX idx_name;
CREATE INDEX idx_lower_email
ON users (LOWER(email));
Transactions
Atomic execution of statements.
BEGIN;
COMMIT;
ROLLBACK;
SAVEPOINT sp1;
ROLLBACK TO sp1;
Common Table Expressions (CTE)
Readable, reusable subqueries.
WITH recent_orders AS (
SELECT * FROM orders WHERE created_at > now() - INTERVAL '7 days'
)
SELECT * FROM recent_orders;
Recursive CTE
Hierarchical data queries.
WITH RECURSIVE tree AS (
SELECT id, parent_id FROM nodes WHERE parent_id IS NULL
UNION ALL
SELECT n.id, n.parent_id
FROM nodes n
JOIN tree t ON n.parent_id = t.id
)
SELECT * FROM tree;
Window Functions
Analytics across result sets.
ROW_NUMBER()
RANK()
DENSE_RANK()
LAG()
LEAD()
SUM() OVER (...)
SELECT user_id,
total,
SUM(total) OVER (PARTITION BY user_id) AS user_total
FROM orders;
String Functions
Text processing.
LENGTH(), LOWER(), UPPER(), INITCAP()
SUBSTRING(), REPLACE(), TRIM()
CONCAT() or ||
Numeric Functions
Math operations.
ABS(), ROUND(), CEIL(), FLOOR(), MOD(), SQRT()
Date & Time
Working with time.
CURRENT_DATE
CURRENT_TIME
CURRENT_TIMESTAMP
DATE_TRUNC('month', created_at)
EXTRACT(YEAR FROM created_at)
'2024-01-01'::date + INTERVAL '7 days'
NULL Handling
Handling missing values.
COALESCE(a, b)
NULLIF(a, b)
COPY
High-performance import/export.
COPY table FROM '/path/file.csv' CSV HEADER;
COPY (SELECT * FROM table) TO '/path/out.csv' CSV HEADER;
Performance Analysis
Query inspection tools.
EXPLAIN SELECT ...
EXPLAIN ANALYZE SELECT ...
SHOW work_mem;
SHOW shared_buffers;
Locks
Inspecting locks.
SELECT * FROM pg_locks;
Extensions
Extending PostgreSQL functionality.
CREATE EXTENSION IF NOT EXISTS pgcrypto;
CREATE EXTENSION IF NOT EXISTS uuid-ossp;
Useful System Catalogs
Introspection queries.
pg_stat_activity
pg_stat_user_tables
pg_indexes
SELECT * FROM pg_stat_activity;