Подзапросы, возвращающие несколько значений

Эта группа включает подзапросы, начинающиеся с IN, NOT IN или оператора сравнения с ключевыми словами ANY или ALL.

Подзапросы, начинающиеся с IN и NOT IN

Результатом выполнения подзапроса, начинающиеся с ключевых слов IN и NOT IN, является список, включающий от нуля до нескольких значений. После того как подзапрос возвратит результаты, к их обработке приступит внешний запрос.

Список выбора внутреннего подзапроса, может включать только одно выражение или имя столбца.

Столбец, имя которого вы указываете в предложении WHERE внешнего оператора, должен быть совместимым для сравнения со столбцом, имя которого вы указываете в списке выбора подзапроса.

IDevice IconПример
Получить список клиентов из Сиэтла, заключивших договор на аренду оборудования (Equipment rental).

SQL:
SELECT lastname, name, region
FROM tbl_clients
WHERE region = 'Seattle' AND client_id IN (
SELECT client_id
FROM tbl_contract
JOIN tbl_service ON tbl_contract.service_id=tbl_service.service_id
WHERE service = 'Equipment rental')

Результат:

lastname name region
Stolz Barbara Seattle
Perez Linda Seattle
Haines Elsie Seattle
Varrik Kaarel Seattle
Donegan Janet Seattle
Card Richard Seattle
Jones Jeffrey Seattle
Green Jonas Seattle
Patterson William Seattle

Обратите внимание на допустимость использования объединения и нескольких условий в предложение WHERE как во внутреннем, так и во внешнем запросе.


Получить список клиентов из Сиэтла, заключивших договор на аренду оборудования (пример, обратный приведенному выше).

SQL:
SELECT lastname, name, region
FROM tbl_clients
WHERE region = 'Seattle' AND client_id NOT IN (
SELECT client_id
FROM tbl_contract
JOIN tbl_service ON tbl_contract.service_id=tbl_service`service_id
WHERE service = 'Equipment rental')


Подзапросы, начинающиеся с операторов сравнения и включающие ключевые слова ANY или ALL

В другом виде подзапросов, которые не возвращают или возвращают несколько строк, используется оператор сравнения, модифицированный ключевыми словами ANY или ALL.

Если подзапросу будет предшествовать ключевое слово ALL, условие сравнения считается выполненным только в том случае, если оно выполняется для всех значений в результирующем столбце подзапроса.

IDevice IconПример

SQL:
SELECT contract_id, contract_date
FROM tbl_contract
WHERE contract_date > ALL (
SELECT contract_date
FROM tbl_contract JOIN tbl_service ON tbl_contract.service_id=tbl_service.service_id
WHERE service = 'Equipment rental')

Выполнение запроса происходит в 2 этапа. Сначала внутренний запрос выбирает список дат, когда были заключены договора на аренду оборудования. Внешний запрос находит наибольшее значение в списке дат и для каждого договора в таблице tbl_contract определяет не содержится ли в поле contract_date большая дата.

Таким образом, мы получаем список договоров, заключенных после всех договоров на аренду оборудования.


Оператор ALL, как правило, эффективно используется с неравенствами, а не с равенствами, поскольку значение "равно всем", которое должно получиться в этом случае в результате выполнения подзапроса, может иметь место, только если все результаты идентичны.

В SQL выражение < > ALL реально означает не равно ни одному из результатов подзапроса.

Если тексту подзапроса предшествует ключевое слово ANY, то условие сравнения будет считаться выполненным, если оно удовлетворяется хотя бы для какого-либо (одного или нескольких) значения в результирующем столбце подзапроса.

IDevice IconПример
SQL:
SELECT contract_id, contract_date
FROM tbl_contract WHERE contract_date < ANY (
SELECT contract_date
FROM tbl_contract JOIN tbl_serviceON tbl_contract.service_id=tbl_service.service_id
WHERE service = 'Equipment rental')

Приведенный запрос находит договора, заключенные раньше, чем был заключен первый договор на обслуживание.


Если внутренний подзапрос, начинающийся с ALL или ANY, возвращает пустое значение, считается, что запрос в целом завершился неудачно. В этом случае вы не получите никаких результатов, поскольку невозможно выполнить сравнение со значением NULL.