Back to Notes Library
SQL Basics Cheat Sheet
Basic Queries
sql
-- Select all columns
SELECT * FROM users;
-- Select specific columns
SELECT name, email, age FROM users;
-- With alias
SELECT name AS full_name, email AS contact FROM users;
-- Distinct values
SELECT DISTINCT country FROM users;
-- Limit results
SELECT * FROM users LIMIT 10;
SELECT * FROM users LIMIT 10 OFFSET 20; -- paginationFiltering with WHERE
sql
SELECT * FROM users WHERE age > 18;
SELECT * FROM users WHERE name = 'Alice';
SELECT * FROM users WHERE age BETWEEN 18 AND 30;
SELECT * FROM users WHERE name IN ('Alice', 'Bob', 'Carol');
SELECT * FROM users WHERE name LIKE 'A%'; -- starts with A
SELECT * FROM users WHERE name LIKE '%son'; -- ends with son
SELECT * FROM users WHERE email IS NULL;
SELECT * FROM users WHERE email IS NOT NULL;
SELECT * FROM users WHERE age > 18 AND country = 'US';
SELECT * FROM users WHERE age < 18 OR country = 'UK';
SELECT * FROM users WHERE NOT country = 'US';Sorting & Grouping
sql
-- ORDER BY
SELECT * FROM products ORDER BY price ASC;
SELECT * FROM products ORDER BY price DESC;
SELECT * FROM products ORDER BY category ASC, price DESC;
-- GROUP BY
SELECT country, COUNT(*) AS user_count
FROM users
GROUP BY country;
SELECT category, AVG(price) AS avg_price
FROM products
GROUP BY category
HAVING AVG(price) > 50; -- filter groups (not WHERE!)Aggregate Functions
sql
SELECT COUNT(*) FROM users; -- total rows
SELECT COUNT(email) FROM users; -- non-null emails
SELECT SUM(amount) FROM orders; -- total
SELECT AVG(age) FROM users; -- average
SELECT MIN(price) FROM products; -- minimum
SELECT MAX(price) FROM products; -- maximumJOINs
sql
-- INNER JOIN — only matching rows in both tables
SELECT users.name, orders.amount
FROM users
INNER JOIN orders ON users.id = orders.user_id;
-- LEFT JOIN — all rows from left, NULL if no right match
SELECT users.name, orders.amount
FROM users
LEFT JOIN orders ON users.id = orders.user_id;
-- RIGHT JOIN — all rows from right, NULL if no left match
SELECT users.name, orders.amount
FROM users
RIGHT JOIN orders ON users.id = orders.user_id;
-- FULL OUTER JOIN — all rows from both tables
SELECT users.name, orders.amount
FROM users
FULL OUTER JOIN orders ON users.id = orders.user_id;
-- Self join
SELECT a.name, b.name AS manager
FROM employees a
JOIN employees b ON a.manager_id = b.id;INSERT, UPDATE, DELETE
sql
-- INSERT
INSERT INTO users (name, email, age)
VALUES ('Alice', 'alice@example.com', 25);
INSERT INTO users (name, email)
VALUES
('Bob', 'bob@example.com'),
('Carol', 'carol@example.com');
-- UPDATE
UPDATE users
SET age = 26, email = 'new@example.com'
WHERE id = 1;
-- DELETE
DELETE FROM users WHERE id = 1;
DELETE FROM users WHERE age < 13;CREATE TABLE
sql
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100) NOT NULL,
email VARCHAR(255) UNIQUE NOT NULL,
age INT CHECK(age >= 0),
country VARCHAR(50) DEFAULT 'US',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- Foreign key
CREATE TABLE orders (
id INT PRIMARY KEY AUTO_INCREMENT,
user_id INT NOT NULL,
amount DECIMAL(10,2),
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
);Subqueries
sql
-- Subquery in WHERE
SELECT name FROM users
WHERE id IN (
SELECT user_id FROM orders WHERE amount > 100
);
-- Subquery in FROM
SELECT avg_order.*
FROM (
SELECT user_id, AVG(amount) AS avg_amount
FROM orders
GROUP BY user_id
) AS avg_order
WHERE avg_amount > 50;Common Table Expressions (CTE)
sql
WITH high_value_users AS (
SELECT user_id, SUM(amount) AS total
FROM orders
GROUP BY user_id
HAVING SUM(amount) > 1000
)
SELECT users.name, hvu.total
FROM users
JOIN high_value_users hvu ON users.id = hvu.user_id;Window Functions
sql
-- Row number
SELECT name, salary,
ROW_NUMBER() OVER (ORDER BY salary DESC) AS rank
FROM employees;
-- Running total
SELECT date, amount,
SUM(amount) OVER (ORDER BY date) AS running_total
FROM sales;
-- Partition by department
SELECT name, department, salary,
RANK() OVER (PARTITION BY department ORDER BY salary DESC) AS dept_rank
FROM employees;Indexes
sql
CREATE INDEX idx_email ON users(email);
CREATE UNIQUE INDEX idx_username ON users(username);
CREATE INDEX idx_composite ON orders(user_id, created_at);
DROP INDEX idx_email ON users;
EXPLAIN SELECT * FROM users WHERE email = 'a@b.com';10K+ Members Growing Daily
Get Free AI Notes Daily
Join AiTechWorlds on Telegram and get daily AI tips, prompt engineering templates, coding resources, and exclusive content — 100% free!
📚 Free Study Notes🤖 AI Tips Daily⚡ Prompt Templates💻 Coding Resources
Join Free Channel
No spam. Leave anytime.