Коррелированные подзапросы SQL
Коррелированные подзапросы используются для построчной обработки. Каждый подзапрос выполняется один раз для каждой строки внешнего запроса.
Коррелированный подзапрос оценивается один раз для каждой строки, обработанной родительским оператором. Родительский оператор может быть оператором SELECT , UPDATE или DELETE .
ВЫБРАТЬ column1, column2, .... FROM table1 внешний Оператор WHERE column1 (ВЫБРАТЬ столбец1, столбец2 ИЗ table2 ГДЕ expr1 = external.expr2);
Коррелированный подзапрос - это один из способов чтения каждой строки в таблице и сравнения значений в каждой строке со связанными данными. Он используется всякий раз, когда подзапрос должен возвращать другой результат или набор результатов для каждой строки-кандидата, рассматриваемой основным запросом. Другими словами, вы можете использовать коррелированный подзапрос для ответа на вопрос, состоящий из нескольких частей, ответ на который зависит от значения в каждой строке, обрабатываемой родительским оператором.
Вложенные подзапросы и коррелированные подзапросы:
В случае обычного вложенного подзапроса внутренний запрос SELECT запускается первым и выполняется один раз, возвращая значения, которые будут использоваться основным запросом. Однако коррелированный подзапрос выполняется один раз для каждой строки-кандидата, рассматриваемой внешним запросом. Другими словами, внутренний запрос управляется внешним запросом.
ПРИМЕЧАНИЕ. Вы также можете использовать операторы ANY и ALL в коррелированном подзапросе.
ПРИМЕР коррелированных подзапросов: найдите всех сотрудников, которые зарабатывают больше, чем средняя зарплата в их отделе.
ВЫБЕРИТЕ фамилию, зарплату, ID_отдела ОТ сотрудников внешних ГДЕ зарплата> (ВЫБЕРИТЕ СРЕДНЮЮ (зарплату) ОТ сотрудников ГДЕ Department_id = external.department_id);
Другое использование корреляции - ОБНОВЛЕНИЕ и УДАЛЕНИЕ.
СВЯЗАННОЕ ОБНОВЛЕНИЕ:
ОБНОВЛЕНИЕ table1 alias1 УСТАНОВИТЬ столбец = (ВЫБРАТЬ выражение ИЗ table2 псевдоним2 ГДЕ псевдоним1.column = alias2.column);
Используйте коррелированный подзапрос для обновления строк в одной таблице на основе строк из другой таблицы.
СООТВЕТСТВИЕ УДАЛЕНИЮ:
УДАЛИТЬ ИЗ table1 псевдоним1 Оператор WHERE column1 (ВЫБРАТЬ выражение ИЗ table2 псевдоним2 ГДЕ alias1.column = alias2.column);
Используйте коррелированный подзапрос для удаления строк в одной таблице на основе строк из другой таблицы.
С помощью оператора EXISTS:
Оператор EXISTS проверяет наличие строк в наборе результатов подзапроса. Если найдено значение строки подзапроса, условие помечается как ИСТИНА, и поиск не продолжается во внутреннем запросе, а если он не найден, то условие помечается как ЛОЖЬ, и поиск продолжается во внутреннем запросе.
ПРИМЕР использования оператора EXIST:
Найдите сотрудников, которым подчиняется хотя бы один человек.
ВЫБЕРИТЕ employee_id, last_name, job_id, department_id ОТ сотрудников внешних ГДЕ СУЩЕСТВУЕТ (ВЫБЕРИТЕ 'X' ОТ сотрудников ГДЕ manager_id = external.employee_id);
ВЫХОД :
ПРИМЕР использования оператора НЕ СУЩЕСТВУЕТ:
Найдите все отделы, в которых нет сотрудников.
ВЫБРАТЬ идентификатор_отдела, название_отдела ИЗ отделов d ГДЕ НЕ СУЩЕСТВУЕТ (ВЫБЕРИТЕ 'X' ОТ сотрудников ГДЕ Department_id = d.department_id);
ВЫХОД :