千锋教育-做有情怀、有良心、有品质的职业教育机构

手机站
千锋教育

千锋学习站 | 随时随地免费学

千锋教育

扫一扫进入千锋手机站

当前位置:首页  >  应聘面试  >  软件测试面试题  > 软件测试面试中常见的SQL笔试题_千锋教育

软件测试面试中常见的SQL笔试题_千锋教育

来源:千锋教育
发布人:cli
时间: 2026-07-03 18:47:46 1783075666

01 为什么SQL成了测试面试的“必杀技”?

面试官不是要你成为DBA,他要看的是:你能否在数据堆里快速定位问题。

测试工作离不开数据。你测一个用户登录功能,需要验证数据库里用户状态是否更新;你测一个订单系统,需要查订单表、商品表、支付表是否一致。不会SQL,你就等于在盲测。

数据不会骗人。一项针对1000名测试工程师的调查显示:85%的测试岗位面试包含SQL笔试题,其中60%的候选人会卡在“多表关联”和“聚合函数”上。

面试官为什么偏爱SQL?

  • ►它测试逻辑思维:写SQL就是写逻辑,会写SQL的人,脑回路清晰
  • ►它测试数据敏感度:懂SQL的人,能一眼看出数据异常
  • ►它测试动手能力:纸上谈兵没用,写出来才是真本事

SQL不是选择题,是生死题。

02 第一道必杀题:查出“每个部门的最高工资”

这是面试中最高频的题目,没有之一。简单粗暴,但能刷掉50%的人。

表结构:employee(id, name, department_id, salary)

题目:查出每个部门中工资最高的员工姓名和工资。

错误答案(90%的人会写):

sql
SELECT department_id, name, MAX(salary)
FROM employee
GROUP BY department_id;

错在哪?name字段没有包含在GROUP BY或聚合函数中,MySQL5.7以上直接报错,低版本会返回随机值——面试官一眼看出你基础不牢。

正确答案:

sql
SELECT e.department_id, e.name, e.salary
FROM employee e
INNER JOIN (
    SELECT department_id, MAX(salary) as max_salary
    FROM employee
    GROUP BY department_id
) t ON e.department_id = t.department_id AND e.salary = t.max_salary;

关键点:

  • ►子查询先算出每个部门的最高工资
  • ►再用JOIN匹配具体员工信息
  • ►如果多个员工工资相同,都会返回

面试官考察什么:

1. 你是否理解GROUP BY的约束

2. 你是否会用子查询解决“最大值对应行”的问题

3. 你是否考虑过“多人并列第一”的情况

面试官不看你写多快,看你考虑多全。

03 第二道必杀题:查出“连续登录3天的用户”

这道题一出现,面试室温度能降3度。它测试的不是SQL语法,是窗口函数和逻辑推理。

表结构:login(user_id, login_date)

题目:找出连续登录3天及以上的用户。

解题思路(面试官要的不是代码,是你怎么想):

1. 每个用户按登录日期排序

2. 用登录日期减去行号,得到“分组标识”

3. 相同分组标识的日期就是连续的

标准答案:

sql
WITH ranked AS (
    SELECT 
        user_id,
        login_date,
        ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY login_date) as rn
    FROM login
),
groups AS (
    SELECT 
        user_id,
        login_date,
        DATE_SUB(login_date, INTERVAL rn DAY) as group_id
    FROM ranked
)
SELECT user_id
FROM groups
GROUP BY user_id, group_id
HAVING COUNT(*) >= 3;

拆解逻辑:

  • ►第一步:ROW_NUMBER给每个用户的登录日期标序号
  • ►第二步:登录日期减序号,连续日期会得到相同值
  • ►第三步:按用户和分组值聚合,统计数量

为什么面试官爱这道题:

  • ►测试你的抽象能力:把“连续”转化为“日期减序号”
  • ►测试你的工具掌握:窗口函数是SQL进阶必备
  • ►测试你的步骤拆解:复杂问题拆成简单步骤

面试技巧:如果你不会窗口函数,可以用自连接+笛卡尔积暴力解。面试官会扣分,但至少证明你有思路。

能写出来的是高手,能讲清楚的是大师。

04 第三道必杀题:查出“没有购买过任何商品的用户”

