2025年启用的20个SQL面试问题(附实例)

SQL问题几乎在任何数据分析面试中都有。但是,仅仅能阅读语法是不够的,我们需要知道这些查询是如何工作的,以及为什么。在这篇文章中, 我将分享我在2025年启用的 SQL 面试题库,并提供示例和实用技巧,希望大家有所帮助。

1. 检测表中的重复项

SELECT column1, column2, COUNT(*) AS count 
FROM your_table
GROUP BY column1, column2 
HAVING COUNT(*) > 1;

2. INNER JOIN 和 OUTER JOIN 区别

  • INNER JOIN =交集(仅匹配数据);
  • OUTER JOIN =联合 + NULL (匹配 + 不匹配的数据)
SELECT e.name, d.department_name
FROM employees e
INNER JOIN departments d 
ON e.department_id = d.department_id;
SELECT e.name, d.department_name 
FROM employees e
LEFT JOIN departments d 
ON e.department_id = d.department_id;

3.第二高的薪水

SELECT DISTINCT salary
FROM employees
ORDER BY salary DESC
LIMIT 1 OFFSET 1;
SELECT MAX(salary) 
FROM employees
WHERE salary < (SELECT MAX(salary) FROM employees);

4.GROUP BY和HAVING

  • 使用 GROUP BY 对数据进行分组,使用 HAVING 过滤聚合结果。
  • HAVING 在聚合后进行过滤。WHERE 过滤原始行。
SELECT department_id, COUNT(*) AS emp_count
FROM employees
GROUP BY department_id
HAVING COUNT(*) > 5;

5. 收入高于其经理的员工

SELECT e.name AS employee_name, e.salary, 
	m.name AS manager_name, m.salary AS manager_salary
FROM employees e
JOIN employees m 
ON e.manager_id = m.emp_id 
WHERE e.salary > m.salary;

6. 窗口函数

  • 窗口函数对与当前行相关的一组表行执行计算,而不会像 GROUP BY 那样折叠行。
  • 句法:FUNCTION_NAME() OVER(PARTITION BY 列 ORDER BY 列);
  • ROW_NUMBER() 为分区内的每一行分配唯一的序列号;
  • RANK() 将相同的排名分配给具有相同值的行,但跳过下一个排名; 如果 2 名员工的工资相同,则两者都获得排名 1,而下一个员工获得排名 3。
SELECT name, department, salary, 
	ROW_NUMBER() OVER (PARTITION BY department ORDER BY salary DESC) AS row_num 
FROM employees;
SELECT name, department, salary, 
	RANK() OVER (PARTITION BY department ORDER BY salary DESC) AS rank_num 
FROM employees;

7. 表现最好的3款产品

SELECT product_id, product_name, total_sales 
FROM sales_data
ORDER BY total_sales DESC LIMIT 3;
SELECT product_id, product_name, total_sales 
FROM (
	SELECT *, RANK() OVER (ORDER BY total_sales DESC) AS rank_num 
	FROM sales_data
) ranked_sales
WHERE rank_num <= 3;

8.UNION和UNION ALL之间的区别

  • 快速规则:UNION = distinct;UNION ALL = all
SELECT city FROM customers 
UNION
SELECT city FROM vendors;
SELECT city FROM customers 
UNION ALL
SELECT city FROM vendors;

9.CASE 语句

SELECT name, salary, 
	CASE WHEN salary >= 100000 THEN 'High' 
    	WHEN salary >= 50000 THEN 'Medium' 
    	ELSE 'Low'
	END AS salary_category 
FROM employees;

10. 计算销售的累计总和

  • SUM(…) OVER(…) 根据订单日期计算每个产品的累计总数
  • PARTITION BY 按产品分组,ORDER BY 确保累积遵循时间顺序
SELECT date, product, sales,
	SUM(sales) OVER (PARTITION BY product ORDER BY date) AS sum_sales
FROM sales_details;

