Skip to content
SQL Cheatsheet — Query Quick Reference

SQL Cheatsheet — Query Quick Reference

DodaTech 3 min read

SQL queries for data retrieval, filtering, joining, aggregation, modification, and schema management — a compact reference for MySQL, PostgreSQL, and other relational databases.

SELECT & Filtering

SELECT col1, col2 FROM table WHERE condition ORDER BY col1 DESC LIMIT 10;
SELECT DISTINCT city FROM customers;
SELECT * FROM products WHERE price BETWEEN 10 AND 50;
SELECT * FROM orders WHERE created_at > '2024-01-01';
SELECT * FROM users WHERE email LIKE '%@example.com';
SELECT * FROM items WHERE id IN (1, 3, 5);

JOINs

Join TypeReturns
INNER JOINMatching rows in both tables
LEFT JOINAll left + matching right (NULL if no match)
RIGHT JOINAll right + matching left
FULL JOINAll rows from both sides
CROSS JOINCartesian product
SELECT o.id, c.name
FROM orders o
INNER JOIN customers c ON o.customer_id = c.id;

Aggregation & GROUP BY

SELECT dept_id, COUNT(*) AS emp_count, AVG(salary) AS avg_sal
FROM employees
WHERE active = 1
GROUP BY dept_id
HAVING COUNT(*) > 5
ORDER BY emp_count DESC;

Aggregate Functions

FunctionWhat it does
COUNT(*)Count rows
SUM(col)Sum values
AVG(col)Average value
MIN(col)Minimum value
MAX(col)Maximum value

Data Modification

INSERT INTO users (name, email) VALUES ('Alice', 'alice@example.com');
INSERT INTO logs (msg) VALUES ('start'), ('stop');  -- multi-row

UPDATE users SET email = 'new@example.com' WHERE id = 1;

DELETE FROM users WHERE id = 1;
TRUNCATE TABLE logs;          -- faster, no rollback

CREATE & ALTER Table

CREATE TABLE users (
  id SERIAL PRIMARY KEY,
  name VARCHAR(100) NOT NULL,
  email VARCHAR(255) UNIQUE NOT NULL,
  created_at TIMESTAMP DEFAULT NOW()
);

ALTER TABLE users ADD COLUMN phone VARCHAR(20);
ALTER TABLE users DROP COLUMN phone;
ALTER TABLE users ALTER COLUMN name SET NOT NULL;
DROP TABLE users;

Indexes

CREATE INDEX idx_email ON users(email);
CREATE UNIQUE INDEX idx_unq_email ON users(email);
CREATE INDEX idx_name_email ON users(name, email);  -- composite
DROP INDEX idx_email;

String & Date Functions

-- Strings
UPPER(name); LOWER(name); LENGTH(name);
TRIM(name); SUBSTRING(name, 1, 3);
REPLACE(name, 'old', 'new'); CONCAT(first, ' ', last);

-- Dates
NOW(); CURDATE(); DATE(created_at);
YEAR(created_at); DATE_ADD(created_at, INTERVAL 7 DAY);
DATEDIFF(NOW(), created_at);
What is the difference between WHERE and HAVING?
WHERE filters rows before aggregation (GROUP BY). HAVING filters groups after aggregation. Use WHERE for individual row conditions (e.g., WHERE status = 'active'), and HAVING for aggregate conditions (e.g., HAVING COUNT(*) > 5).
What is the difference between INNER JOIN and LEFT JOIN?
INNER JOIN returns only rows where the join condition matches in both tables. LEFT JOIN returns all rows from the left table plus matching rows from the right — non-matching right-side columns become NULL. Use LEFT JOIN when you need all records from the primary table regardless of matches.
What does an index do in SQL?
An index is a data structure (typically B-tree) that speeds up data retrieval on the indexed columns. It acts like a book’s index — instead of scanning every row, the database jumps to the indexed location. Indexes speed up SELECT/WHERE/JOIN but slow down INSERT/UPDATE/DELETE.

See the MySQL and PostgreSQL tutorials for database-specific details.

Built by the developers of DodaTech

Doda Browser, DodaZIP & Durga Antivirus Pro