问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

SQL面试题精选:助你轻松拿Offer

创作时间:
作者:
@小白创作中心

SQL面试题精选:助你轻松拿Offer

引用
CSDN
7
来源
1.
https://blog.csdn.net/weixin_38037405/article/details/136891835
2.
https://blog.csdn.net/m0_53300365/article/details/139102278
3.
https://m.blog.csdn.net/2401_85405886/article/details/140204922
4.
https://blog.csdn.net/weixin_44996457/article/details/137829741
5.
https://m.blog.csdn.net/m0_61549591/article/details/136674699
6.
https://m.bjpowernode.com/sqlmst/sqldbcx.html
7.
https://cloud.tencent.com/developer/article/2438210

SQL作为数据管理和分析的核心工具,在各类技术面试中占据重要地位。无论是数据分析师、数据工程师还是软件开发工程师,掌握SQL都是必备技能。本文精选了一系列SQL面试题,从基础查询到复杂分析,帮助求职者全面准备SQL面试。

01

基础查询

单表查询

题目1:查询所有学生的信息

表结构:学生表(Student)

  • SId:学生ID
  • Sname:学生姓名
  • Sage:出生日期
  • Ssex:性别

解题思路:这是一个最基础的查询,直接使用SELECT语句即可。

SELECT * FROM Student;

简单聚合

题目2:查询每个部门的平均绩效

表结构:绩效表(Performance)

  • a:年份
  • b:部门
  • c:绩效得分

解题思路:使用GROUP BY对部门进行分组,然后用AVG计算平均值。

SELECT b, AVG(c) as avg_performance
FROM Performance
GROUP BY b;
02

多表连接

内连接

题目3:查询每个学生的选课信息

表结构:

  • 学生表(Student):SId, Sname
  • 成绩表(SC):SId, CID, score
  • 课程表(Course):CID, Cname

解题思路:使用INNER JOIN连接三个表,获取学生姓名和对应的课程名称及成绩。

SELECT s.Sname, c.Cname, sc.score
FROM Student s
INNER JOIN SC sc ON s.SId = sc.SId
INNER JOIN Course c ON sc.CID = c.CID;

外连接

题目4:查询所有部门及其员工数量

表结构:

  • 员工表(Employees):employee_id, department_id
  • 部门表(Departments):department_id, department_name

解题思路:使用LEFT JOIN确保所有部门都被列出,即使没有员工的部门也要显示。

SELECT d.department_name, COUNT(e.employee_id) as num_employees
FROM Departments d
LEFT JOIN Employees e ON d.department_id = e.department_id
GROUP BY d.department_name;
03

窗口函数

排名问题

题目5:查询每个部门工资排名前3的员工

表结构:员工表(Employees)

  • employee_id
  • department_id
  • salary

解题思路:使用窗口函数ROW_NUMBER()进行分组排名。

SELECT employee_id, department_id, salary
FROM (
    SELECT employee_id, department_id, salary,
           ROW_NUMBER() OVER(PARTITION BY department_id ORDER BY salary DESC) as rn
    FROM Employees
) tmp
WHERE rn <= 3;

累计计算

题目6:计算用户每月的累计访问次数

表结构:用户访问表(UserVisits)

  • userid
  • month
  • visits

解题思路:使用窗口函数SUM()进行累计计算。

SELECT userid, month, visits,
       SUM(visits) OVER(PARTITION BY userid ORDER BY month) as cumulative_visits
FROM UserVisits;
04

综合应用

题目7:查找连续7天登录的用户

表结构:登录表(Logins)

  • Uid
  • dt
  • login_status(1表示登录成功,0表示异常)

解题思路:使用窗口函数LAG()检查连续登录情况。

WITH LoginStatus AS (
    SELECT Uid, dt,
           CASE
               WHEN login_status = 1 AND
                    LAG(login_status, 1) OVER(PARTITION BY Uid ORDER BY dt) = 1 AND
                    LAG(login_status, 2) OVER(PARTITION BY Uid ORDER BY dt) = 1 AND
                    LAG(login_status, 3) OVER(PARTITION BY Uid ORDER BY dt) = 1 AND
                    LAG(login_status, 4) OVER(PARTITION BY Uid ORDER BY dt) = 1 AND
                    LAG(login_status, 5) OVER(PARTITION BY Uid ORDER BY dt) = 1 AND
                    LAG(login_status, 6) OVER(PARTITION BY Uid ORDER BY dt) = 1
               THEN 1
               ELSE 0
           END as is_seven_days
    FROM Logins
)
SELECT Uid, COUNT(DISTINCT dt) as num_seven_days
FROM LoginStatus
WHERE is_seven_days = 1
GROUP BY Uid;

通过以上题目,我们可以看到SQL面试题从基础查询到复杂分析的难度递进。掌握这些题目不仅能帮助你应对面试,更能提升你的SQL实战能力。建议在学习过程中多加练习,理解每个语句的执行逻辑,这样才能在面试中游刃有余。

最后,祝大家面试顺利,拿到心仪的Offer!

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号