在数据库的世界里,SQL(结构化查询语言)是与数据库进行交互的主要工具。在面试中,SQL面试题常常考察应试者对SQL的理解和实际应用能力。本文将介绍一个简单但常见的SQL面试题,并给出详细的解答和代码示例。
面试题:查找每个部门的最高工资
假设我们有一个名为 employees
的表,其中包含员工的相关信息,包括员工ID、姓名、部门ID和工资。表结构如下:
CREATE TABLE employees (
employee_id INT PRIMARY KEY,
employee_name VARCHAR(100),
department_id INT,
salary DECIMAL(10, 2)
);
假设该表中的数据如下:
| employee_id | employee_name | department_id | salary | |-------------|---------------|---------------|---------| | 1 | Alice | 101 | 7000.00 | | 2 | Bob | 101 | 8000.00 | | 3 | Charlie | 102 | 6000.00 | | 4 | David | 102 | 7500.00 | | 5 | Eva | 103 | 9000.00 | | 6 | Frank | 101 | 6000.00 | | 7 | Grace | 103 | 5000.00 |
我们的任务是查找每个部门的最高工资和相应的员工名称。
解题思路
这个问题可以通过使用 GROUP BY
子句和聚合函数 MAX()
来实现。同时,为了获取最高工资对应的员工名称,可以使用 JOIN
语句或者子查询。以下是实现逻辑的步骤:
- 使用
GROUP BY
按照department_id
分组,并获取每个部门的最高工资。 - 根据每个部门的最高工资去查找对应的员工名称。
SQL查询示例
以下是采用子查询的方法实现的 SQL 查询示例:
SELECT e.department_id, e.employee_name, e.salary
FROM employees e
WHERE e.salary = (
SELECT MAX(inner_e.salary)
FROM employees inner_e
WHERE inner_e.department_id = e.department_id
);
解析
在这个查询中,我们使用了一个子查询来获取每个部门的最高工资。子查询的逻辑如下:
- 我们在子查询中选择
MAX(inner_e.salary)
,并根据inner_e.department_id
来限制条件,确保我们获取的是当前外部查询e.department_id
所对应部门的最高工资。 - 外部查询则用于从
employees
表中获取这些最高工资的对应员工名称。
通过执行上述查询,我们将能得到每个部门的最高工资和该员工的名称。
结果
执行后的结果将会是类似如下的输出:
| department_id | employee_name | salary | |----------------|---------------|---------| | 101 | Bob | 8000.00 | | 102 | David | 7500.00 | | 103 | Eva | 9000.00 |
总结
这个SQL面试题考察了面试者对 SQL 基础知识的掌握,包括聚合函数、分组、子查询等。掌握这些基本操作对于数据库开发和管理至关重要。在面试中,除了要能写出正确的 SQL 语句,还需注意代码的可读性和优化,能够清晰地表达思路也是一个优秀开发者的重要标志。通过不断的练习和学习,我们可以在SQL面试中表现得更加自信和从容。