DM
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;