- •Базы данных Лабораторная работа № 4 Подчиненные запросы
- •Пример 1. Использование подзапроса с проверкой на равенство
- •Пример 2. Использование подзапросов с групповыми функциями
- •Пример 3. Вложенные подзапросы с использованием предложения in
- •Ключевые слова any и all
- •Пример 4. Использование ключевых слов any или some
- •Пример 5. Использование ключевого слова all
- •Предложения exists и not exist
- •Пример 6. Использование ключевого слова exists
Предложения exists и not exist
Ключевые слова EXISTS и NOT EXISTS предназначены для использования только совместно с подзапросами. Результат их обработки представляет собой логическое значение TRUE или FALSE. Для ключевого слова EXISTS результат равен TRUE в том и только в том случае, если в возвращаемой подзапросом результирующей таблице присутствует хотя бы одна строка. Если результирующая таблица подзапроса пуста, результатом обработки ключевого слова EXISTS будет значение FALSE. Для ключевого слова NOT EXISTS используются правила обработки, обратные по отношению к ключевому слову EXISTS. Поскольку по ключевым словам EXISTS и NOT EXISTS проверяется лишь наличие строк в результирующей таблице подзапроса, то эта таблица может содержать произвольное количество столбцов.
Пример 6. Использование ключевого слова exists
Перечислите всех сотрудников компании, которые работают в ее лондонском отделении.
SELECT full_name FROM employee e WHERE EXISTS (SELECT * FROM department d WHERE d.dept_no = e.dept_no AND location = 'London')
FULL_NAME
=================
Bennet, Ann
Reeves, Roger
Stansbury, Willie
Этот запрос можно перефразировать следующим образом: "Выбрать сведения обо всех работниках, для которых в таблице employee существует запись, содержащая тот же номер отделения dept_no, который указан для данного работника, и в которой значение столбца location равно 'London'. Проверка необходимости включения сведений о работнике в результирующую таблицу заключается в анализе существования подобной записи. Если она существует, результат обработки ключевого слова EXISTS будет равен TRUE.
Обратите внимание, что первая часть условия поиска, d.dept_no = e.dept_no, необходима для получения гарантий того, что для каждого работника будет анализироваться корректная строка данных об отделении компании. Если опустить это условие, то в результирующую таблицу запроса будут помещены сведения обо всех работниках компании, поскольку подзапрос SELECT * FROM department WHERE city='London' всегда будет возвращать не менее одной строки и проверка существования в каждом случае будет давать значение TRUE. В результате запрос будет иметь следующий вид:
SELECT full_name FROM employee e WHERE EXISTS (SELECT * FROM department d WHERE true)
Этот инструкция эквивалентна следующей:
SELECT full_name FROM employee
