Table of Contents
What is CTE?
Improve code readability using CTE
Recursive CTE
Some precautions in practical applications
Home Database SQL Working with Common Table Expressions (CTEs) in SQL

Working with Common Table Expressions (CTEs) in SQL

Jul 16, 2025 am 03:22 AM

CTE (Common Table Expression) is a tool in SQL for splitting complex queries, improving readability and maintenance. It is a temporary result set that can be referenced multiple times in a single query, with a clear structure, especially suitable for nested subqueries and recursive data processing. The basic syntax is WITH cte_name AS (query statement) SELECT * FROM cte_name; for example, when counting the number of employees in the department, you can first define the dept_count CTE and then filter the results. Using CTE can disassemble logic in steps, such as first calculating the average salary of each department, and then finding employees who are above the average salary, making the code easier to understand. CTE also supports recursive queries, suitable for tree structure data, in the format WITH RECURSIVE cte_name AS (UNION ALL recursive query), such as finding an employee and all subordinates. Notes include: the recursive part must reference itself and have termination conditions; different database support levels are different; CTE is not materialized, and repeated references may affect performance; avoid conflicts with table names; and attention should be paid to database version in terms of compatibility. It is recommended to give priority to using CTE when you need to disassemble logic, recursive queries, or improve readability.

Working with Common Table Expressions (CTEs) in SQL

CTE (Common Table Expression) is a very practical tool in SQL that allows you to split complex queries into more readable and maintainable parts. Especially when dealing with nested subqueries or recursive data, the advantages of CTE's clear structure are very obvious.

Working with Common Table Expressions (CTEs) in SQL

What is CTE?

CTE is a temporary result set that can be referenced multiple times in a query. It is not a physical table, but a logical "temporary view", and its scope is limited to the query that defines it.

Working with Common Table Expressions (CTEs) in SQL

The basic syntax is as follows:

 WITH cte_name AS (
    -- Query statement)
SELECT * FROM cte_name;

For example, if you want to count the number of employees in each department, you can write it like this:

Working with Common Table Expressions (CTEs) in SQL
 WITH dept_count AS (
    SELECT department_id, COUNT(*) AS num_employees
    FROM employees
    GROUP BY department_id
)
SELECT * FROM dept_count WHERE num_employees > 5;

This not only has a clear structure, but also facilitates debugging and reuse.


Improve code readability using CTE

Many people like to use nested subqueries to solve problems at the beginning, but once there are more levels, SQL becomes difficult to understand and maintain. And using CTE can be written layer by layer, and each part is clear and clear.

For example: Suppose you want to find employees whose salary is higher than the average salary in your department. If you write with a subquery, you may have nested three layers, which looks very confusing; but if you use CTE:

 WITH avg_salary AS (
    SELECT department_id, AVG(salary) AS avg_sal
    FROM employees
    GROUP BY department_id
),
high_earners AS (
    SELECT e.*
    FROM employees e
    JOIN avg_salary a ON e.department_id = a.department_id
    WHERE e.salary > a.avg_sal
)
SELECT * FROM high_earners;

Write it in steps and others will know what you are doing at a glance.


Recursive CTE

One of the most powerful functions of CTE is that it supports recursive queries, which are suitable for tree structures or hierarchical data, such as organizational structures, directory structures, etc.

The basic format is as follows:

 WITH RECURSIVE cte_name AS (
    -- Initial query (anchor member)
    SELECT ...
    UNION ALL
    -- Recursive query SELECT...
)
SELECT * FROM cte_name;

For example, find an employee and all of his subordinates:

 WITH RECURSIVE subordinates AS (
    SELECT employee_id, manager_id, name
    FROM employees
    WHERE employee_id = 100 -- Starting employee UNION ALL

    SELECT e.employee_id, e.manager_id, e.name
    FROM employees e
    INNER JOIN subordinates s ON e.manager_id = s.employee_id
)
SELECT * FROM subordinates;

A few points to note:

  • The recursive part must refer to the CTE itself
  • There must be a termination condition, otherwise there will be infinite loops
  • Different databases have slightly different support for recursive CTE. Check the document before using it.

Some precautions in practical applications

Although CTE is very useful, there are some details that need to be paid attention to:

  • Performance issues : CTE is not a materialized view, and it will be executed again every time the reference is referenced. If you use multiple CTEs on a large table, and each is called multiple times, it may slow down the query.
  • Naming conflict : Do not give the CTE the same name as the actual table, as it is easy to be confused.
  • Compatibility : Although mainstream databases support CTE (such as PostgreSQL, MySQL 8.0, and SQL Server), some older versions may not support recursive CTE.

It is recommended to prioritize CTE in the following scenarios:

  • Query is complicated and requires disassembly of logic
  • Recursive query is required
  • Want to improve code readability and maintenance

Basically that's it. CTE is a very practical way in SQL writing. After mastering it, you will find that many complex queries can become clearer and easier to understand.

The above is the detailed content of Working with Common Table Expressions (CTEs) in SQL. For more information, please follow other related articles on the PHP Chinese website!

Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

Hot AI Tools

Undress AI Tool

Undress AI Tool

Undress images for free

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Clothoff.io

Clothoff.io

