Подзапросы и коррелированные запросы.


        Подзапросы

    С помощью SQL можно создавать вложенные запросы. Обычно, внутренний запрос генерирует значение которое проверяется в условии для  внешнего запроса.
    Чтобы оценить внешний( основной ) запрос, SQL сначала должен оценить внутренний запрос (или подзапрос) внутри предложения WHERE. Результат внутреннего запроса помещается в основной запрос вместо подзапроса.

    SELECT icodCust
            FROM sales!Customer
                    WHERE yCredit <
                            ( SELECT AVG ( yCredit) FROM Customer) ;



        Коррелированный запрос

    Запрос называется коррелированным, если выборка данных осуществляется по результатам другой выборки.
    При использовании подзапросов в SQL можно обратиться к внутреннему запросу таблицы в предложении внешнего запроса FROM , сформировав коррелированный (или соотнесенный) подзапрос. В этом случае подзапрос выполняется неоднократно, по одному разу для каждой строки таблицы основного запроса.

    SELECT icodeCust, yCredit, cCity
            FROM sales!Customer Cust_X
            WHERE yCredit >=
                ( SELECT AVG (yCredit) FROM sales!Customer Cust_Y
                        WHERE Cust_Y.cCity = Cust_X.cCity) ;
            Cust_X, Cust_Y - псевдонимы таблицы.
 
    Так как значение в поле cCity внешнего запроса меняется,  внутренний запрос должен выполняться отдельно для каждой строки внешнего запроса.
    Рассмотрим процедуру оценки, которую производит коррелированный запрос:
    1. Выбрать строку из таблицы, заданной во внешнем запросе. Это будет текущая строка.
    2. Сохранить значения из этой строки в псевдониме с именем в предложении FROM внешнего запроса.
    3. Выполнить подзапрос. Везде, где псевдоним данный для внешнего запроса найден (в этом случае Cust_X),  использовать значение для текущей строки. Использование значения из строки внешнего запроса в подзапросе называется внешней ссылкой.
    4. Оценить условие внешнего запроса на основе результатов  подзапроса выполняемого в шаге 3. (Определяется будет ли текущая строка выводится).
    5. Повторить  процедуру для следующей строки таблицы,  и так далее пока все строки таблицы не будут проверены.