SQL Cheat Sheet

Free SQL cheat sheet: SELECT, WHERE, JOINs, aggregate functions, and data modification commands in one quick reference.

Querying Data

ConceptSyntaxExample
Select allSELECT * FROM tableSELECT * FROM users;
Select specificSELECT col1, col2 FROM tableSELECT name, email FROM users;
FilterWHERE conditionSELECT * FROM users WHERE age > 21;
SortORDER BY col ASC|DESCSELECT * FROM products ORDER BY price DESC;
LimitLIMIT nSELECT * FROM users LIMIT 10;

Joins

ConceptSyntaxExample
Inner joinJOIN t2 ON t1.id = t2.fkSELECT * FROM orders JOIN users ON orders.user_id = users.id;
Left joinLEFT JOIN t2 ON ...SELECT * FROM users LEFT JOIN orders ON users.id = orders.user_id;

Aggregation

ConceptSyntaxExample
CountCOUNT(*)SELECT COUNT(*) FROM users;
GroupGROUP BY colSELECT dept, COUNT(*) FROM emp GROUP BY dept;
Filter groupsHAVING condition... GROUP BY dept HAVING COUNT(*) > 5;

Modifying Data

ConceptSyntaxExample
InsertINSERT INTO t (cols) VALUES (vals)INSERT INTO users (name) VALUES ('Alice');
UpdateUPDATE t SET col = val WHERE ...UPDATE users SET name = 'Bob' WHERE id = 1;
DeleteDELETE FROM t WHERE ...DELETE FROM users WHERE id = 1;
Insert multiple rowsINSERT INTO t (cols) VALUES (...), (...)INSERT INTO users (name) VALUES ('Al'), ('Bo'), ('Cy');
Insert from selectINSERT INTO t SELECT ...INSERT INTO archive_users SELECT * FROM users WHERE active = false;
UpsertINSERT ... ON CONFLICT DO UPDATEINSERT INTO users (id, name) VALUES (1, 'Al') ON CONFLICT (id) DO UPDATE SET name = EXCLUDED.name;
Returning rowsINSERT/UPDATE/DELETE ... RETURNING colsINSERT INTO users (name) VALUES ('Al') RETURNING id;
Delete all rowsTRUNCATE TABLE tTRUNCATE TABLE logs;

Filtering & Operators

ConceptSyntaxExample
AND / OR / NOTWHERE a AND (b OR c)SELECT * FROM users WHERE age > 21 AND (city = 'NYC' OR city = 'LA');
RangeWHERE col BETWEEN x AND ySELECT * FROM products WHERE price BETWEEN 10 AND 50;
List matchWHERE col IN (...)SELECT * FROM users WHERE country IN ('US', 'CA', 'MX');
Pattern matchWHERE col LIKE 'a%'SELECT * FROM users WHERE email LIKE '%@gmail.com';
Case-insensitive matchWHERE col ILIKE 'a%'SELECT * FROM users WHERE name ILIKE 'al%';
Distinct valuesSELECT DISTINCT colSELECT DISTINCT country FROM users;
PaginationLIMIT n OFFSET mSELECT * FROM posts ORDER BY id LIMIT 10 OFFSET 20;

More Joins

ConceptSyntaxExample
Right joinRIGHT JOIN t2 ON ...SELECT * FROM orders RIGHT JOIN users ON orders.user_id = users.id;
Full outer joinFULL OUTER JOIN t2 ON ...SELECT * FROM a FULL OUTER JOIN b ON a.id = b.a_id;
Cross joinCROSS JOIN t2SELECT * FROM sizes CROSS JOIN colors;
Self joinJOIN same table with aliasesSELECT e.name, m.name AS manager FROM emp e JOIN emp m ON e.manager_id = m.id;
Multiple joinsJOIN ... JOIN ...SELECT * FROM orders o JOIN users u ON o.user_id = u.id JOIN items i ON o.item_id = i.id;

Aggregation (more)

ConceptSyntaxExample
SumSUM(col)SELECT SUM(total) FROM orders;
AverageAVG(col)SELECT AVG(price) FROM products;
Min / MaxMIN(col), MAX(col)SELECT MIN(price), MAX(price) FROM products;
Count distinctCOUNT(DISTINCT col)SELECT COUNT(DISTINCT country) FROM users;
Group by multipleGROUP BY a, bSELECT country, city, COUNT(*) FROM users GROUP BY country, city;
String aggregateSTRING_AGG(col, sep)SELECT dept, STRING_AGG(name, ', ') FROM emp GROUP BY dept;

Subqueries & CTEs

ConceptSyntaxExample
Scalar subqueryWHERE col > (SELECT ...)SELECT * FROM products WHERE price > (SELECT AVG(price) FROM products);
IN subqueryWHERE col IN (SELECT ...)SELECT * FROM users WHERE id IN (SELECT user_id FROM orders);
EXISTSWHERE EXISTS (SELECT ...)SELECT * FROM users u WHERE EXISTS (SELECT 1 FROM orders o WHERE o.user_id = u.id);
CTEWITH name AS (SELECT ...)WITH big AS (SELECT * FROM orders WHERE total > 100) SELECT * FROM big;
Recursive CTEWITH RECURSIVE name AS (...)WITH RECURSIVE nums AS (SELECT 1 AS n UNION ALL SELECT n+1 FROM nums WHERE n < 5) SELECT * FROM nums;

