介绍
在本项目中,你将学习如何使用子查询从人事数据库中的员工(emp)表和部门(dept)表中检索相关信息。你将练习编写复杂的 SQL 查询,以访问和分析来自多个表的数据。
👀 预览

🎯 任务
在本项目中,你将学习:
- 如何启动 MySQL 服务器并导入人事数据库
- 如何使用子查询找到薪资最高的员工
- 如何计算特定部门的员工占整个公司员工的比例
- 如何使用子查询检索在特定地点工作的所有员工
- 如何找到薪资超过其所在部门平均薪资的员工
🏆 成果
完成本项目后,你将能够:
- 理解 SQL 中子查询的概念和用法
- 编写结合多个表数据的复杂 SQL 查询
- 使用子查询从数据库中分析并提取有意义的见解
- 在实际的现实场景中展示你的 SQL 技能
启动 MySQL 并导入数据库
在本步骤中,你将学习如何启动 MySQL 服务器并导入人事数据库。
- 使用
sudo命令且不设置任何密码来启动 MySQL 服务器:
sudo service mysql start
- 进入 MySQL 提示符:
sudo mysql
- 将
personnel.sql文件中的数据导入到 MySQL 数据库:
SOURCE /home/labex/project/personnel.sql;
这将创建personnel数据库,并使用必要的表和数据进行填充。
查询薪资最高的员工
在本步骤中,你将学习如何使用子查询来检索薪资最高的员工的姓名。
- 在
/home/labex/project目录下创建一个名为subquery.sql的新文件。 - 在
subquery.sql文件中,添加以下 SQL 查询:
-- 查询以检索薪资最高的员工
SELECT ename AS `姓名` FROM emp WHERE sal = (SELECT MAX(sal) FROM emp);
此查询首先使用子查询找到emp表中的最高薪资,然后选择具有该最高薪资的员工的ename(员工姓名)。
计算 10 号部门员工的比例
在本步骤中,你将学习如何使用子查询来计算 10 号部门的员工占整个公司员工的比例。
- 在
subquery.sql文件中,添加以下 SQL 查询:
-- 查询以计算 10 号部门员工的比例
SELECT d.dname AS 部门, COUNT(e.empno) / (SELECT COUNT(empno) FROM emp) AS 比例
FROM emp e
JOIN dept d ON e.deptno = d.deptno
WHERE d.deptno = 10;
此查询首先通过连接emp表和dept表来计算 10 号部门的员工数量。然后,它将这个数量除以emp表中的员工总数(使用子查询)以计算比例。
检索在纽约工作的员工
在本步骤中,你将学习如何使用子查询来检索所有在纽约工作的员工。
- 在
subquery.sql文件中,添加以下 SQL 查询:
-- 查询以检索所有在纽约工作的员工
SELECT e.*
FROM emp e
JOIN dept d ON e.deptno = d.deptno
WHERE d.loc = 'NEW YORK';
此查询通过连接emp表和dept表来检索其部门位于纽约的员工。
检索薪资超过部门平均水平的员工
在本步骤中,你将学习如何使用子查询来检索薪资高于其所在部门平均薪资的员工。
- 在
subquery.sql文件中,添加以下 SQL 查询:
-- 查询以检索薪资高于其所在部门平均薪资的员工
SELECT e.* FROM emp e
JOIN (SELECT deptno, AVG(sal) AS avg_sal FROM emp GROUP BY deptno) AS avg
ON e.deptno = avg.deptno
WHERE e.sal > avg.avg_sal;
此查询首先使用子查询计算每个部门的平均薪资。然后将此子查询与emp表进行连接,以选择薪资高于其所在部门平均薪资的员工。
完成这些步骤后,你的subquery.sql文件应包含满足项目要求的所有必要 SQL 查询。
- 保存文件。
- 在 MySQL 提示符下,运行以下命令以执行
subquery.sql脚本:
SOURCE /home/labex/project/subquery.sql;
你应该会看到以下输出:

总结
恭喜你!你已经完成了这个项目。你可以在 LabEx 中练习更多实验来提升你的技能。
