В операторе SELECT из внутреннего подзапроса можно ссылаться на столбцы внешнего запроса, указанного во фразе SELECT. Такой подзапрос выполняется для каждой строки таблицы, определяя условие ее вхождения в формируемый результирующий набор.
Например:
SELECT * from tbl1 t1
WHERE f2 IN (SELECT f2 FROM tbl2 t2
WHERE t1.f3=t2.f3);
В данном случае для каждой строки таблицы tbl1 будет проверяться условие, что значение поля f2 совпадает со значением строки таблицы tbl2, где значение поля f3 равно значению поля f3 внешней таблицы (tbl1). Это простейший пример коррелированного подзапроса.
Очень часто требуется, чтобы подзапрос использовал те же данные, что и внешняя таблица. В этом случае обязательно применение алиасов.
Например:
SELECT * from tbl1 t_out
WHERE f2< (SELECT AVG(f2) FROM tbl1 t_in
WHERE t_out.f1= t_in.f1);
В случае коррелированного подзапроса во фразе HAVING можно использовать только агрегирующие функции, так как каждый раз на момент выполнения подзапроса в качестве проверяемой строки, к значениям которой имеет доступ подзапрос, выступает результат группирования строк на основе агрегирующих функций основного запроса.
Например:
SELECT f1, COUNT(*), SUM(f2) from tbl1 t1
GROUP BY f1
HAVING SUM(f2)> (SELECT MIN(f2)*4 FROM tbl1 t1_in
WHERE t1.f1=t1_in.f1);