Technical reference
SQL Cheatsheet
Query and manage relational data
Getting Started
Create Table
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100),
email VARCHAR(100) UNIQUE
);Insert Row
INSERT INTO users (name, email)
VALUES ('Luis', 'luis@example.com');Querying
Select All
SELECT * FROM users;Select Specific Columns
SELECT name, email FROM users;Order & Limit
SELECT * FROM users
ORDER BY name ASC
LIMIT 10;Filtering
WHERE Clause
SELECT * FROM users WHERE id = 1;Multiple Conditions
SELECT * FROM users
WHERE age > 18 AND status = 'active';LIKE & IN
SELECT * FROM users WHERE name LIKE 'L%';
SELECT * FROM users WHERE id IN (1, 2, 3);Joins
Inner Join
SELECT orders.id, users.name
FROM orders
INNER JOIN users ON orders.user_id = users.id;Left Join
Returns all users, even those with no matching orders.
SELECT users.name, orders.id
FROM users
LEFT JOIN orders ON users.id = orders.user_id;Aggregation
COUNT, SUM, AVG
SELECT COUNT(*), SUM(total), AVG(total)
FROM orders;GROUP BY
SELECT user_id, COUNT(*) AS order_count
FROM orders
GROUP BY user_id;HAVING
SELECT user_id, COUNT(*) AS order_count
FROM orders
GROUP BY user_id
HAVING COUNT(*) > 5;Modifying Data
Update Row
UPDATE users
SET email = 'new@example.com'
WHERE id = 1;Delete Row
DELETE FROM users WHERE id = 1;Table Management
Alter Table
ALTER TABLE users ADD COLUMN age INT;Drop Table
DROP TABLE users;Index
Speeds up lookups on the email column.
CREATE INDEX idx_email ON users(email);Subqueries
Subquery in WHERE
SELECT * FROM users
WHERE id IN (SELECT user_id FROM orders WHERE total > 100);Subquery as a Table
SELECT avg_total.user_id, avg_total.avg
FROM (
SELECT user_id, AVG(total) AS avg
FROM orders
GROUP BY user_id
) AS avg_total;