SQL Interview Cheat Sheet
SQL Interview Cheat Sheet
SELECT Statement
WHERE Conditions
Ordering Results
SELECT * FROM table
ORDER BY column1 ASC, column2 DESC;
Limiting Results
-- MySQL/PostgreSQL
SELECT * FROM table LIMIT n;
-- SQL Server
SELECT TOP n * FROM table;
INNER JOIN
LEFT JOIN
SELECT c.name, o.order_date
FROM customers c
file:///Users/davidgladson/Downloads/sql_cheatsheet.html 1/7
16/04/2025, 09:23 SQL Interview Cheat Sheet
LEFT JOIN orders o
ON c.id = o.customer_id;
RIGHT JOIN
SELF JOIN
Aggregate Functions
COUNT(column|*)
SUM(column)
AVG(column)
MIN(column)
MAX(column)
GROUP BY
SUBQUERIES
WHERE Subquery
file:///Users/davidgladson/Downloads/sql_cheatsheet.html 2/7
16/04/2025, 09:23 SQL Interview Cheat Sheet
SELECT name
FROM employees
WHERE dept_id IN (
SELECT id
FROM departments
WHERE location = 'New York'
);
EXISTS Subquery
SELECT name
FROM departments d
WHERE EXISTS (
SELECT 1
FROM employees e
WHERE e.dept_id = d.id
);
Correlated Subquery
WINDOW FUNCTIONS
ROW_NUMBER()
SELECT name, dept_id, salary,
ROW_NUMBER() OVER (
PARTITION BY dept_id
ORDER BY salary DESC
) AS salary_rank
FROM employees;
file:///Users/davidgladson/Downloads/sql_cheatsheet.html 3/7
16/04/2025, 09:23 SQL Interview Cheat Sheet
DENSE_RANK() OVER (
ORDER BY salary DESC
) AS dense_rank
FROM employees;
Running Totals
SELECT date, amount,
SUM(amount) OVER (
ORDER BY date
) AS running_total
FROM transactions;
Basic CTE
WITH dept_salaries AS (
SELECT dept_id, AVG(salary) avg_salary
FROM employees
GROUP BY dept_id
)
SELECT e.name, ds.avg_salary
FROM employees e
JOIN dept_salaries ds
ON e.dept_id = ds.dept_id;
UNION ALL
-- Recursive case
SELECT e.id, e.name, e.manager_id, eh.level + 1
FROM employees e
JOIN emp_hierarchy eh
ON e.manager_id = eh.id
)
SELECT * FROM emp_hierarchy;
file:///Users/davidgladson/Downloads/sql_cheatsheet.html 4/7
16/04/2025, 09:23 SQL Interview Cheat Sheet
-- Using dense_rank
SELECT salary
FROM (
SELECT salary,
DENSE_RANK() OVER (
ORDER BY salary DESC
) AS rnk
FROM employees
) ranked
WHERE rnk = N;
Finding Duplicates
SELECT col1, col2, COUNT(*) AS count
FROM table_name
GROUP BY col1, col2
HAVING COUNT(*) > 1;
Running Total
MySQL
DATE(datetime_column)
YEAR(date_column)
MONTH(date_column)
DAY(date_column)
DATEDIFF(date1, date2)
DATE_ADD(date, INTERVAL n DAY|MONTH|YEAR)
DATE_SUB(date, INTERVAL n DAY|MONTH|YEAR)
file:///Users/davidgladson/Downloads/sql_cheatsheet.html 5/7
16/04/2025, 09:23 SQL Interview Cheat Sheet
SQL Server
CAST(datetime_col AS DATE)
YEAR(date_column)
MONTH(date_column)
DAY(date_column)
DATEDIFF(day|month|year, date1, date2)
DATEADD(day|month|year, n, date)
PostgreSQL
date_column::DATE
EXTRACT(YEAR FROM date_column)
EXTRACT(MONTH FROM date_column)
EXTRACT(DAY FROM date_column)
date1 - date2
date + INTERVAL 'n days|months|years'
Keys
-- Primary Key
CREATE TABLE employees (
id INT PRIMARY KEY,
name VARCHAR(100)
);
-- Foreign Key
CREATE TABLE orders (
id INT PRIMARY KEY,
customer_id INT,
FOREIGN KEY (customer_id)
REFERENCES customers(id)
);
Normalization Levels
1NF: Each cell contains single value
2NF: Non-key attributes depend on the entire PK
3NF: Attributes depend only on the PK
BCNF: For X → Y, X must be a superkey
Index Types
-- Single column index
CREATE INDEX idx_lastname
ON employees(last_name);
-- Composite index
CREATE INDEX idx_name
ON employees(last_name, first_name);
-- Unique index
CREATE UNIQUE INDEX idx_email
ON employees(email);
file:///Users/davidgladson/Downloads/sql_cheatsheet.html 6/7
16/04/2025, 09:23 SQL Interview Cheat Sheet
PERFORMANCE OPTIMIZATION
Query Optimization
Index Usage
-- Good: Index can be used
WHERE indexed_col = value
WHERE indexed_col > value
WHERE indexed_col LIKE 'prefix%'
-- SQL Server
SET SHOWPLAN_ALL ON;
GO
SELECT * FROM table;
file:///Users/davidgladson/Downloads/sql_cheatsheet.html 7/7