逐级累计sql

SQL累加求和技巧

需求是这样的:
在这里插入图片描述
已知前两列,要求第三列。

解答思路,第一列里的分档没有啥关联性,干脆加一列,是递增的数值,叫层级:
在这里插入图片描述
这张表的建表语句是:

CREATE TABLE `maidong` (
  `levelx` bigint(20) DEFAULT NULL,
  `renshu` bigint(20) DEFAULT NULL,
  `sum_renshu` bigint(20) DEFAULT NULL,
  `fendang` varchar(255) DEFAULT NULL
) 

嗯,这个表叫maidong,因为我在喝脉动。

一个sql搞定你要的结果:

SELECT DISTINCT
	levelx,
	renshu,
	(
		SELECT
			sum(renshu)
		FROM
			maidong
		WHERE
			levelx < t.levelx + 1
	) AS sum_renshu,
fendang
FROM
	maidong t

看效果图:在这里插入图片描述

<think>嗯,用户让我介绍一下SQL面试的常见问题。好的,首先我得回想一下自己在准备SQL面试时碰到的问题,或者网上常见的题目类型。可能用户正在准备面试,需要系统性的整理。他们可能想了解不同难度的问题,从基础到高级,或者是具体的例子,比如联结、聚合函数、窗口函数这些。 首先,我应该分门别类,把问题分成几个大类,比如基础语法、联结操作、聚合与分组、子查询、窗口函数、优化等。然后每个类别下举几个典型的问题,最好配上例子和解答,这样用户更容易理解。 用户可能还需要知道面试中常考的场景题,比如排名、分数计算、处理重复数据等。比如,求每个部门的最高工资,或者删除重复记录这些。还有,关于索引和优化的问题,面试官可能会问如何优化慢查询,或者索引的类型和选择。 需要注意用户提到的系统级指令,数学公式要用正确的格式,但这里可能用不上太多数学,不过如果有例子涉及到计算的话,可能需要用LaTeX。不过SQL问题可能更多是代码示例,所以可能需要用代码块。但用户没有特别提到代码格式,所以可能需要按常规方式处理。 然后,用户需要结构清晰的回答,逐步解决问题。所以应该分点列出各个主题,每个主题下给出问题、示例和解答。比如在联结操作部分,可以讲内联结、左联结的区别,并给出例子。在聚合函数部分,GROUP BY和HAVING的使用场景,如何处理NULL值等。 还有,用户可能对事务和ACID属性有疑问,所以需要包括事务相关的问题,比如隔离级别,脏读、幻读这些概念。此外,关于DDL、DML的区别,也是基础问题的一部分。 最后,优化和索引部分,可能需要解释执行计划,如何分析查询效率,常见的优化手段,比如避免SELECT *,使用索引等。 需要检查有没有遗漏的重要主题,比如窗口函数中的RANK、ROW_NUMBER的区别,或者CASE WHEN的应用场景。还有,如何处理NULL值在聚合函数中的影响,比如COUNT(*)和COUNT(列名)的区别。 总之,结构应该清晰,涵盖主要考点,每个问题有示例和解答,帮助用户逐步理解。可能需要避免过于深入某个点,保持整体平衡,覆盖高频问题。</think>以下是SQL面试常见问题的分类整理及解析,帮助您系统化准备: --- ### 一、基础语法与查询 1. **SELECT与过滤** - 问题:如何查询表中某列满足条件的记录? - 示例: ```sql SELECT name, age FROM users WHERE age > 18 AND city = '北京'; ``` - 考点:`WHERE`条件组合、运算符优先级。 2. **排序与去重** - 问题:如何按工资降序排列并去重? - 示例: ```sql SELECT DISTINCT salary FROM employees ORDER BY salary DESC; ``` - 考点:`DISTINCT`、`ORDER BY`。 --- ### 二、联结操作(JOIN) 1. **内联结 vs 左联结** - 问题:查询所有员工及其部门名称(包括无部门员工) - 示例: ```sql SELECT e.name, d.dept_name FROM employees e LEFT JOIN departments d ON e.dept_id = d.id; ``` - 考点:`LEFT JOIN`保留左表全部记录。 2. **多表联结** - 问题:查询订单详情(客户名、产品名、数量) - 示例: ```sql SELECT c.name, p.product_name, o.quantity FROM orders o JOIN customers c ON o.customer_id = c.id JOIN products p ON o.product_id = p.id; ``` - 考点:多表关联逻辑。 --- ### 三、聚合与分组 1. **GROUP BY与HAVING** - 问题:统计每个部门工资超过1万元的员工数量 - 示例: ```sql SELECT dept_id, COUNT(*) FROM employees WHERE salary > 10000 GROUP BY dept_id HAVING COUNT(*) > 5; ``` - 考点:`WHERE`过滤行,`HAVING`过滤分组。 2. **聚合函数处理NULL** - 问题:`COUNT(*)`与`COUNT(column)`的区别? - 答案:`COUNT(*)`统计所有行,`COUNT(column)`忽略NULL值。 --- ### 四、子查询与复杂查询 1. **相关子查询** - 问题:查询工资高于部门平均工资的员工 - 示例: ```sql SELECT name, salary FROM employees e1 WHERE salary > (SELECT AVG(salary) FROM employees e2 WHERE e2.dept_id = e1.dept_id); ``` - 考点:子查询与主查询的关联。 2. **EXISTS vs IN** - 问题:查询有订单的客户 - 示例: ```sql SELECT name FROM customers c WHERE EXISTS (SELECT 1 FROM orders o WHERE o.customer_id = c.id); ``` - 考点:`EXISTS`效率通常优于`IN`。 --- ### 五、窗口函数 1. **排名问题** - 问题:按部门分组计算工资排名 - 示例: ```sql SELECT name, dept_id, salary, RANK() OVER (PARTITION BY dept_id ORDER BY salary DESC) AS rank FROM employees; ``` - 考点:`RANK()`、`ROW_NUMBER()`、`DENSE_RANK()`的区别。 2. **滑动窗口计算** - 问题:计算每个员工前3个月的累计工资 - 示例: ```sql SELECT name, month, salary, SUM(salary) OVER (PARTITION BY name ORDER BY month ROWS 2 PRECEDING) AS rolling_sum FROM salary_table; ``` --- ### 六、数据操作与事务 1. **删除重复数据** - 问题:删除表中重复记录(保留ID最小的一条) - 示例: ```sql DELETE FROM users WHERE id NOT IN (SELECT MIN(id) FROM users GROUP BY email); ``` 2. **事务ACID属性** - 问题:解释事务的隔离级别(如脏读、幻读) - 答案:读未提交 → 读已提交 → 可重复读 → 串行化(隔离性逐级增强)。 --- ### 七、性能优化 1. **索引设计** - 问题:何时使用联合索引? - 答案:遵循最左前缀原则,高频查询条件优先。 2. **EXPLAIN分析** - 问题:如何优化慢查询? - 步骤:用`EXPLAIN`查看执行计划,关注`type`(扫描方式)、`key`(使用索引)等。 --- ### 高频真题示例 1. **TOP N问题** ```sql -- 查询每个部门工资前三高的员工 SELECT * FROM ( SELECT name, dept_id, salary, DENSE_RANK() OVER (PARTITION BY dept_id ORDER BY salary DESC) AS rank FROM employees ) t WHERE rank <= 3; ``` 2. **行列转换** ```sql -- 将行数据转换为列(如统计各季度销售额) SELECT product_id, SUM(CASE WHEN quarter = 'Q1' THEN amount END) AS Q1, SUM(CASE WHEN quarter = 'Q2' THEN amount END) AS Q2 FROM sales GROUP BY product_id; ``` --- 掌握以上核心问题后,建议结合《SQL必知必会》等书籍练习,并熟悉LeetCode/SQLZoo等平台实战。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值