PostgreSQL/Cheat sheet

Last edited by dave on 01/12/2025, 13:19:18 UTC

PostgreSQL / Cheat sheet

Contents

Check out the other cheat sheets!

Do you prefer building with Prisma ORM? Check out Prisma ORM cheat sheet for PostgreSQL!

Your one-stop quick reference for mastering PostgreSQL โ€” from setup and SQL essentials to performance tuning and admin magic! ๐Ÿ˜


โš™๏ธ Setup & Connection

Install (Linux)

sudo apt install postgresql postgresql-contrib

Start & Enable Service

sudo systemctl start postgresql sudo systemctl enable postgresql

Switch to Postgres User

sudo -i -u postgres

Enter the psql Shell

psql

Connect to a Database

psql -U username -d dbname -h localhost -p 5432

Exit psql

\q

๐Ÿ—ƒ๏ธ Database Management

CommandDescription
\lList all databases
CREATE DATABASE dbname;Create a new database
\c dbnameConnect to a database
DROP DATABASE dbname;Delete a database
ALTER DATABASE name RENAME TO newname;Rename database

๐Ÿ‘ค Users & Roles

CommandDescription
\duList all roles
CREATE USER name WITH PASSWORD 'pass';Create a user
CREATE ROLE role_name;Create a role
ALTER USER name WITH SUPERUSER;Grant superuser privileges
GRANT ALL PRIVILEGES ON DATABASE db TO user;Give user full access
DROP USER name;Remove user

Role-Based Access

GRANT SELECT, INSERT ON table TO role; REVOKE UPDATE ON table FROM role;

๐Ÿงฑ Tables

CommandDescription
\dtList tables
CREATE TABLE name (...);Create table
\d tableDescribe table structure
DROP TABLE name;Delete table
ALTER TABLE name ADD COLUMN new_col TEXT;Add a column
ALTER TABLE name DROP COLUMN col;Remove column
ALTER TABLE name RENAME TO newname;Rename table
TRUNCATE TABLE name;Remove all data

Example

CREATE TABLE users ( id SERIAL PRIMARY KEY, name TEXT NOT NULL, email TEXT UNIQUE, created_at TIMESTAMP DEFAULT NOW() );

๐Ÿ’พ Data Manipulation (CRUD)

Insert

INSERT INTO users (name, email) VALUES ('Alice', 'alice@example.com');

Select

SELECT * FROM users; SELECT name, email FROM users WHERE id = 1;

Update

UPDATE users SET email = 'new@email.com' WHERE id = 1;

Delete

DELETE FROM users WHERE id = 1;

Returning Clause

INSERT INTO users (name) VALUES ('Bob') RETURNING id;

๐Ÿ” Filtering & Sorting

SELECT * FROM products WHERE price > 50; SELECT * FROM users WHERE name LIKE 'A%'; SELECT * FROM orders ORDER BY created_at DESC; SELECT * FROM employees WHERE department IN ('HR', 'IT'); SELECT * FROM logs WHERE created_at BETWEEN '2024-01-01' AND '2025-01-01';

๐Ÿ”— Joins

SELECT u.name, o.total FROM users u JOIN orders o ON u.id = o.user_id;
TypeSyntaxDescription
INNERJOINMatch both tables
LEFTLEFT JOINKeep left, even if no match
RIGHTRIGHT JOINKeep right
FULLFULL OUTER JOINKeep all rows

๐Ÿงฎ Aggregations

SELECT department, AVG(salary) AS avg_salary FROM employees GROUP BY department ORDER BY avg_salary DESC;
FunctionDescription
COUNT()Number of rows
SUM()Total
AVG()Average
MIN() / MAX()Minimum / Maximum

HAVING Clause

SELECT department, COUNT(*) FROM employees GROUP BY department HAVING COUNT(*) > 5;

๐Ÿช„ Constraints

ConstraintDescription
PRIMARY KEYUnique identifier
UNIQUENo duplicates
NOT NULLMust have value
CHECKValidate condition
FOREIGN KEYLink to another table

Example:

CREATE TABLE orders ( id SERIAL PRIMARY KEY, user_id INT REFERENCES users(id), total NUMERIC CHECK (total >= 0) );

๐Ÿงฉ Indexes

CREATE INDEX idx_users_email ON users(email); DROP INDEX idx_users_email;
TypeUse Case
BTREEDefault
GINJSONB / full-text
GiSTGeometric / range
BRINLarge sequential data