AI clothes remover

Video Face Swap

Video Face Swap

Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

Hot Topics

PHP Tutorial
1504
276
When to use SQL subqueries versus joins for data retrieval. When to use SQL subqueries versus joins for data retrieval. Jul 14, 2025 am 02:29 AM

Whether to use subqueries or connections depends on the specific scenario. 1. When it is necessary to filter data in advance, subqueries are more effective, such as finding today's order customers; 2. When merging large-scale data sets, the connection efficiency is higher, such as obtaining customers and their recent orders; 3. When writing highly readable logic, the subqueries structure is clearer, such as finding hot-selling products; 4. When performing updates or deleting operations that depend on related data, subqueries are the preferred solution, such as deleting users that have not been logged in for a long time.

How to find the second highest salary in SQL How to find the second highest salary in SQL Jul 14, 2025 am 02:06 AM

There are three core methods to find the second highest salary: 1. Use LIMIT and OFFSET to skip the maximum salary and get the maximum, which is suitable for small systems; 2. Exclude the maximum value through subqueries and then find MAX, which is highly compatible and suitable for complex queries; 3. Use DENSE_RANK or ROW_NUMBER window function to process parallel rankings, which is highly scalable. In addition, it is necessary to combine IFNULL or COALESCE to deal with the absence of a second-highest salary.

How to create empty tables with the same structure as another table? How to create empty tables with the same structure as another table? Jul 11, 2025 am 01:51 AM

You can use SQL's CREATETABLE statement and SELECT clause to create a table with the same structure as another table. The specific steps are as follows: 1. Create an empty table using CREATETABLEnew_tableASSELECT*FROMexisting_tableWHERE1=0;. 2. Manually add indexes, foreign keys, triggers, etc. when necessary to ensure that the new table is intact and consistent with the original table structure.

Using Regular Expressions (Regex) in SQL Queries. Using Regular Expressions (Regex) in SQL Queries. Jul 10, 2025 pm 01:10 PM

MySQL supports REGEXP and RLIKE; PostgreSQL uses operators such as ~ and ~*; Oracle is implemented through REGEXP_LIKE; SQLServer requires CLR integration or simulation. 2. Regularly used to match mailboxes (such as WHEREemailREGEXP'^[A-Za-z0-9._% -] @[A-Za-z0-9.-] \.[A-Za-z]{2,}$'), extract area codes (such as SUBSTRING(phoneFROM'^(\d{3})')), filter usernames containing numbers (such as REGEXP_LIKE(username,'[0-9]')). 3. Pay attention to performance issues,

Calculating conditional sums or counts in SQL. Calculating conditional sums or counts in SQL. Jul 14, 2025 am 01:39 AM

Calculate the conditional sum or count in SQL, mainly using CASE expressions or aggregate functions with filtering. 1. Using CASE expressions nested in the aggregate function, you can count the results according to different conditions in a single line of query, such as COUNT(CASEWHENstatus='shipped'THEN1END) and SUM(CASEWHENstatus='shipped'THENamountELSE0END); 2. PostgreSQL supports FILTER syntax to make the code more concise, such as COUNT(*)FILTER(WHEREstatus='shipped'); 3. Multiple conditions can be processed in the same query,

SQL for Predictive Analytics SQL for Predictive Analytics Jul 20, 2025 am 02:02 AM

In predictive analysis, SQL can complete data preparation and feature extraction. The key is to clarify the requirements and use SQL functions reasonably. Specific steps include: 1. Data preparation requires extracting historical data from multiple tables and aggregating and cleaning, such as aggregating sales volume by day and associated promotional information; 2. The feature project can use window functions to calculate time intervals or lag features, such as obtaining the user's recent purchase interval through LAG(); 3. Data segmentation is recommended to divide the training set and test set based on time, such as sorting by date with ROW_NUMBER() and marking the collection type proportionally. These methods can efficiently build the data foundation required for predictive models.

How to generate a series of dates in SQL How to generate a series of dates in SQL Jul 11, 2025 am 02:31 AM

The method of generating date sequences in SQL varies from database system. The main methods include: 1. PostgreSQL uses the generate_series() function; 2. MySQL combines DATE_ADD() and numeric tables or recursive CTE; 3. Oracle uses the CONNECTBY hierarchical query; 4. BigQuery uses the GENERATE_DATE_ARRAY() function. Each method can generate a specified range of date sequences as needed, and can perform subsequent operations through CTE or subqueries. At the same time, attention should be paid to avoid performance problems caused by large range of dates.

Explain Clustered vs Nonclustered Indexes in SQL. Explain Clustered vs Nonclustered Indexes in SQL. Jul 13, 2025 am 02:21 AM

Clustered index determines the physical storage order of data, and there can be only one per table; non-clustered indexes do not change the order of data, and are independent search structures and can create multiple ones. 1. Clustered index sorts data by index, improving the efficiency of primary key and range query, but the cost of insertion and update is high. 2. Non-clustered indexes are similar to directories, including indexed columns and pointers to data, suitable for frequently searched columns. 3. The heap table has no clustered index, and the nonclustered index points to the physical address. The choice of both depends on the query mode and the frequency of data change.

See all articles