11. CTE(通用表表达式)

  • 主要是提高可读性并简化复杂的子查询或递归逻辑
  • 可重用且可读,避免重复子查询
WITH TopEarners AS ( 
  SELECT emp_id, name, salary 
  FROM employees
  WHERE salary > 100000
)

SELECT * 
FROM TopEarners;

12. 多次进行超过10,000块交易的客户

SELECT customer_id, COUNT (*) AS high_trans 
FROM Transactions 
WHERE transaction_amount >  10000  
GROUP  BY customer_id 
HAVING  COUNT (*) >  1 ;

13. DELETE和TRUNCATE之间的区别

  • delete删除where条件中的记录;truncate删除所有的记录(无需where)

14.如何优化 SQL

  • 仅使用 SELECT 查询所需的列
  • 对 JOIN、WHERE、ORDER BY 中经常使用的列创建适当的索引
  • 避免在索引列上使用函数
  • 使用 EXISTS 代替 IN(用于子查询),EXISTS(更适合大型数据集)
  • 避免不必要的连接或嵌套子查询
  • 使用适当的数据类型并避免隐式转换

15. 过去6个月内没有进行任何购买的所有客户

SELECT c.customer_id, c.name 
FROM customers c
LEFT JOIN transactions t
ON c.customer_id = t.customer_id
AND t.transaction_date >= CURRENT_DATE - INTERVAL '6 months' 
WHERE t.customer_id IS NULL;

16. 如何处理 NULL 值

  • 使用 IS NULL / IS NOT NULL
  • 使用 COALESCE() 或 IFNULL() 替换 NULL
  • 处理聚合中的 NULL(例如 AVG、SUM)
  • 条件检查

17. 将行转置为列

SELECT region,
  SUM(CASE WHEN month = 'Jan' THEN sales_amount ELSE 0 END) AS Jan,
  SUM(CASE WHEN month = 'Feb' THEN sales_amount ELSE 0 END) AS Feb,
  SUM(CASE WHEN month = 'Mar' THEN sales_amount ELSE 0 END) AS Mar
FROM sales GROUP BY region;
SELECT region, [Jan], [Feb], [Mar]
FROM (
  SELECT region, month, sales_amount FROM sales
  ) AS src
PIVOT (
  SUM(sales_amount)
  FOR month IN ([Jan], [Feb], [Mar])
) AS p;

18.索引如何提高效率,使用时需要注意什么

  • 创建索引: CREATE INDEX idx_customer_id ON transactions(customer_id);
  • 索引以额外的空间和写入时间性能为代价来提高数据库表上数据检索操作的速度
  • 索引太多会减慢 INSERT/UPDATE 的速度
  • 需要避免对基数较低的列进行索引(例如性别)

19. 每个客户的最大交易金额

SELECT customer_id, MAX(amount) AS max_transaction 
FROM transactions
GROUP BY customer_id;

20.自连接

SELECT e.name AS employee_name, m.name AS manager_name 
FROM employees e
LEFT JOIN employees m
ON e.manager_id = m.emp_id;

我是钱德勒(chandler_is_dreaming),拥有超10年全球顶尖企业数据运营与商业分析实战经验,曾任职于多家头部互联网及国际知名企业,历任商业运营总监、商业智能负责人、数据分析高级经理等职。具备丰富的数据分析实战经验,曾成功从0搭建团队、优化流程、推动数字化转型,最多管理60余人的数据团队,累计面试超300人,尤其擅长数据相关岗位(如数据分析师、商业分析师、运营分析师、数据产品经理等)的职业规划、简历优化、技能提升、业务思维、面试技巧等。

钱德勒,拥有超10年全球顶尖企业数据运营与商业分析实战经验,曾任职于Amazon等国际头部企业,历任商业运营总监、商业智能负责人、数据分析高级经理等职。具备丰富的数据分析实战经验,曾成功从0搭建团队、优化流程、推动数字化转型,管理60余人的数据团队,累计面试超300人,尤其擅长数据相关岗位(如数据分析师、商业分析师、运营分析师、数据产品经理等)的职业规划、简历优化、技能提升、业务思维、面试技巧等。

