SELECT * FROM users Select all columns from table
SELECT name, email FROM users Select specific columns
SELECT DISTINCT status FROM orders Select unique values only
SELECT * FROM users WHERE age > 18 Filter rows with WHERE
SELECT * FROM users WHERE name LIKE '%john%' Pattern matching with LIKE
SELECT * FROM users WHERE age BETWEEN 18 AND 30 Range filter with BETWEEN
SELECT * FROM users WHERE status IN ('active', 'pending') Filter by set of values
SELECT * FROM users WHERE email IS NOT NULL Filter null/not null values
SELECT * FROM users ORDER BY name ASC Sort results ascending
SELECT * FROM users ORDER BY created_at DESC LIMIT 10 Get top N rows
SELECT * FROM users LIMIT 10 OFFSET 20 Pagination with offset
SELECT name AS full_name FROM users Column alias
INSERT INTO users (name, email)
VALUES ('John', '[email protected]') Insert a row
INSERT INTO users (name, email)
VALUES
('A', '[email protected]'),
('B', '[email protected]') Insert multiple rows
UPDATE users SET name = 'Jane'
WHERE id = 1 Update rows matching condition
DELETE FROM users WHERE id = 1 Delete rows matching condition
TRUNCATE TABLE users Delete all rows (fast, no rollback)
INSERT INTO target SELECT * FROM source
WHERE condition Insert from another query
INSERT INTO users (name, email)
VALUES ('John', '[email protected]')
ON CONFLICT (email) DO UPDATE
SET name = EXCLUDED.name Upsert (insert or update)
SELECT * FROM users
INNER JOIN orders ON users.id = orders.user_id Inner join (matching rows only)
SELECT * FROM users
LEFT JOIN orders ON users.id = orders.user_id Left join (all from left table)
SELECT * FROM users
RIGHT JOIN orders ON users.id = orders.user_id Right join (all from right table)
SELECT * FROM users
FULL OUTER JOIN orders ON users.id = orders.user_id Full outer join (all from both)
SELECT * FROM users
CROSS JOIN products Cross join (cartesian product)
SELECT a.name, b.name
FROM employees a
JOIN employees b ON a.manager_id = b.id Self join
SELECT COUNT(*) FROM users Count all rows
SELECT COUNT(DISTINCT status) FROM orders Count distinct values
SELECT SUM(amount) FROM orders Sum of column values
SELECT AVG(age) FROM users Average of column values
SELECT MIN(price), MAX(price) FROM products Min and max values
SELECT status, COUNT(*)
FROM orders
GROUP BY status Group and count
SELECT status, COUNT(*)
FROM orders
GROUP BY status
HAVING COUNT(*) > 5 Filter groups with HAVING
SELECT department,
STRING_AGG(name, ', ') AS members
FROM employees
GROUP BY department Concatenate grouped values
SELECT * FROM users
WHERE id IN (
SELECT user_id FROM orders
) Subquery with IN
SELECT * FROM users
WHERE EXISTS (
SELECT 1 FROM orders
WHERE orders.user_id = users.id
) Subquery with EXISTS
SELECT *, (
SELECT COUNT(*)
FROM orders
WHERE orders.user_id = users.id
) AS order_count
FROM users Correlated subquery in SELECT
WITH active_users AS (
SELECT * FROM users
WHERE status = 'active'
)
SELECT * FROM active_users Common Table Expression (CTE)
SELECT * FROM (
SELECT *, ROW_NUMBER()
OVER (ORDER BY score DESC) AS rank
FROM students
) ranked
WHERE rank <= 10 Subquery with window function
CREATE TABLE users (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL,
email VARCHAR(255) UNIQUE,
created_at TIMESTAMP DEFAULT NOW()
) Create table with constraints
ALTER TABLE users ADD COLUMN age INT Add column to table
ALTER TABLE users DROP COLUMN age Remove column from table
ALTER TABLE users
ALTER COLUMN name SET NOT NULL Modify column constraint
DROP TABLE IF EXISTS users Drop table if it exists
ALTER TABLE users
RENAME COLUMN name TO full_name Rename column
ALTER TABLE orders
ADD FOREIGN KEY (user_id)
REFERENCES users(id)
ON DELETE CASCADE Add foreign key constraint
COALESCE(val1, val2, 'default') Return first non-null value
CASE
WHEN age < 18 THEN 'minor'
WHEN age < 65 THEN 'adult'
ELSE 'senior'
END Conditional expression
CAST(price AS INTEGER) Type casting
CONCAT(first_name, ' ', last_name) Concatenate strings
UPPER(name) / LOWER(name) Convert case
LENGTH(name) / TRIM(name) String length / trim whitespace
NOW() / CURRENT_DATE / CURRENT_TIMESTAMP Current date/time
EXTRACT(YEAR FROM created_at) Extract part from date
DATE_TRUNC('month', created_at) Truncate date to precision
CREATE INDEX idx_users_email
ON users(email) Create index on column
CREATE UNIQUE INDEX idx_users_email
ON users(email) Create unique index
CREATE INDEX idx_name_email
ON users(name, email) Composite index (multi-column)
DROP INDEX idx_users_email Remove an index
EXPLAIN ANALYZE
SELECT * FROM users WHERE email = 'x' Analyze query execution plan
Free Online SQL Cheatsheet
A searchable SQL quick reference covering SELECT queries, joins, aggregations, subqueries, CTEs, DDL statements, built-in functions, and index management. Copy any query with one click.
About this cheatsheet
A comprehensive SQL cheatsheet covering the most commonly used queries and patterns.
- 60+ practical SQL queries
- 8 categories from SELECT to indexes
- Covers JOINs, CTEs, and window functions
- DDL statements for table management
- One-click copy to clipboard
- PostgreSQL-compatible syntax
100% free. No signup required. No data collected or sent anywhere.