Set Operations

ConceptSyntaxExample
Unionq1 UNION q2SELECT name FROM a UNION SELECT name FROM b;
Union allq1 UNION ALL q2SELECT id FROM a UNION ALL SELECT id FROM b;
Intersectq1 INTERSECT q2SELECT id FROM a INTERSECT SELECT id FROM b;
Exceptq1 EXCEPT q2SELECT id FROM all_users EXCEPT SELECT id FROM banned;

Window Functions

ConceptSyntaxExample
Row numberROW_NUMBER() OVER (ORDER BY col)SELECT name, ROW_NUMBER() OVER (ORDER BY score DESC) AS rn FROM players;
RankRANK() OVER (...)SELECT name, RANK() OVER (ORDER BY score DESC) FROM players;
Dense rankDENSE_RANK() OVER (...)SELECT name, DENSE_RANK() OVER (ORDER BY score DESC) FROM players;
PartitionOVER (PARTITION BY col ORDER BY col)SELECT dept, name, RANK() OVER (PARTITION BY dept ORDER BY salary DESC) FROM emp;
Lag / LeadLAG(col) / LEAD(col) OVER (...)SELECT day, sales, LAG(sales) OVER (ORDER BY day) AS prev FROM daily;
Running totalSUM(col) OVER (ORDER BY col)SELECT day, SUM(sales) OVER (ORDER BY day) AS running FROM daily;

CASE & NULL Handling

ConceptSyntaxExample
CASE expressionCASE WHEN cond THEN x ELSE y ENDSELECT name, CASE WHEN age >= 18 THEN 'adult' ELSE 'minor' END AS group FROM users;
CoalesceCOALESCE(a, b, ...)SELECT COALESCE(nickname, name, 'Anon') FROM users;
Null checkWHERE col IS NULL / IS NOT NULLSELECT * FROM users WHERE deleted_at IS NULL;
NullifNULLIF(a, b)SELECT NULLIF(total, 0) FROM orders;

String Functions

ConceptSyntaxExample
Concatenatea || b or CONCAT(a, b)SELECT first_name || ' ' || last_name AS full FROM users;
LengthLENGTH(str)SELECT LENGTH(name) FROM users;
Upper / LowerUPPER(str), LOWER(str)SELECT UPPER(name) FROM users;
SubstringSUBSTRING(str FROM x FOR n)SELECT SUBSTRING(phone FROM 1 FOR 3) FROM users;
ReplaceREPLACE(str, from, to)SELECT REPLACE(email, '@old.com', '@new.com') FROM users;
TrimTRIM(str)SELECT TRIM(' hi ');

Date & Time

ConceptSyntaxExample
Current timestampNOW() / CURRENT_DATESELECT NOW(), CURRENT_DATE;
Extract partEXTRACT(part FROM ts)SELECT EXTRACT(YEAR FROM created_at) FROM orders;
Truncate dateDATE_TRUNC('unit', ts)SELECT DATE_TRUNC('month', created_at) FROM orders;
Date mathts + INTERVAL 'n unit'SELECT NOW() - INTERVAL '7 days';
Age between datesAGE(a, b)SELECT AGE(NOW(), birth_date) FROM users;

Tables & Schema

ConceptSyntaxExample
Create tableCREATE TABLE t (col type, ...)CREATE TABLE users (id SERIAL PRIMARY KEY, name TEXT NOT NULL, email TEXT UNIQUE);
Add columnALTER TABLE t ADD COLUMN col typeALTER TABLE users ADD COLUMN age INT DEFAULT 0;
Drop columnALTER TABLE t DROP COLUMN colALTER TABLE users DROP COLUMN age;
Rename tableALTER TABLE t RENAME TO newALTER TABLE users RENAME TO members;
Drop tableDROP TABLE [IF EXISTS] tDROP TABLE IF EXISTS temp_data;
Foreign keyREFERENCES other(col)CREATE TABLE orders (id SERIAL, user_id INT REFERENCES users(id));
Create indexCREATE INDEX name ON t (col)CREATE INDEX idx_email ON users (email);

Data Types

ConceptSyntaxExample
IntegerINT / BIGINT / SERIALid SERIAL PRIMARY KEY
DecimalNUMERIC(p, s) / DECIMALprice NUMERIC(10, 2)
TextVARCHAR(n) / TEXTname VARCHAR(100)
BooleanBOOLEANactive BOOLEAN DEFAULT true
Date / TimeDATE / TIMESTAMP / TIMESTAMPTZcreated_at TIMESTAMPTZ DEFAULT NOW()
JSONJSON / JSONBmetadata JSONB

Views & Transactions

ConceptSyntaxExample
Create viewCREATE VIEW name AS SELECT ...CREATE VIEW active_users AS SELECT * FROM users WHERE active = true;
Drop viewDROP VIEW nameDROP VIEW active_users;
Begin transactionBEGINBEGIN;
CommitCOMMITUPDATE accounts SET bal = bal - 100 WHERE id = 1; COMMIT;
RollbackROLLBACKROLLBACK;
SavepointSAVEPOINT nameSAVEPOINT before_update;