← Back to Chapters

MySQL CTE

? MySQL CTE

? Quick Overview

A Common Table Expression (CTE) is a named temporary result set in MySQL that exists only during the execution of a single SQL statement. CTEs are mainly used to simplify complex queries, replace deeply nested subqueries, and improve query readability.

? Key Concepts

  • CTEs are defined using the WITH keyword
  • They behave like temporary tables
  • Scope is limited to the query execution
  • Multiple CTEs can be defined in a single query
  • Supported in MySQL version 8.0 and above

? Syntax / Theory

The CTE is written before the main SELECT, INSERT, UPDATE, or DELETE statement. Once defined, it can be referenced multiple times within the same query.

? View Code Example
-- Basic structure of a CTE in MySQL
WITH cte_name AS (
SELECT column1, column2
FROM table_name
WHERE condition
)
SELECT * FROM cte_name;

? Code Example(s)

? View Code Example
-- Select employees earning more than 50,000 using CTE
WITH high_salary_employees AS (
SELECT id, name, salary
FROM employees
WHERE salary > 50000
)
SELECT id, name, salary
FROM high_salary_employees;
? View Code Example
-- Calculate average salary per department using CTE
WITH department_avg_salary AS (
SELECT department_id, AVG(salary) AS avg_salary
FROM employees
GROUP BY department_id
)
SELECT department_id, avg_salary
FROM department_avg_salary;
? View Code Example
-- Use CTE with JOIN to compare employee salary with department average
WITH dept_avg AS (
SELECT department_id, AVG(salary) AS avg_salary
FROM employees
GROUP BY department_id
)
SELECT e.name, e.salary, d.avg_salary
FROM employees e
JOIN dept_avg d
ON e.department_id = d.department_id
WHERE e.salary > d.avg_salary;

? Live Output / Explanation

? How CTE Execution Works

  • The CTE query runs first
  • Result is stored in memory temporarily
  • Main query reads data from the CTE
  • CTE is discarded after query completion

? Use Cases

  • Simplifying complex joins
  • Replacing nested subqueries
  • Generating readable reporting queries
  • Breaking large queries into logical parts

? Tips & Best Practices

  • Use meaningful and descriptive CTE names
  • Prefer CTEs for readability over nested subqueries
  • Avoid very large CTEs for performance-sensitive queries
  • Index base tables used inside CTEs

? Try It Yourself

  • Create a CTE to find top 5 highest-paid employees
  • Write a CTE to calculate total sales per customer
  • Convert an existing subquery into a CTE
  • Use multiple CTEs in a single query