โ CTE (Common Table Expressions)
๐ง 1. What is a CTE?
A CTE (Common Table Expression) is a temporary result set
๐ defined using WITH
๐ used to simplify complex queries
Think like this ๐
๐ โCreate a temporary table โ use it in your queryโ
โก 2. Basic Syntax
WITH cte_name AS (
SELECT ...
)
SELECT * FROM cte_name;
๐ฏ 3. Simple Example
๐ Get employees with salary > 50k
WITH high_salary AS (
SELECT * FROM employees
WHERE salary > 50000
)
SELECT * FROM high_salary;
โ Makes query more readable
๐ฅ 4. CTE with Aggregation
๐ Average salary per department
WITH dept_avg AS (
SELECT department, AVG(salary) AS avg_salary
FROM employees
GROUP BY department
)
SELECT * FROM dept_avg;
โก 5. CTE vs Subquery
CTE ->
More readable, Reusable Better for complex queries
Subquery -> Hard to read Not reusable
๐ฏ 6. Real Example (Interview Level)
๐ Employees earning above department average
WITH dept_avg AS (
SELECT department, AVG(salary) AS avg_salary
FROM employees
GROUP BY department
)
SELECT e.name, e.salary, e.department
FROM employees e
JOIN dept_avg d
ON e.department = d.department
WHERE e.salary > d.avg_salary;
๐ฏ 7. Practice Tasks
1. Create CTE for employees with salary > 40k
2. Find average salary using CTE
3. Get employees above average salary using CTE
4. Count employees per department using CTE
5. Find highest salary per department using CTE
๐ฅ Here are the solutions for CTE practice tasks
โ 1. Create CTE for employees with salary > 40k
WITH high_salary AS (
SELECT * FROM employees
WHERE salary > 40000
)
SELECT * FROM high_salary;
โ 2. Find average salary using CTE
WITH avg_sal AS (
SELECT AVG(salary) AS avg_salary FROM employees
)
SELECT * FROM avg_sal;
โ 3. Get employees above average salary using CTE
WITH avg_sal AS (
SELECT AVG(salary) AS avg_salary FROM employees
)
SELECT e.*
FROM employees e, avg_sal a
WHERE e.salary > a.avg_salary;
๐ Alternative (JOIN style):
WITH avg_sal AS (
SELECT AVG(salary) AS avg_salary FROM employees
)
SELECT e.*
FROM employees e
JOIN avg_sal a
ON e.salary > a.avg_salary;
โ 4. Count employees per department using CTE
WITH dept_count AS (
SELECT department, COUNT(*) AS total_emp
FROM employees
GROUP BY department
)
SELECT * FROM dept_count;
โ 5. Find highest salary per department using CTE
WITH max_sal AS (
SELECT department, MAX(salary) AS max_salary
FROM employees
GROUP BY department
)
SELECT * FROM max_sal;
โก Mini Challenge ๐ฅ
๐ Find top 2 highest salary employees per department using CTE
โก Mini Challenge Solution ๐ฅ
WITH ranked_emp AS (
SELECT name, department, salary,
ROW_NUMBER() OVER (PARTITION BY department ORDER BY salary DESC) AS rn
FROM employees
)
SELECT * FROM ranked_emp
WHERE rn <= 2;
๐ฅ Pro Tip:
Whenever query looks messy:
๐ Replace subquery with CTE
Double Tap โค๏ธ For More