๐Ÿง  JSON & Arrays

JSON

CREATE TABLE profiles ( id SERIAL PRIMARY KEY, data JSONB ); INSERT INTO profiles (data) VALUES ('{"name":"Alice","age":25}'); SELECT data->>'name' FROM profiles;

Arrays

CREATE TABLE tags ( id SERIAL, keywords TEXT[] ); INSERT INTO tags (keywords) VALUES (ARRAY['tech','postgres']); SELECT * FROM tags WHERE 'tech' = ANY(keywords);

๐Ÿงฐ Views

CREATE VIEW active_users AS SELECT name, email FROM users WHERE active = true; SELECT * FROM active_users; DROP VIEW active_users;

๐Ÿ”„ Transactions

BEGIN; UPDATE accounts SET balance = balance - 100 WHERE id = 1; UPDATE accounts SET balance = balance + 100 WHERE id = 2; COMMIT; -- or ROLLBACK;

Atomic, safe, and drama-free.


๐Ÿงฉ Extensions

ExtensionFunction
postgisGIS & mapping
uuid-osspGenerate UUIDs
pg_stat_statementsTrack slow queries
citextCase-insensitive text
hstoreKey-value storage
pgcryptoCryptographic functions

Enable:

CREATE EXTENSION IF NOT EXISTS postgis;

๐Ÿ“ˆ Window Functions

SELECT name, salary, RANK() OVER (ORDER BY salary DESC) FROM employees;
FunctionPurpose
RANK()Rank with gaps
DENSE_RANK()Rank without gaps
ROW_NUMBER()Sequential numbering
LAG() / LEAD()Previous/next row value

๐Ÿงฎ Common Table Expressions (CTEs)

WITH sales AS ( SELECT * FROM orders WHERE created_at > '2025-01-01' ) SELECT COUNT(*) FROM sales;

Recursive example:

WITH RECURSIVE countdown(n) AS ( SELECT 5 UNION ALL SELECT n-1 FROM countdown WHERE n > 1 ) SELECT * FROM countdown;

๐Ÿงพ Backup & Restore

Dump a Database

pg_dump dbname > backup.sql

Restore

psql dbname < backup.sql

Compressed Dump

pg_dump -Fc dbname > backup.dump pg_restore -d dbname backup.dump

๐Ÿง  Performance Tuning

SettingDescription
shared_buffersMemory cache for data
work_memPer query sort memory
effective_cache_sizeEstimated OS-level cache
maintenance_work_memUsed by vacuum/indexing
max_connectionsLimit concurrent sessions

Analyze Query Performance

EXPLAIN ANALYZE SELECT * FROM big_table WHERE id=42;

Vacuum & Analyze

VACUUM; ANALYZE;

๐Ÿ”’ Security

  • Role-based access control
  • SSL/TLS connections
  • Row-Level Security (RLS)

Example

ALTER TABLE users ENABLE ROW LEVEL SECURITY; CREATE POLICY user_policy ON users FOR SELECT USING (id = current_user_id());

๐Ÿงฐ psql Shortcuts

CommandDescription
\lList databases
\c dbnameConnect to database
\dtList tables
\d tableDescribe table
\dfList functions
\diList indexes
\duList roles
\timingShow query time
\xExpanded view
\! commandRun shell command
\i file.sqlRun SQL file

๐Ÿงญ Troubleshooting

ProblemFix
Can't connectCheck pg_hba.conf or firewall
Permission deniedGRANT ALL ON table TO user;
Database fullCheck pg_stat_activity for idle connections
Query slowUse EXPLAIN ANALYZE, create index
LocksSELECT * FROM pg_locks;

๐Ÿงฉ TL;DR Mind Map

AreaCommand / ToolDescription
SchemaCREATE TABLEDefine structure
DataINSERT, UPDATE, DELETECRUD
QueryingSELECT, JOIN, WHEREFetch data
AdminCREATE ROLE, GRANTManage users
IndexCREATE INDEXSpeed up queries
Backuppg_dump, pg_restoreData safety
TuningEXPLAIN ANALYZEPerformance
ExtensionsCREATE EXTENSIONAdd power
CLIpsqlCommand-line interface
Backlinks (3)
Categories (0)

    No categories assigned to this page.

Edit Level

> Signed In Users