AskDB
·10 min read

SQL Cheat Sheet: Complete Quick Reference

Everything you need to write SQL queries in one reference. From basic SELECT to advanced window functions.

Basic Queries

SELECT * FROM users;
SELECT name, email FROM users;
SELECT DISTINCT country FROM users;
SELECT name, salary * 1.1 AS new_salary FROM employees;

Filtering with WHERE

SELECT * FROM users WHERE age > 18;
SELECT * FROM users WHERE name LIKE 'A%';
SELECT * FROM users WHERE city IN ('NYC', 'LA');
SELECT * FROM users WHERE age BETWEEN 18 AND 30;
SELECT * FROM users WHERE email IS NOT NULL;
SELECT * FROM users WHERE age > 18 AND city = 'NYC';
SELECT * FROM users WHERE age < 20 OR age > 60;

Sorting and Limiting

SELECT * FROM users ORDER BY name ASC;
SELECT * FROM users ORDER BY created_at DESC;
SELECT * FROM users ORDER BY name LIMIT 10;
SELECT * FROM users ORDER BY name LIMIT 10 OFFSET 20;

JOINs

-- INNER JOIN (matching rows only)
SELECT u.name, o.total
FROM users u INNER JOIN orders o ON u.id = o.user_id;

-- LEFT JOIN (all from left + matches)
SELECT u.name, o.total
FROM users u LEFT JOIN orders o ON u.id = o.user_id;

-- RIGHT JOIN (all from right + matches)
SELECT u.name, o.total
FROM users u RIGHT JOIN orders o ON u.id = o.user_id;

Aggregation

SELECT COUNT(*) FROM users;
SELECT department, AVG(salary) FROM employees GROUP BY department;
SELECT category, SUM(amount) FROM orders GROUP BY category HAVING SUM(amount) > 1000;
SELECT MIN(age), MAX(age), AVG(age) FROM users;

Subqueries

SELECT * FROM users WHERE id IN (
  SELECT user_id FROM orders WHERE total > 100
);

SELECT name, (SELECT COUNT(*) FROM orders o WHERE o.user_id = u.id) AS order_count
FROM users u;

INSERT, UPDATE, DELETE

INSERT INTO users (name, email) VALUES ('Alice', 'alice@example.com');
UPDATE users SET status = 'active' WHERE id = 1;
DELETE FROM users WHERE id = 1;

Window Functions

SELECT name, salary,
  RANK() OVER (ORDER BY salary DESC) AS rank
FROM employees;

SELECT name, department, salary,
  AVG(salary) OVER (PARTITION BY department) AS dept_avg
FROM employees;

CTEs

WITH active_orders AS (
  SELECT user_id, SUM(total) AS total_spent
  FROM orders WHERE status = 'completed'
  GROUP BY user_id
)
SELECT u.name, a.total_spent
FROM users u JOIN active_orders a ON u.id = a.user_id;

Practice Tools

Format your queries with the SQL Formatter and convert data with CSV to SQL.