Это называется коррелированным подзапросом , поскольку результат подзапроса потенциально различен для каждой строки внешнего запроса.
Когда MySQL выполняет запрос, вы можете подумать это как foreach l oop над коллекцией. Например, в синтаксисе PHP:
foreach (s_emp as e1) {
...
}
Он должен запустить подзапрос для каждой строки внешнего запроса, прежде чем он сможет оценить сравнение <
. Это станет довольно дорогим, поскольку количество рядов увеличивается. Если таблица имеет N строк, она будет выполнять подзапрос N раз, даже если для deptno есть только несколько отдельных значений! MySQL не достаточно умен, чтобы запомнить результат после выполнения подзапроса для того же значения deptno.
Вместо этого вы можете получить результат таким способом, который вычислит max (sal) для всех deptnos, и сохраните эти результаты во временной таблице.
select max(e1.sal), e1.deptno
from s_emp e1
join (select deptno, max(sal) as max_sal from s_emp group by deptno) as e2
on e1.deptno = e2.deptno
where e1.sal < e2.max_sal
group by e1.deptno
Цель этого запроса, по-видимому, состоит в том, чтобы вернуть вторую наивысшую зарплату на отдел, верно?
Вот еще одно решение с использованием оконных функций в MySQL 8.0:
select deptno, sal
from (
select deptno, sal, dense_rank() over (partition by deptno order by sal desc) as dr
from s_emp
) as e1
where dr = 2