关于MySql根据累计值终止查询

本文通过一个实际问题介绍了如何使用SQL查询实现数据的倒序排序并进行累计,直到达到特定条件为止。具体场景是用户表按最后修改时间倒序排序,累计年龄,当累计值超过100时停止。通过设置变量和WHERE子句,可以有效地完成这个任务。示例SQL查询展示了如何操作,并给出了查询结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天有个朋友遇到一个问题:

单据根据创建时间倒序排序

累计单据金额等于或者超过1000时停止查询,返回查出来的数据

当时我没有这样的表,于是我就用现成的一张表,设计了如下的场景,理论一样

有这样的业务场景:

用户表根据最后修改时间倒序排序;

然后从上往下累计年龄累计,当值超过或等于100时停止。

首先有如下的表:
在这里插入图片描述
然后使用@参数保存累计的值,通过where来判断结果获取值,sql如下

SELECT
	T1.id,
	T1.num,
	T1.NAME,
	T1.age,
	T1.last_update_date 
FROM
	(
	SELECT
		@tt := @tt + t.age AS num,
		t.* 
	FROM
		( SELECT * FROM `user` ORDER BY last_update_date DESC ) t,
		( SELECT @tt := 0 ) T2 
	) T1 
WHERE
	T1.num - T1.age < 100

查出结果如下
在这里插入图片描述
这样就完成了上述的问题了。

<think>嗯,用户想要了解高级SQL查询的总结。我需要先确定用户的基础,可能已经掌握了基本的SELECT、WHERE、JOIN等操作,现在想深入更复杂的查询技巧。首先,我得回忆一下高级SQL通常包括哪些内容,比如窗口函数、CTE、子查询优化、递归查询、PIVOT/UNPIVOT,还有性能优化相关的内容。 然后,用户提到的系统级指令要求数学表达式用$...$,但这里是SQL,可能用不上太多数学符号,不过要注意如果有举例中的计算,比如行数计算,可能需要用到。不过主要得确保结构清晰,分点说明,用中文回答。 接下来,得考虑用户可能的实际应用场景。高级SQL常用于数据分析、报表生成、复杂业务逻辑处理,所以需要结合实际例子说明每个高级功能的用途。比如窗口函数在排名、累计求和的应用,CTE在递归查询中的使用,如何优化子查询的性能。 同时,要注意用户不可见的格式要求,比如独立公式用$$...$$,但SQL示例代码应该用代码块,不过用户没有特别提到代码块的格式,可能只需要正常分段。不过通常回答技术内容时,代码示例会用反引号或者缩进,这里可能需要根据平台的支持情况处理,但用户没有特别要求,所以保持清晰即可。 另外,需要检查是否有常见的误区,比如窗口函数与GROUP BY的区别,CTE的递归限制,EXISTS和IN的性能差异等。这些点对于用户深入理解高级查询很重要。 可能还需要涵盖一些高级JOIN用法,比如自连接、交叉连接,以及集合操作符UNION、INTERSECT等。此外,动态SQL和存储过程也可能属于高级内容,但或许用户更关注查询部分,暂时不涉及编程。 最后,确保每个部分都有实际示例,帮助用户更好地理解概念。例如,在讲解窗口函数时,给出一个排名示例,用具体的SQL语句展示如何使用ROW_NUMBER()。在CTE部分,演示如何递归查询组织结构树。 总结结构大概分为几个部分:窗口函数、CTE、子查询优化、递归查询、PIVOT/UNPIVOT、集合操作、性能优化技巧。每个部分简要说明概念、语法和应用场景,附上示例代码。这样用户能逐步了解每个高级功能的作用和用法。 还要注意术语的准确性,比如窗口函数中的PARTITION BY和ORDER BY的作用,CTE的临时结果集特性,递归WITH的使用条件。同时,提醒用户在使用高级功能时注意数据库兼容性,比如不同数据库(MySQL、PostgreSQLSQL Server)对某些语法的支持可能不同。 最后检查是否有遗漏的重要高级主题,比如物化视图、分区表、索引优化策略,不过这些可能偏向数据库设计,而用户问题更侧重于查询,所以可能不需要深入。但如果有相关查询优化技巧,还是可以提及,比如避免在WHERE子句中使用函数,以减少全表扫描。 现在,把这些整理成结构清晰的回答,分点列出,每个部分用小标题,示例代码用代码块,确保语法正确,符合用户的要求。</think>### 高级 SQL 查询总结 以下是高级 SQL 查询的核心知识点与技巧总结,结合实际场景和示例说明,帮助提升复杂数据处理能力。 --- #### 一、窗口函数(Window Functions) **用途**:对数据集的子集(“窗口”)进行计算,不改变原始行数。 **语法**: ```sql 函数名() OVER (PARTITION BY 列 ORDER BY 列 [ROWS/RANGE 范围]) ``` **常用函数**: 1. **排名函数** - `ROW_NUMBER()`:生成唯一行号(如:1,2,3)。 - `RANK()`:允许并列排名(如:1,1,3)。 - `DENSE_RANK()`:允许并列且无间隔排名(如:1,1,2)。 **示例**:按部门分组计算薪资排名 ```sql SELECT name, department, salary, RANK() OVER (PARTITION BY department ORDER BY salary DESC) AS rank FROM employees; ``` 2. **聚合函数** - `SUM()`, `AVG()`, `COUNT()` 等支持窗口计算。 **示例**:计算累计销售额 ```sql SELECT order_date, amount, SUM(amount) OVER (ORDER BY order_date) AS cumulative_sum FROM orders; ``` --- #### 二、公共表表达式(CTE, Common Table Expressions) **用途**:定义临时结果集,提升复杂查询的可读性和复用性。 **语法**: ```sql WITH cte_name AS ( SELECT ... ) SELECT * FROM cte_name; ``` **递归 CTE**:处理层次结构数据(如树形结构)。 **示例**:查询组织层级关系 ```sql WITH RECURSIVE org_tree AS ( SELECT id, name, manager_id FROM employees WHERE manager_id IS NULL -- 根节点 UNION ALL SELECT e.id, e.name, e.manager_id FROM employees e INNER JOIN org_tree ot ON e.manager_id = ot.id ) SELECT * FROM org_tree; ``` --- #### 三、子查询优化 1. **相关子查询 vs 非相关子查询** - **相关子查询**:依赖外部查询,逐行执行,性能较差。 - **非相关子查询**:独立执行,优先优化为 JOIN。 2. **使用 EXISTS 替代 IN** - `EXISTS` 在找到匹配项后立即终止,效率更高。 **示例**: ```sql SELECT * FROM orders o WHERE EXISTS ( SELECT 1 FROM customers c WHERE c.id = o.customer_id AND c.country = 'USA' ); ``` --- #### 四、高级 JOIN 技巧 1. **自连接(Self Join)** **示例**:查找同一部门的员工对 ```sql
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值