You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 12:52:28