MsSql

关注公众号 jb51net

关闭
首页 > 数据库 > MsSql > sql subquery、CTE 和 temporary table

SQL中的Subquery & CTE & Temporary Table 区别深度对比分析

作者:木木子9999

这篇文章主要介绍了SQL中的Subquery & CTE & Temporary Table 区别深度对比分析,这三个技术都用于创建临时数据集,但它们在实现方式、使用场景和性能特点上有显著差异,感兴趣的朋友一起看看吧

Subquery、CTE 和 Temporary Table 的深度对比

这三个技术都用于创建临时数据集,但它们在实现方式、使用场景和性能特点上有显著差异。让我们用"数学演草纸"的比喻来深入分析:

1. 子查询 (Subquery)

比喻:就像在解题过程中随手在题目旁边写的草稿计算

特点

示例

SELECT user_id 
FROM orders 
WHERE amount > (SELECT AVG(amount) FROM orders);  -- WHERE子句中的子查询

适用场景

2. 公共表表达式 (CTE, Common Table Expression)

比喻专门拿出一张草稿纸写中间步骤,可以随时翻看

特点

示例

-- 使用CTE和比较运算符 >,先筛选出消费总额超过1000的高价值用户和最近30天活跃用户,最终通过 INTERSECT 取两者的交集,找出​​既高消费又活跃的核心用户群体​​。
WITH high_value_customers AS (
    SELECT user_id FROM orders GROUP BY user_id HAVING SUM(amount) > 1000
), #筛选订单总额超过1000的用户
active_customers AS (
    SELECT user_id FROM logins WHERE login_date > CURRENT_DATE - 30
) #筛选30天内有登录记录的活跃用户
SELECT * FROM high_value_customers 
INTERSECT 
SELECT * FROM active_customers;

适用场景

3. 临时表 (Temporary Table)

比喻:专门准备一个笔记本记录中间结果,可以反复翻阅和修改

特点

示例

CREATE TEMPORARY TABLE temp_high_value AS
SELECT user_id FROM orders GROUP BY user_id HAVING SUM(amount) > 1000;
ALTER TABLE temp_high_value ADD INDEX (user_id);  -- 可以添加索引
SELECT * FROM temp_high_value h JOIN users u ON h.user_id = u.id;
DROP TEMPORARY TABLE IF EXISTS temp_high_value;  -- 显式清理

适用场景

三者的核心对比

特性子查询 (Subquery)CTE临时表 (Temporary Table)
存储方式逻辑存在,不物理存储逻辑存在,可能被优化器物化物理存储在tempdb
作用域当前子句当前语句整个会话
生命周期查询执行期间查询执行期间显式删除或会话结束
是否可复用不可复用同一WITH子句内可引用跨查询复用
是否可修改不可修改不可修改可INSERT/UPDATE/DELETE
是否支持索引不支持不支持支持
性能特点简单查询高效中等复杂度查询最优复杂数据处理最优
语法复杂度简单中等较高
典型使用场景简单过滤/计算复杂查询模块化跨语句共享数据/大型处理

如何选择?

记住:随着SQL复杂度的增加,通常的开发路径是:子查询 → CTE → 临时表。优化器对三者的处理方式不同,在性能关键场景中需要测试验证。

到此这篇关于SQL中的Subquery & CTE & Temporary Table 区别深度对比分析的文章就介绍到这了,更多相关sql subquery、CTE 和 temporary table内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文