未使用IN()时子查询返回多行却无报错?该SQL的执行逻辑是怎样的
问题原因解答
你的误解来自于混淆了内层子查询的返回结果和外层整体查询的返回结果,实际上你的内层子查询不可能返回两行,具体逻辑如下:
- 首先明确聚合函数的返回规则:
MIN()属于SQL聚合函数,只要内层子查询没有搭配GROUP BY子句,所有聚合函数都会将整张表的行作为同一个分组计算,最终仅返回单行单个计算结果,不管表中有多少行符合原始数据筛选条件,聚合后的结果永远只有1行,所以不会触发「单行子查询返回多行」的报错。 - 你如果看到最终执行结果有2行,那是外层查询返回的结果:如果表中有2个员工的
ename值刚好是全表最小的取值,外层的WHERE ename = 最小ename逻辑自然会匹配到这2条记录返回,这和内层子查询的返回行数完全无关。 - 只有当
=右侧的子查询本身返回超过1行时才会触发报错,比如你将内层子查询改为SELECT ename FROM emp WHERE deptno = 20,如果部门20有超过1个员工,此时子查询直接返回多行原始ename值,没有经过聚合运算,才会抛出你预期的错误。
内容的提问来源于stack exchange,提问作者Wait What
相关产品推荐
相关产品推荐

