SQLSQL Cheatsheet

SQL Cheatsheet

A dense, scannable quick-reference for the syntax you reach for most often. It trades depth for coverage — use the dedicated pages elsewhere in this section when you need the full explanation behind any of these.

Querying

Basic SELECT

SQL
SELECT column1, column2 FROM table_name
WHERE condition
ORDER BY column1 ASC
LIMIT 10 OFFSET 20;

SELECT DISTINCT column1 FROM table_name;

SELECT * FROM table_name WHERE column1 BETWEEN 10 AND 20;
SELECT * FROM table_name WHERE column1 IN (1, 2, 3);
SELECT * FROM table_name WHERE column1 LIKE 'A%';
SELECT * FROM table_name WHERE column1 IS NULL;
SELECT * FROM table_name WHERE column1 IS NOT NULL;
Joins

Join types

SQL
SELECT a.*, b.* FROM a INNER JOIN b ON a.id = b.a_id;
SELECT a.*, b.* FROM a LEFT JOIN b ON a.id = b.a_id;
SELECT a.*, b.* FROM a RIGHT JOIN b ON a.id = b.a_id;
SELECT a.*, b.* FROM a FULL OUTER JOIN b ON a.id = b.a_id;
SELECT a.*, b.* FROM a CROSS JOIN b;
SELECT a.*, b.* FROM a NATURAL JOIN b;
Aggregation

GROUP BY and aggregate functions

SQL
SELECT department, COUNT(*), AVG(salary), MIN(salary), MAX(salary), SUM(salary)
FROM employees
GROUP BY department
HAVING COUNT(*) > 5
ORDER BY AVG(salary) DESC;
Subqueries & CTEs

Subqueries

SQL
SELECT * FROM orders
WHERE customer_id IN (SELECT id FROM customers WHERE country = 'CA');

SELECT * FROM customers c
WHERE EXISTS (SELECT 1 FROM orders o WHERE o.customer_id = c.id);

SELECT customer_id, (SELECT COUNT(*) FROM orders o WHERE o.customer_id = c.id) AS order_count
FROM customers c;

Common Table Expressions

SQL
WITH high_value AS (
  SELECT customer_id, SUM(total) AS spent
  FROM orders
  GROUP BY customer_id
  HAVING SUM(total) > 1000
)
SELECT c.name, h.spent
FROM customers c
JOIN high_value h ON h.customer_id = c.id;

-- recursive CTE
WITH RECURSIVE subordinates AS (
  SELECT id, manager_id, name FROM employees WHERE id = 1
  UNION ALL
  SELECT e.id, e.manager_id, e.name
  FROM employees e
  JOIN subordinates s ON e.manager_id = s.id
)
SELECT * FROM subordinates;
Window Functions

Ranking and running totals

SQL
SELECT name, department, salary,
  RANK() OVER (PARTITION BY department ORDER BY salary DESC) AS dept_rank,
  ROW_NUMBER() OVER (ORDER BY salary DESC) AS overall_rank,
  SUM(salary) OVER (PARTITION BY department) AS dept_total,
  AVG(salary) OVER (ORDER BY salary ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) AS moving_avg
FROM employees;
Set Operations

UNION, INTERSECT, EXCEPT

SQL
SELECT city FROM customers UNION SELECT city FROM suppliers;
SELECT city FROM customers UNION ALL SELECT city FROM suppliers;
SELECT city FROM customers INTERSECT SELECT city FROM suppliers;
SELECT city FROM customers EXCEPT SELECT city FROM suppliers;
Data Modification

INSERT, UPDATE, DELETE

SQL
INSERT INTO table_name (col1, col2) VALUES ('a', 1);
INSERT INTO table_name (col1, col2) VALUES ('a', 1), ('b', 2), ('c', 3);

UPDATE table_name SET col1 = 'new value' WHERE id = 1;

DELETE FROM table_name WHERE id = 1;
Table Definition

CREATE TABLE and ALTER TABLE

SQL
CREATE TABLE orders (
  id INTEGER PRIMARY KEY,
  customer_id INTEGER NOT NULL REFERENCES customers(id),
  total NUMERIC(10, 2) NOT NULL DEFAULT 0,
  status VARCHAR(20) NOT NULL,
  created_at TIMESTAMP NOT NULL DEFAULT now()
);

ALTER TABLE orders ADD COLUMN notes TEXT;
ALTER TABLE orders DROP COLUMN notes;
ALTER TABLE orders ALTER COLUMN total SET DEFAULT 0;
ALTER TABLE orders RENAME TO customer_orders;

CREATE INDEX idx_orders_customer_id ON orders(customer_id);
DROP TABLE orders;
Transactions

BEGIN, COMMIT, ROLLBACK, SAVEPOINT

SQL
BEGIN;

UPDATE accounts SET balance = balance - 100 WHERE id = 1;
SAVEPOINT before_credit;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;

-- ROLLBACK TO SAVEPOINT before_credit;  -- undo just the credit
-- RELEASE SAVEPOINT before_credit;      -- keep it, drop the checkpoint

COMMIT;
-- ROLLBACK;  -- discard everything since BEGIN

SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
Users, Roles & Privileges

Access control

SQL
CREATE USER app_service WITH PASSWORD 'secret';
CREATE ROLE analyst;

GRANT SELECT ON orders TO analyst;
GRANT analyst TO app_service;
REVOKE SELECT ON orders FROM analyst;