如何使用MySQL子查询查询部门1中与部门3职位相同的员工?附子查询基础讲解
解决你的子查询问题 & 子查询基础讲解
Hey there! Let's work through your problem and get you comfortable with subqueries in MySQL.
首先,正确的SQL语句
要得到你预期的结果,我们需要先找出部门3(deptno=3)里所有存在的职位,再用这个列表过滤部门1(deptno=1)的员工。对应的SQL是:
SELECT ename, job FROM emp WHERE deptno = 1 AND job IN (SELECT DISTINCT job FROM emp WHERE deptno = 3);
运行这个语句就会返回:
ename job Clark Manager Miller Clerk
什么是子查询?
子查询就是嵌套在另一个SQL语句(主查询)里的小查询,它会优先执行,把计算出的结果传递给主查询作为过滤条件或数据源。你可以把它理解成先算一个“中间结果集”,再用这个结果集来完成主查询的需求。
比如在上面的语句里,(SELECT DISTINCT job FROM emp WHERE deptno = 3)就是子查询:它先从emp表中提取部门3的所有职位(用DISTINCT去掉重复的职位,让结果更简洁高效),然后主查询用IN关键字,筛选出部门1里职位在这个子查询结果中的员工。
分析你原来的语句问题
你写的语句:
select ename, job from emp where deptno = (select deptno from emp where deptno = 1);
这里的子查询select deptno from emp where deptno = 1返回的是所有部门1员工的deptno值(全是1),主查询的条件就变成了deptno = 1——这只会把部门1的所有员工都查出来,完全没涉及职位的过滤,所以得不到你想要的结果。
有效使用子查询的小技巧
- 明确子查询的返回类型:如果子查询返回单个值,用
=、>等比较运算符;如果返回多个值,一定要用IN、ANY或ALL(比如你的场景就是多值,所以用IN)。 - 先单独测试子查询:把嵌套的子查询单独拿出来运行,看看结果是不是你预期的中间数据,这能快速排查逻辑错误。
- 按需用DISTINCT:如果子查询会返回重复数据,加上
DISTINCT可以减少结果集大小,提升查询效率。 - 注意执行顺序:子查询总是先于主查询执行,所以要确保子查询的逻辑是为后续主查询服务的。
内容的提问来源于stack exchange,提问作者steeplearningcurve
相关产品推荐
相关产品推荐

