PostgreSQL Cheatsheet On this page Introduction# PostgreSQL is a powerful, open-source relational database management system (RDBMS) known for its reliability and extensibility. It supports SQL (Structured Query Language) and offers a wide range of features, making it a popular choice for both small and large-scale applications.
This page contains a comprehensive cheatsheet of commonly used PostgreSQL commands and operations.
psql Command Line Basics# Command Description Example \q
Quit psql command-line utility \q
\l
List all databases \l
\c database_name
Connect to a specific database \c myapp
\dt
List all tables in current database \dt
\d table_name
Show details of a specific table \d users
\du
List all users and roles \du
\dn
List all schemas \dn
\df
List all functions \df
\dv
List all views \dv
\di
List all indexes \di
\e
Open text editor to edit query \e
\h command
Show help for SQL command \h CREATE TABLE
\?
Show help for psql commands \?
Database Operations# Command Description Example CREATE DATABASE name;
Create a new database CREATE DATABASE myapp;
DROP DATABASE name;
Delete an existing database DROP DATABASE oldapp;
ALTER DATABASE old_name RENAME TO new_name;
Rename a database ALTER DATABASE myapp RENAME TO newapp;
CREATE SCHEMA schema_name;
Create a new schema CREATE SCHEMA accounting;
DROP SCHEMA schema_name;
Delete a schema DROP SCHEMA old_schema;
Table Operations# Command Description Example CREATE TABLE table_name (columns);
Create a new table CREATE TABLE users (id SERIAL PRIMARY KEY, name VARCHAR(100));
DROP TABLE table_name;
Delete an existing table DROP TABLE old_users;
ALTER TABLE table_name ADD COLUMN column_def;
Add a new column ALTER TABLE users ADD COLUMN email VARCHAR(255);
ALTER TABLE table_name DROP COLUMN column_name;
Remove a column ALTER TABLE users DROP COLUMN phone;
ALTER TABLE table_name RENAME TO new_name;
Rename a table ALTER TABLE users RENAME TO customers;
ALTER TABLE table_name RENAME COLUMN old_name TO new_name;
Rename a column ALTER TABLE users RENAME COLUMN name TO full_name;
TRUNCATE TABLE table_name;
Delete all rows from table TRUNCATE TABLE logs;
Data Types# Data Type Description Example SERIAL
Auto-incrementing integer id SERIAL PRIMARY KEY
INTEGER
/ INT
32-bit integer age INTEGER
BIGINT
64-bit integer user_id BIGINT
VARCHAR(n)
Variable character string name VARCHAR(100)
TEXT
Unlimited text description TEXT
BOOLEAN
True/False is_active BOOLEAN
DATE
Date only birth_date DATE
TIMESTAMP
Date and time created_at TIMESTAMP
TIMESTAMPTZ
Timestamp with timezone updated_at TIMESTAMPTZ
DECIMAL(p,s)
Fixed-point number price DECIMAL(10,2)
JSON
JSON data metadata JSON
JSONB
Binary JSON (faster) settings JSONB
UUID
Universally unique identifier id UUID
Data Manipulation (CRUD)# INSERT Operations# Command Description Example INSERT INTO table VALUES (...);
Insert single row INSERT INTO users VALUES (1, 'John', '[email protected] ');
INSERT INTO table (columns) VALUES (...);
Insert with specific columns INSERT INTO users (name, email) VALUES ('Jane', '[email protected] ');
INSERT INTO table VALUES (...), (...);
Insert multiple rows INSERT INTO users (name) VALUES ('Alice'), ('Bob');
INSERT ... RETURNING *;
Insert and return inserted data INSERT INTO users (name) VALUES ('Tom') RETURNING id, name;
SELECT Operations# Command Description Example SELECT * FROM table;
Retrieve all records SELECT * FROM users;
SELECT columns FROM table;
Select specific columns SELECT name, email FROM users;
SELECT * FROM table WHERE condition;
Filter with condition SELECT * FROM users WHERE age > 18;
SELECT * FROM table LIMIT n;
Limit number of results SELECT * FROM users LIMIT 10;
SELECT * FROM table OFFSET n;
Skip first n rows SELECT * FROM users OFFSET 20 LIMIT 10;
UPDATE Operations# Command Description Example UPDATE table SET column = value;
Update all rows UPDATE users SET is_active = true;
UPDATE table SET column = value WHERE condition;
Update specific rows UPDATE users SET email = '[email protected] ' WHERE id = 1;
UPDATE table SET col1 = val1, col2 = val2;
Update multiple columns UPDATE users SET name = 'John Doe', age = 30 WHERE id = 1;
UPDATE ... RETURNING *;
Update and return modified data UPDATE users SET age = 25 WHERE id = 1 RETURNING *;
DELETE Operations# Command Description Example DELETE FROM table;
Delete all rows DELETE FROM logs;
DELETE FROM table WHERE condition;
Delete specific rows DELETE FROM users WHERE age < 18;
DELETE ... RETURNING *;
Delete and return deleted data DELETE FROM users WHERE id = 1 RETURNING *;
Querying and Filtering# Command Description Example WHERE column = value
Exact match WHERE name = 'John'
WHERE column LIKE pattern
Pattern matching WHERE name LIKE 'J%'
WHERE column ILIKE pattern
Case-insensitive pattern WHERE name ILIKE 'john%'
WHERE column IN (values)
Match any in list WHERE age IN (18, 21, 25)
WHERE column BETWEEN a AND b
Range matching WHERE age BETWEEN 18 AND 65
WHERE column IS NULL
Check for NULL WHERE email IS NULL
WHERE column IS NOT NULL
Check for NOT NULL WHERE email IS NOT NULL
ORDER BY column ASC/DESC
Sort results ORDER BY created_at DESC
GROUP BY column
Group results GROUP BY department
HAVING condition
Filter grouped results HAVING COUNT(*) > 5
Joins# Command Description Example INNER JOIN
Return matching records from both tables SELECT * FROM users u INNER JOIN orders o ON u.id = o.user_id
LEFT JOIN
Return all from left table, matching from right SELECT * FROM users u LEFT JOIN orders o ON u.id = o.user_id
RIGHT JOIN
Return all from right table, matching from left SELECT * FROM users u RIGHT JOIN orders o ON u.id = o.user_id
FULL OUTER JOIN
Return all records from both tables SELECT * FROM users u FULL OUTER JOIN orders o ON u.id = o.user_id
CROSS JOIN
Cartesian product of both tables SELECT * FROM users CROSS JOIN products
Aggregate Functions# Function Description Example COUNT(*)
Count all rows SELECT COUNT(*) FROM users;
COUNT(column)
Count non-NULL values SELECT COUNT(email) FROM users;
SUM(column)
Sum of numeric values SELECT SUM(amount) FROM orders;
AVG(column)
Average of numeric values SELECT AVG(age) FROM users;
MIN(column)
Minimum value SELECT MIN(created_at) FROM users;
MAX(column)
Maximum value SELECT MAX(price) FROM products;
STRING_AGG(column, delimiter)
Concatenate strings SELECT STRING_AGG(name, ', ') FROM users;
Indexes# Command Description Example CREATE INDEX idx_name ON table (column);
Create index on column CREATE INDEX idx_users_email ON users (email);
CREATE UNIQUE INDEX idx_name ON table (column);
Create unique index CREATE UNIQUE INDEX idx_users_username ON users (username);
CREATE INDEX CONCURRENTLY idx_name ON table (column);
Create index without locking CREATE INDEX CONCURRENTLY idx_users_name ON users (name);
DROP INDEX idx_name;
Remove index DROP INDEX idx_users_email;
REINDEX INDEX idx_name;
Rebuild index REINDEX INDEX idx_users_email;
Constraints# Command Description Example PRIMARY KEY
Primary key constraint id SERIAL PRIMARY KEY
FOREIGN KEY
Foreign key constraint user_id INTEGER REFERENCES users(id)
UNIQUE
Unique constraint email VARCHAR(255) UNIQUE
NOT NULL
Not null constraint name VARCHAR(100) NOT NULL
CHECK
Check constraint age INTEGER CHECK (age >= 0)
DEFAULT
Default value created_at TIMESTAMP DEFAULT NOW()
User and Permission Management# Command Description Example CREATE USER username WITH PASSWORD 'password';
Create new user CREATE USER john WITH PASSWORD 'secret123';
CREATE ROLE rolename;
Create new role CREATE ROLE manager;
ALTER USER username WITH SUPERUSER;
Grant superuser privileges ALTER USER john WITH SUPERUSER;
GRANT privilege ON table TO user;
Grant table permissions GRANT SELECT, INSERT ON users TO john;
REVOKE privilege ON table FROM user;
Revoke table permissions REVOKE DELETE ON users FROM john;
GRANT CONNECT ON DATABASE db TO user;
Grant database access GRANT CONNECT ON DATABASE myapp TO john;
DROP USER username;
Delete user DROP USER old_user;
Useful Functions# Function Description Example NOW()
Current timestamp SELECT NOW();
CURRENT_DATE
Current date SELECT CURRENT_DATE;
EXTRACT(field FROM date)
Extract date part SELECT EXTRACT(YEAR FROM birth_date) FROM users;
COALESCE(val1, val2, ...)
Return first non-null value SELECT COALESCE(nickname, name, 'Anonymous') FROM users;
NULLIF(val1, val2)
Return NULL if values equal SELECT NULLIF(age, 0) FROM users;
CASE WHEN condition THEN result END
Conditional logic SELECT CASE WHEN age >= 18 THEN 'Adult' ELSE 'Minor' END FROM users;
CONCAT(str1, str2, ...)
Concatenate strings SELECT CONCAT(first_name, ' ', last_name) FROM users;
LENGTH(string)
String length SELECT LENGTH(name) FROM users;
UPPER(string)
Convert to uppercase SELECT UPPER(name) FROM users;
LOWER(string)
Convert to lowercase SELECT LOWER(email) FROM users;
Command Description Example EXPLAIN query;
Show query execution plan EXPLAIN SELECT * FROM users WHERE age > 25;
EXPLAIN ANALYZE query;
Show actual execution statistics EXPLAIN ANALYZE SELECT * FROM users JOIN orders ON users.id = orders.user_id;
VACUUM table_name;
Clean up dead rows VACUUM users;
ANALYZE table_name;
Update table statistics ANALYZE users;
REINDEX TABLE table_name;
Rebuild all indexes on table REINDEX TABLE users;
Backup and Restore# Command Description Example pg_dump dbname > backup.sql
Backup database to SQL file pg_dump myapp > myapp_backup.sql
pg_dump -t table_name dbname > table_backup.sql
Backup single table pg_dump -t users myapp > users_backup.sql
psql dbname < backup.sql
Restore from SQL file psql myapp < myapp_backup.sql
pg_dumpall > all_databases.sql
Backup all databases pg_dumpall > full_backup.sql
Tips and Best Practices# Always use transactions for multiple related operations Use EXPLAIN ANALYZE
to optimize slow queries Create indexes on frequently queried columns Use LIMIT
for large result sets to avoid memory issues Regularly run VACUUM
and ANALYZE
for performance Use SERIAL
or UUID
for primary keys Always backup before major changes For more detailed information, refer to the PostgreSQL Documentation .