在数据类岗位招聘过程中,经常会考察求职者的SQL能力,这里整理了3个常考的SQL数据分析题,按照由简单到复杂排序,一起来测试一下你掌握了么?
PS:以下SQL代码在MySQL8.0及其以上版本运行。
题目1:找出每个部门工资第二高的员工
现有一张公司员工信息表employee,表中包含如下4个字段。
- employee_id(员工ID):VARCHAR。
- employee_name(员工姓名):VARCHAR。
- employee_salary(员工薪资):INT。
- department(员工所属部门ID):VARCHAR。
employee表的数据如下表所示。
还有一张部门信息表department,表中包含如下两个字段。
- department_id(部门ID):VARCHAR。
- department_name(部门名称):VARCHAR。
department表的数据如下表所示。
数据导入的代码如下:
DROP TABLE IF EXISTS employee;
CREATE TABLE employee(
employee_id VARCHAR(8),
employee_name VARCHAR(8),
employee_salary INT(8),
department VARCHAR(8)
)
ENGINE = InnoDB
DEFAULT CHARSET = utf8;
INSERT INTO
employee (employee_id,employee_name,employee_salary,department)
VALUE ('a001','Bob',7000,'b1')
,('a002','Jack',9000,'b1')
,('a003','Alice',8000,'b2')
,('a004','Ben',5000,'b2')
,('a005','Candy',4000,'b2')
,('a006','Allen',5000,'b2')
,('a007','Linda',10000,'b3');
DROP TABLE IF EXISTS department;
CREATE TABLE department(
department_id VARCHAR(8),
department_name VARCHAR(8)
)
ENGINE = InnoDB
DEFAULT CHARSET = utf8;
INSERT INTO
department (department_id,department_name)
VALUE ('b1','Sales')
,('b2','IT')
,('b3','Product');
问题:查询每个部门薪资第二高的员工信息。
输出内容包括:
- employee_id(员工ID)
- employee_name(员工姓名)
- employee_salary(员工薪资)
- department_id(员工所属部门名称)
结果样例如下图所示。
可供参考的解题思路:使用窗口函数根据部门ID分组,在组内按照员工薪资降序排列并记为ranking,然后将该处理后的表和部门信息表进行内连接,从而把部门名称关联进来,最后在连接后的表上使用ranking=2作为薪资第二高的条件进行WHERE筛选,选择需要的列,即可得到结果。
涉及知识点:窗口函数、子查询、多表连接。
本题的SQL代码如下,供读者参考:
SELECT a.employee_id
,a.employee_name
,a.employee_salary
,b.department_id
FROM
(
SELECT *
,RANK() OVER (PARTITION BY department ORDER BY employee_salary DESC) AS ranking
FROM employee
) AS a
INNER JOIN department AS b
ON a.department = b.department_id
WHERE a.ranking = 2;
题目2:网站登录时间间隔统计
现有一张网站登录情况表login_info,该表记录了所有用户的网站登录信息,包含如下两个字段。
- user_id(用户ID):VARCHAR。
- login_time(用户登录日期):DATE。
login_info表的数据如下表所示。