Toolkitly
One moment…
toolkitly

SQL Cheat Sheet

SQL reference.

45/45
//SELECT11

Select all

$SELECT * FROM users;

Select columns

$SELECT id, name, email FROM users;

WHERE clause

$SELECT * FROM users WHERE age > 25;

LIKE pattern

$SELECT * FROM users WHERE name LIKE 'J%';

IN operator

$SELECT * FROM users WHERE status IN ('active', 'pending');

BETWEEN

$SELECT * FROM products WHERE price BETWEEN 10 AND 100;

DISTINCT

$SELECT DISTINCT country FROM users;

ORDER BY

$SELECT * FROM users ORDER BY name ASC;

LIMIT / OFFSET

$SELECT * FROM users LIMIT 10 OFFSET 20;

CASE expression

$SELECT name,
  CASE
    WHEN age < 18 THEN 'Minor'
    WHEN age BETWEEN 18 AND 65 THEN 'Adult'
    ELSE 'Senior'
  END AS age_group
FROM users;

COALESCE

$SELECT COALESCE(middle_name, 'N/A') FROM users;
//JOIN6

INNER JOIN

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

LEFT JOIN

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

RIGHT JOIN

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

FULL OUTER JOIN

$SELECT u.name, o.order_date
FROM users u
FULL OUTER JOIN orders o ON u.id = o.user_id;

Self Join

$SELECT a.name, b.name AS colleague
FROM users a
JOIN users b ON a.department = b.department
WHERE a.id != b.id;

USING clause

$SELECT * FROM users JOIN orders USING (user_id);
//Aggregations6

COUNT

$SELECT COUNT(*) FROM users;

COUNT DISTINCT

$SELECT COUNT(DISTINCT country) FROM users;

SUM / AVG

$SELECT SUM(price), AVG(price) FROM products;

MIN / MAX

$SELECT MIN(price), MAX(price) FROM products;

GROUP BY

$SELECT country, COUNT(*) AS user_count
FROM users
GROUP BY country;

HAVING

$SELECT country, COUNT(*) AS user_count
FROM users
GROUP BY country
HAVING COUNT(*) > 10;
//DML6

INSERT

$INSERT INTO users (name, email, age)
VALUES ('John', 'john@example.com', 30);

INSERT from SELECT

$INSERT INTO archived_users
SELECT * FROM users WHERE status = 'inactive';

UPDATE

$UPDATE users SET age = age + 1 WHERE status = 'active';

DELETE

$DELETE FROM users WHERE status = 'inactive';

TRUNCATE

$TRUNCATE TABLE users;

UPSERT (PostgreSQL)

$INSERT INTO users (email, name)
VALUES ('x@y.com', 'John')
ON CONFLICT (email) DO UPDATE SET name = EXCLUDED.name;
//DDL6

CREATE TABLE

$CREATE TABLE users (
  id INT PRIMARY KEY AUTO_INCREMENT,
  name VARCHAR(100) NOT NULL,
  email VARCHAR(255) UNIQUE,
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

ALTER ADD column

$ALTER TABLE users ADD COLUMN phone VARCHAR(20);

ALTER DROP column

$ALTER TABLE users DROP COLUMN phone;

CREATE INDEX

$CREATE INDEX idx_users_name ON users(name);

CREATE VIEW

$CREATE VIEW active_users AS
SELECT * FROM users WHERE status = 'active';

DROP TABLE

$DROP TABLE users;
//Transactions5

Begin transaction

$BEGIN;

Commit

$COMMIT;

Rollback

$ROLLBACK;

Savepoint

$SAVEPOINT sp1;
-- ...
ROLLBACK TO sp1;

Isolation level

$SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
//Window functions5

ROW_NUMBER

$SELECT name, salary,
  ROW_NUMBER() OVER (ORDER BY salary DESC) AS rank
FROM employees;

RANK / DENSE_RANK

$SELECT name, department, salary,
  RANK() OVER (PARTITION BY department ORDER BY salary DESC) AS rank
FROM employees;

LAG / LEAD

$SELECT name, month, sales,
  LAG(sales, 1) OVER (PARTITION BY name ORDER BY month) AS prev_month,
  LEAD(sales, 1) OVER (PARTITION BY name ORDER BY month) AS next_month
FROM monthly_sales;

Running total

$SELECT month, sales,
  SUM(sales) OVER (ORDER BY month) AS running_total
FROM monthly_sales;

NTILE

$SELECT name, salary,
  NTILE(4) OVER (ORDER BY salary DESC) AS quartile
FROM employees;