SQL Cheat Sheet

SQL Syntax Overview

-- SQL statements end with semicolons
SELECT column1, column2 FROM table_name WHERE condition;

Data Types (INT, VARCHAR, DATE, etc.)

INT, BIGINT, DECIMAL(10,2)
VARCHAR(255), TEXT
DATE, DATETIME, TIMESTAMP
BOOLEAN

CREATE, DROP, ALTER TABLE

CREATE TABLE users (
  id INT PRIMARY KEY,
  name VARCHAR(100)
);

ALTER TABLE users ADD email VARCHAR(255);
DROP TABLE users;

INSERT INTO

INSERT INTO users (id, name) VALUES (1, 'Alice');

SELECT

SELECT name, email FROM users;

UPDATE

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

DELETE

DELETE FROM users WHERE id = 1;

WHERE Clause

SELECT * FROM users WHERE age > 18;

ORDER BY

SELECT * FROM users ORDER BY age DESC;

GROUP BY

SELECT department, COUNT(*) FROM employees GROUP BY department;

HAVING

SELECT department, COUNT(*) 
FROM employees GROUP BY department 
HAVING COUNT(*) > 5;

LIMIT / OFFSET

SELECT * FROM users LIMIT 10 OFFSET 20;

DISTINCT

SELECT DISTINCT department FROM employees;

INNER JOIN

SELECT u.name, o.total 
FROM users u 
INNER JOIN orders o ON u.id = o.user_id;

LEFT JOIN

SELECT u.name, o.total 
FROM users u 
LEFT JOIN orders o ON u.id = o.user_id;

RIGHT JOIN

SELECT u.name, o.total 
FROM users u 
RIGHT JOIN orders o ON u.id = o.user_id;

FULL OUTER JOIN

SELECT * FROM a 
FULL OUTER JOIN b ON a.id = b.id;

CROSS JOIN

SELECT * FROM products CROSS JOIN categories;

SELF JOIN

SELECT a.name, b.name 
FROM employees a, employees b 
WHERE a.manager_id = b.id;

COUNT()

SELECT COUNT(*) FROM users WHERE active = TRUE;

SUM()

SELECT SUM(total) FROM orders WHERE status = 'completed';

AVG()

SELECT AVG(salary) FROM employees;

MIN()

SELECT MIN(age) FROM users;

MAX()

SELECT MAX(score) FROM results;

Subqueries in SELECT, FROM, WHERE

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

-- In FROM
SELECT avg_salary FROM (
  SELECT department_id, AVG(salary) AS avg_salary FROM employees GROUP BY department_id
) AS dept_avg;

-- In WHERE
SELECT * FROM employees WHERE department_id IN (SELECT id FROM departments WHERE name = 'Sales');

Correlated Subqueries

SELECT name FROM employees e
WHERE salary > (SELECT AVG(salary) FROM employees WHERE department_id = e.department_id);

Set Operations

-- UNION
SELECT name FROM customers
UNION
SELECT name FROM vendors;

-- UNION ALL
SELECT name FROM customers
UNION ALL
SELECT name FROM vendors;

-- INTERSECT
SELECT name FROM customers
INTERSECT
SELECT name FROM vendors;

-- EXCEPT
SELECT name FROM customers
EXCEPT
SELECT name FROM vendors;

Constraints

CREATE TABLE accounts (
  id INT PRIMARY KEY,
  email VARCHAR(255) UNIQUE NOT NULL,
  balance DECIMAL(10,2) DEFAULT 0.0,
  status VARCHAR(20) CHECK (status IN ('active', 'inactive')),
  user_id INT,
  FOREIGN KEY (user_id) REFERENCES users(id)
);

CREATE INDEX, DROP INDEX, EXPLAIN

CREATE INDEX idx_users_email ON users(email);
DROP INDEX idx_users_email;

EXPLAIN SELECT * FROM users WHERE email = 'test@example.com';

Transactions

BEGIN;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
COMMIT;

-- Rollback example
BEGIN;
DELETE FROM users WHERE id = 99;
ROLLBACK;

-- Savepoint example
BEGIN;
SAVEPOINT sp1;
UPDATE accounts SET balance = 0;
ROLLBACK TO sp1;
COMMIT;

Views

CREATE VIEW active_users AS
SELECT * FROM users WHERE active = TRUE;

ALTER VIEW active_users AS
SELECT id, name FROM users WHERE active = TRUE;

DROP VIEW active_users;

Stored Procedures & Functions

-- Procedure
CREATE PROCEDURE AddUser(IN username VARCHAR(50))
BEGIN
  INSERT INTO users(name) VALUES(username);
END;

CALL AddUser('John');

-- Function
CREATE FUNCTION GetUserCount() RETURNS INT
BEGIN
  DECLARE total INT;
  SELECT COUNT(*) INTO total FROM users;
  RETURN total;
END;

SELECT GetUserCount();

Triggers

CREATE TRIGGER trg_before_insert
BEFORE INSERT ON orders
FOR EACH ROW
BEGIN
  SET NEW.created_at = NOW();
END;

CREATE TRIGGER trg_after_update
AFTER UPDATE ON users
FOR EACH ROW
BEGIN
  INSERT INTO audit_log(user_id, change_date) VALUES(NEW.id, NOW());
END;

Miscellaneous

Aliases (AS)

SELECT name AS customer_name FROM users;

CASE Statements

SELECT name,
  CASE WHEN active THEN 'Active' ELSE 'Inactive' END AS status
FROM users;

NULL Handling

SELECT * FROM users WHERE email IS NULL;
SELECT * FROM users WHERE email IS NOT NULL;

String Functions

SELECT CONCAT(first_name, ' ', last_name) AS full_name FROM users;
SELECT LENGTH(name) FROM users;

Date Functions

SELECT NOW();
SELECT DATE_ADD(NOW(), INTERVAL 7 DAY);
SELECT DATEDIFF('2024-12-31', '2024-01-01');