这道题看似简单,但能区分“会用SQL”和“懂SQL”的人。

表结构:user(user_id, name),order(order_id, user_id, product_id)

题目:找出所有没有下过单的用户。

错误答案:

sql
SELECT user_id, name
FROM user
WHERE user_id NOT IN (
    SELECT user_id FROM order
);

问题在哪?如果order表中user_id存在NULL值,NOT IN会返回空结果集。这是SQL里著名的“NULL陷阱”。

正确答案(两种写法,面试官更爱第二种):

写法一:NOT EXISTS

sql
SELECT u.user_id, u.name
FROM user u
WHERE NOT EXISTS (
    SELECT 1 FROM order o
    WHERE o.user_id = u.user_id
);

写法二:LEFT JOIN + NULL判断

sql
SELECT u.user_id, u.name
FROM user u
LEFT JOIN order o ON u.user_id = o.user_id
WHERE o.user_id IS NULL;

面试官想看到什么:

1. 你知道NOT IN有NULL陷阱

2. 你会用NOT EXISTS或LEFT JOIN规避

3. 你理解“没有”在SQL中的实现方式

性能对比:

  • ►NOT EXISTS:适合子查询结果集小的情况
  • ►LEFT JOIN:适合大表关联,有索引时性能更好
  • ►NOT IN:能用但别用,除非你100%确认无NULL

写对的人很多,写优的人很少。

05 面试官的隐藏考点:你如何应对“不会”的题

SQL笔试题不是终点,面试是动态的。面试官会看你面对不会的题时,是什么反应。

场景模拟:

面试官:“这道连续登录题,5分钟能写出来吗?”

你:“给我点时间想想。”

错误反应:

  • ►沉默10分钟,一个字不说
  • ►直接说“我不会”,放弃
  • ►瞎写一个,面试官一看就知道你在蒙

正确反应:

1. 先拆解问题:把“连续登录”拆成“排序-计算差值-分组”

2. 说出思路:面试官要听你的思考过程

3. 写部分代码:即使写不完,也要展示你会的部分

4. 承认不足:“这个窗口函数我不太熟,但我可以用自连接实现”

面试官打分逻辑:

  • ►写对完整答案:100分
  • ►写对思路但写错语法:80分
  • ►说对思路但写不出代码:60分
  • ►一句话不说:0分

面试官要的不是完美答案,是解决问题的能力。

总结:SQL面试的3个致命错误

错误1:只背语法,不懂逻辑

你背了100道题,面试官换张表、换个条件,你立刻懵。SQL的核心是逻辑,不是语法。

错误2:只写对,不写优

面试官问“还有更好的写法吗?”你答不上来。能写出来是及格,能优化是优秀。

错误3:只动手,不动口

面试官让你说思路,你埋头写代码。沟通能力是测试工程师的核心竞争力,SQL面试也在考察这一点。

SQL面试备考清单:

  • ►掌握3个基础:SELECT、JOIN、GROUP BY
  • ►掌握3个进阶:窗口函数、子查询、CASE WHEN
  • ►掌握3个陷阱:NULL处理、数据类型转换、隐式转换

最后一句:SQL笔试题不是拦路虎,是面试官递给你的一把钥匙——打开测试工程师大门的第一把钥匙。写SQL不靠天赋,靠练习。今天开始,每天刷3道题,一个月后,面试官会主动问你“要不要来我们团队?”

声明:本站稿件版权均属千锋教育所有,未经许可不得擅自转载。
10年以上业内强师集结,手把手带你蜕变精英
请您保持通讯畅通,专属学习老师24小时内将与您1V1沟通
免费领取
今日已有369人领取成功
刘同学 138****2860 刚刚成功领取
王同学 131****2015 刚刚成功领取
张同学 133****4652 刚刚成功领取
李同学 135****8607 刚刚成功领取
杨同学 132****5667 刚刚成功领取
岳同学 134****6652 刚刚成功领取
梁同学 157****2950 刚刚成功领取
刘同学 189****1015 刚刚成功领取
张同学 155****4678 刚刚成功领取
邹同学 139****2907 刚刚成功领取
董同学 138****2867 刚刚成功领取
周同学 136****3602 刚刚成功领取
相关推荐HOT