SQL Cheatsheet
This cheatsheet provides a comprehensive and practical reference for SQL commands. It covers data retrieval, manipulation, table operations, constraints, joins, aggregation functions, and advanced SQL patterns. Use it to boost your productivity and master database operations.
Basic Queries
SELECT * FROM table_nameSelect all columns
SELECT col1, col2 FROM table_nameSelect specific columns
SELECT DISTINCT col FROM table_nameSelect unique values
SELECT * FROM table_name LIMIT 10Limit results
SELECT * FROM table_name OFFSET 10 LIMIT 10Pagination
WHERE Clause
SELECT * FROM t WHERE col = 'value'Equal condition
SELECT * FROM t WHERE col != 'value'Not equal
SELECT * FROM t WHERE col > 10Greater than
SELECT * FROM t WHERE col BETWEEN 1 AND 10Range condition
SELECT * FROM t WHERE col IN ('a', 'b', 'c')Multiple values
SELECT * FROM t WHERE col LIKE 'pat%'Pattern matching
SELECT * FROM t WHERE col IS NULLNULL check
SELECT * FROM t WHERE c1 = 'a' AND c2 > 5Multiple conditions
ORDER BY
SELECT * FROM t ORDER BY col ASCSort ascending
SELECT * FROM t ORDER BY col DESCSort descending
SELECT * FROM t ORDER BY c1 ASC, c2 DESCMultiple sort columns
SELECT * FROM t ORDER BY col NULLS LASTNULLs at end
INSERT
INSERT INTO t (c1, c2) VALUES ('v1', 'v2')Insert single row
INSERT INTO t VALUES ('v1', 'v2', 'v3')Insert all columns
INSERT INTO t (c1, c2) VALUES ('a', 'b'), ('c', 'd')Insert multiple rows
INSERT INTO t SELECT * FROM other_tableInsert from select
INSERT INTO t (c1) VALUES ('v') RETURNING *Insert and return (PostgreSQL)
UPDATE
UPDATE t SET col = 'value' WHERE id = 1Update single column
UPDATE t SET c1 = 'v1', c2 = 'v2' WHERE id = 1Update multiple columns
UPDATE t SET col = col + 1 WHERE id = 1Increment value
UPDATE t SET col = NULL WHERE id = 1Set to NULL
UPDATE t1 SET c1 = t2.c1 FROM t2 WHERE t1.id = t2.idUpdate from another table
DELETE
DELETE FROM t WHERE id = 1Delete specific rows
DELETE FROM t WHERE col IS NULLDelete NULL rows
DELETE FROM tDelete all rows
TRUNCATE TABLE tFast delete all (no rollback)
CREATE TABLE
CREATE TABLE t (id INT PRIMARY KEY, name VARCHAR(100))Create basic table
CREATE TABLE t (id SERIAL PRIMARY KEY, name TEXT NOT NULL)Auto-increment (PostgreSQL)
CREATE TABLE t (id INT AUTO_INCREMENT PRIMARY KEY, name TEXT)Auto-increment (MySQL)
CREATE TABLE IF NOT EXISTS t (id INT)Create if not exists
CREATE TABLE t AS SELECT * FROM other_tableCreate from query
ALTER TABLE
ALTER TABLE t ADD COLUMN col VARCHAR(50)Add column
ALTER TABLE t DROP COLUMN colDrop column
ALTER TABLE t RENAME COLUMN old TO newRename column
ALTER TABLE t ALTER COLUMN col TYPE INTChange type (PostgreSQL)
ALTER TABLE t MODIFY col INTChange type (MySQL)
ALTER TABLE t RENAME TO new_nameRename table
DROP & TRUNCATE
DROP TABLE tDelete table
DROP TABLE IF EXISTS tDelete if exists
DROP TABLE t CASCADEDelete with dependencies
TRUNCATE TABLE tRemove all rows
TRUNCATE TABLE t RESTART IDENTITYReset auto-increment
Join Types
SELECT * FROM t1 INNER JOIN t2 ON t1.id = t2.t1_idInner join - matching rows only
SELECT * FROM t1 LEFT JOIN t2 ON t1.id = t2.t1_idLeft join - all from left table
SELECT * FROM t1 RIGHT JOIN t2 ON t1.id = t2.t1_idRight join - all from right table
SELECT * FROM t1 FULL OUTER JOIN t2 ON t1.id = t2.t1_idFull join - all from both tables
SELECT * FROM t1 CROSS JOIN t2Cross join - cartesian product
Join Variations
SELECT * FROM t1 JOIN t2 USING (col)Join using common column
SELECT * FROM t1 NATURAL JOIN t2Natural join - auto match columns
SELECT * FROM t1 a JOIN t1 b ON a.parent_id = b.idSelf join
SELECT * FROM t1, t2 WHERE t1.id = t2.t1_idImplicit join (old syntax)
💡 INNER JOIN is the default when using just JOIN
Aggregate Functions
SELECT COUNT(*) FROM tCount all rows
SELECT COUNT(col) FROM tCount non-NULL values
SELECT COUNT(DISTINCT col) FROM tCount unique values
SELECT SUM(col) FROM tSum of values
SELECT AVG(col) FROM tAverage value
SELECT MIN(col), MAX(col) FROM tMin and max values
GROUP BY
SELECT col, COUNT(*) FROM t GROUP BY colGroup and count
SELECT c1, c2, SUM(c3) FROM t GROUP BY c1, c2Multiple group columns
SELECT col, COUNT(*) FROM t GROUP BY col HAVING COUNT(*) > 5Filter groups
SELECT YEAR(date), COUNT(*) FROM t GROUP BY YEAR(date)Group by expression
String Aggregation
SELECT GROUP_CONCAT(col SEPARATOR ', ') FROM tConcatenate (MySQL)
SELECT STRING_AGG(col, ', ') FROM tConcatenate (PostgreSQL)
SELECT ARRAY_AGG(col) FROM tAggregate to array (PostgreSQL)
Subquery Types
SELECT * FROM t WHERE col IN (SELECT col FROM t2)Subquery in WHERE
SELECT * FROM (SELECT * FROM t) AS subSubquery in FROM
SELECT col, (SELECT MAX(c) FROM t2) FROM tScalar subquery
SELECT * FROM t WHERE EXISTS (SELECT 1 FROM t2 WHERE t2.id = t.id)EXISTS subquery
Comparison Operators
SELECT * FROM t WHERE col > ALL (SELECT col FROM t2)Greater than all
SELECT * FROM t WHERE col > ANY (SELECT col FROM t2)Greater than any
SELECT * FROM t WHERE col = SOME (SELECT col FROM t2)Equal to some (same as ANY)
CTE (Common Table Expression)
WITH cte AS (SELECT * FROM t) SELECT * FROM cteBasic CTE
WITH cte1 AS (...), cte2 AS (...) SELECT * FROM cte1 JOIN cte2Multiple CTEs
WITH RECURSIVE cte AS (...) SELECT * FROM cteRecursive CTE
💡 CTEs improve readability and can be referenced multiple times
Column Constraints
col INT PRIMARY KEYPrimary key
col VARCHAR(50) NOT NULLNot null constraint
col VARCHAR(50) UNIQUEUnique constraint
col INT DEFAULT 0Default value
col INT CHECK (col > 0)Check constraint
col INT REFERENCES other_table(id)Foreign key
Table Constraints
PRIMARY KEY (c1, c2)Composite primary key
UNIQUE (c1, c2)Composite unique
FOREIGN KEY (col) REFERENCES t(id) ON DELETE CASCADEFK with cascade delete
FOREIGN KEY (col) REFERENCES t(id) ON UPDATE SET NULLFK with set null
CHECK (start_date < end_date)Multi-column check
Alter Constraints
ALTER TABLE t ADD CONSTRAINT pk PRIMARY KEY (id)Add primary key
ALTER TABLE t ADD CONSTRAINT fk FOREIGN KEY (col) REFERENCES t2(id)Add foreign key
ALTER TABLE t DROP CONSTRAINT constraint_nameDrop constraint
Create Indexes
CREATE INDEX idx ON t (col)Create index
CREATE UNIQUE INDEX idx ON t (col)Unique index
CREATE INDEX idx ON t (c1, c2)Composite index
CREATE INDEX idx ON t (col DESC)Descending index
CREATE INDEX idx ON t (col) WHERE conditionPartial index (PostgreSQL)
Manage Indexes
DROP INDEX idxDrop index
DROP INDEX idx ON tDrop index (MySQL)
REINDEX INDEX idxRebuild index (PostgreSQL)
SHOW INDEX FROM tShow indexes (MySQL)
Create Views
CREATE VIEW v AS SELECT * FROM t WHERE conditionCreate view
CREATE OR REPLACE VIEW v AS SELECT ...Create or replace view
CREATE VIEW v (alias1, alias2) AS SELECT c1, c2 FROM tView with column aliases
CREATE MATERIALIZED VIEW mv AS SELECT ...Materialized view (PostgreSQL)
Manage Views
DROP VIEW vDrop view
DROP VIEW IF EXISTS vDrop if exists
REFRESH MATERIALIZED VIEW mvRefresh materialized view
ALTER VIEW v RENAME TO new_nameRename view
Database Management
CREATE DATABASE db_nameCreate database
DROP DATABASE db_nameDrop database
USE db_nameSwitch database (MySQL)
\c db_nameSwitch database (PostgreSQL)
SHOW DATABASESList databases (MySQL)
\lList databases (PostgreSQL)
User Management
CREATE USER 'user'@'host' IDENTIFIED BY 'pass'Create user (MySQL)
CREATE USER user WITH PASSWORD 'pass'Create user (PostgreSQL)
GRANT ALL ON db.* TO 'user'@'host'Grant privileges (MySQL)
GRANT ALL ON DATABASE db TO userGrant privileges (PostgreSQL)
REVOKE ALL ON db.* FROM 'user'@'host'Revoke privileges
Table Info
SHOW TABLESList tables (MySQL)
\dtList tables (PostgreSQL)
DESCRIBE tShow table structure (MySQL)
\d tShow table structure (PostgreSQL)
SHOW CREATE TABLE tShow CREATE statement
Transactions
BEGINStart transaction
COMMITCommit transaction
ROLLBACKRollback transaction
SAVEPOINT spCreate savepoint
ROLLBACK TO spRollback to savepoint
Window Functions
SELECT col, ROW_NUMBER() OVER (ORDER BY col) FROM tRow number
SELECT col, RANK() OVER (PARTITION BY c1 ORDER BY c2) FROM tRank within groups
SELECT col, LAG(col, 1) OVER (ORDER BY id) FROM tPrevious row value
SELECT col, LEAD(col, 1) OVER (ORDER BY id) FROM tNext row value
SELECT col, SUM(col) OVER (ORDER BY id) FROM tRunning total
Set Operations
SELECT * FROM t1 UNION SELECT * FROM t2Union (no duplicates)
SELECT * FROM t1 UNION ALL SELECT * FROM t2Union (with duplicates)
SELECT * FROM t1 INTERSECT SELECT * FROM t2Intersection
SELECT * FROM t1 EXCEPT SELECT * FROM t2Difference
CASE Expression
SELECT CASE WHEN c > 10 THEN 'high' ELSE 'low' END FROM tSimple CASE
SELECT CASE c WHEN 1 THEN 'one' WHEN 2 THEN 'two' END FROM tCASE with values
UPDATE t SET c = CASE WHEN x > 0 THEN 1 ELSE 0 ENDCASE in UPDATE
Quick Reference
SELECT * FROM t
INSERT INTO t VALUES
UPDATE t SET c=v
DELETE FROM t WHERE
Categories
- Data Retrieval
Commands for querying and retrieving data from tables, including filtering, sorting, and limiting results.
- Data Modification
Commands for inserting, updating, and deleting data in tables.
- Table Operations
Commands for creating, altering, and managing database tables.
- Constraints
Commands for defining and managing data integrity constraints.
- Joins
Commands for combining data from multiple tables using various join types.
- Aggregation Functions
Commands for performing calculations across sets of rows.
- Subqueries
Commands for using queries within other queries for complex operations.
- Indexes
Commands for creating and managing indexes to optimize query performance.
- Transactions
Commands for managing transactional operations and ensuring data consistency.
- Views
Commands for creating and managing virtual tables based on SQL queries.
- Data Types & Functions
Common SQL functions for data conversion, manipulation, and calculations.
- Database Administration
Commands for managing databases, users, and permissions.
- Common SQL Patterns
Advanced SQL patterns and techniques for solving common problems.
Features
- Quick search functionality
- Organized by functional categories
- Clear command descriptions
- Common SQL syntax compatible with most systems
- Database-specific variations noted where relevant
- Easy to copy commands
- Advanced SQL patterns for real-world problems
- Responsive design for all devices