全部评论

相关推荐

2025-12-12 19:58
哔哩哔哩_产品运营
跟同事聊天时候,同事说“你刚来时候blabla”,突然意识到自己已经正式工作一年多了!就这么从脆皮内耗大学生逐渐磨练成厚血条(厚脸皮)工位主理人。秋招简历当然也是投了不少份,但总有一些机会要留给自己的白月光,比如阿B,说说我秋招选择阿B的理由吧:1.&nbsp;“为爱发电”:说来兴趣真的是初心,阿B在手机陪我看了那么多番剧vlog学习视频,当然想和它距离更近一些。来了之后发现,B站重要活动要专门走内宣是有原因的,身边的六级大佬绝对不在少数。2.&nbsp;实习体验感拉满:嗯对其实等不到正式工作就先来实习体验了。实习期在一个非常好的组,大家都很年轻氛围超好,做事情讲背景、讲逻辑不会只丢脏活累活。平时聊得来,工作起来也能快速打配合,项目完成时候所有人都成就感满满。再说说来正式工作之后的体验感:1.&nbsp;校招生mentor文化很需要:在阿B每个校招生入职都是会有一位mentor的,不会让大家有刚工作人生地不熟就孤苦一人挑大梁的感觉。很幸运我的mt人真的超好,耐心温柔业务能力又很强。常常在对需求听她帮我说话时看着她身上闪耀的光芒想要流泪。有mt的话landing期会顺畅很多。公司也会安排一些活动帮助mentor和mentee增进感情。2.小动物们和各类活动是回血剂:工作起来当然难免遇到一些磕磕磨磨,但是压力大时候转头看到想悄悄溜过的小猫摸上一把,真的会治愈不少。还有节假日的各种活动和扫楼活动,真的会给上班增加动力。最后上图!没有任何工作会让人一直开心吧,但阿B你在照顾员工心情这一块儿做得真的很不错。
哔哩哔哩公司福利 904人发布
点赞 评论 收藏
分享
面试官全程关摄像头1.自我介绍一下2.React和Vue哪个更熟悉一点3.你在之前那段实习经历中有没有什么技术性的突破(我只是实习了44天工作28天,我把我能说的都说了)4.你封装的哪个表单组件支不支持动态传值5.自己在实习阶段Vue3项目封装过hook吗6.hook有什么作用7.Vue2和Vue3的响应式区别(我说一个是proxy是拦截所有的底层操作,Object.defineProperty本身就是一个底层操作,有些东西拦截不了,比如数组的一些操作还有等等,面试官就说实在要拦截能不能拦截????我心想肯定不行呀,他的底层机制就不允许吧)8.pinia和vuex的区别(这个回答不出来是我太久没用了)9.pinia和zustand的区别,怎么选(直接给我干懵了)(我说react能用pinia吗&nbsp;&nbsp;他说要用的话也可以)10.渲染一万条数据,怎么解决页面卡顿问题(我说分页、监听滚轮动态加载,纯数据展示好像还可以用canvas画)(估计是没说虚拟表单,感觉不满意)11.type和interface的区别12.ts的泛型有哪些作用(我就说了一个结构相同但是类型不同的时候可以用,比如请求响应的接口,每次的data不同,这里能用一个泛型,他问我还有什么)13.你项目用的是React,如果让你再写一遍你会选择什么14.pnpm、npm、yarn的区别15.dependencies和devdependencies的区别总而言之太久没面试了,上一段实习的面试js问了很多。结果这次js一点没问,网络方面也没考,表现得很一般,但是知道自己的问题了&nbsp;&nbsp;好好准备,等待明天的影石360和周四的腾讯了&nbsp;&nbsp;加油!!!
解zj:大三的第一段面试居然是这样的结局
查看15道真题和解析
点赞 评论 收藏
分享
评论
10
42
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务