🇮🇳 India's Free Coding Tutorial — Learn C, PHP, MySQL, Python, Java About · Contact
Advertisement

CTEs — WITH Clause

MySQL Advanced Topics 📅 Mar 2026 ⏱ 5 min read 🆓 Free

CTEs — Common Table Expressions

Named temporary result sets using the WITH clause. Makes complex queries more readable.

sql
-- Basic CTE
WITH top_students AS (
    SELECT name, marks, dept_id
    FROM students
    WHERE marks >= 80
)
SELECT t.name, t.marks, d.name AS dept
FROM top_students t
INNER JOIN departments d ON t.dept_id = d.id;

-- Multiple CTEs
WITH
avg_marks AS (
    SELECT dept_id, AVG(marks) AS dept_avg
    FROM students
    GROUP BY dept_id
),
top_students AS (
    SELECT s.name, s.marks, s.dept_id
    FROM students s
    INNER JOIN avg_marks a ON s.dept_id = a.dept_id
    WHERE s.marks > a.dept_avg
)
SELECT t.name, t.marks, d.name AS dept
FROM top_students t
INNER JOIN departments d ON t.dept_id = d.id;

-- Recursive CTE - employee hierarchy
WITH RECURSIVE org_chart AS (
    SELECT id, name, manager_id, 0 AS level
    FROM employees WHERE manager_id IS NULL
    UNION ALL
    SELECT e.id, e.name, e.manager_id, oc.level + 1
    FROM employees e
    INNER JOIN org_chart oc ON e.manager_id = oc.id
)
SELECT REPEAT("  ", level), name FROM org_chart;
Advertisement
← Back to MySQL Index