用于数据分析的 SQL 子查询

SQLSQLBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

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

👀 预览

SQL查询预览图像

🎯 任务

在本项目中,你将学习:

  • 如何启动MySQL服务器并导入人事数据库
  • 如何使用子查询找到薪资最高的员工
  • 如何计算特定部门的员工占整个公司员工的比例
  • 如何使用子查询检索在特定地点工作的所有员工
  • 如何找到薪资超过其所在部门平均薪资的员工

🏆 成果

完成本项目后,你将能够:

  • 理解SQL中子查询的概念和用法
  • 编写结合多个表数据的复杂SQL查询
  • 使用子查询从数据库中分析并提取有意义的见解
  • 在实际的现实场景中展示你的SQL技能

启动MySQL并导入数据库

在本步骤中,你将学习如何启动MySQL服务器并导入人事数据库。

  1. 使用sudo命令且不设置任何密码来启动MySQL服务器:
sudo service mysql start
  1. 进入MySQL提示符:
sudo mysql
  1. personnel.sql文件中的数据导入到MySQL数据库:
SOURCE /home/labex/project/personnel.sql;

这将创建personnel数据库,并使用必要的表和数据进行填充。

查询薪资最高的员工

在本步骤中,你将学习如何使用子查询来检索薪资最高的员工的姓名。

  1. /home/labex/project目录下创建一个名为subquery.sql的新文件。
  2. subquery.sql文件中,添加以下SQL查询:
-- 查询以检索薪资最高的员工
SELECT ename AS `姓名` FROM emp WHERE sal = (SELECT MAX(sal) FROM emp);

此查询首先使用子查询找到emp表中的最高薪资,然后选择具有该最高薪资的员工的ename(员工姓名)。

计算10号部门员工的比例

在本步骤中,你将学习如何使用子查询来计算10号部门的员工占整个公司员工的比例。

  1. 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表中的员工总数(使用子查询)以计算比例。

检索在纽约工作的员工

在本步骤中,你将学习如何使用子查询来检索所有在纽约工作的员工。

  1. subquery.sql文件中,添加以下SQL查询:
-- 查询以检索所有在纽约工作的员工
SELECT e.*
FROM emp e
JOIN dept d ON e.deptno = d.deptno
WHERE d.loc = 'NEW YORK';

此查询通过连接emp表和dept表来检索其部门位于纽约的员工。

检索薪资超过部门平均水平的员工

在本步骤中,你将学习如何使用子查询来检索薪资高于其所在部门平均薪资的员工。

  1. 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查询。

  1. 保存文件。
  2. 在MySQL提示符下,运行以下命令以执行subquery.sql脚本:
SOURCE /home/labex/project/subquery.sql;

你应该会看到以下输出:

SQL查询执行结果
✨ 查看解决方案并练习

总结

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