Подзапросы, возвращающие несколько значений
Эта группа включает подзапросы, начинающиеся с IN, NOT IN или оператора сравнения с ключевыми словами ANY или ALL.
Подзапросы, начинающиеся с IN и NOT INРезультатом выполнения подзапроса, начинающиеся с ключевых слов IN и NOT IN, является список, включающий от нуля до нескольких значений. После того как подзапрос возвратит результаты, к их обработке приступит внешний запрос.
Список выбора внутреннего подзапроса, может включать только одно выражение или имя столбца.
Столбец, имя которого вы указываете в предложении WHERE внешнего оператора, должен быть совместимым для сравнения со столбцом, имя которого вы указываете в списке выбора подзапроса.
SQL:
SELECT lastname, name, region
FROM tbl_clients
WHERE region = '
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 = '
SELECT client_id
FROM tbl_contract
JOIN tbl_service ON tbl_contract.service_id=tbl_service`service_id
WHERE service = 'Equipment
rental')
В другом виде подзапросов, которые не возвращают или возвращают несколько строк, используется оператор сравнения, модифицированный ключевыми словами ANY или ALL.
Если подзапросу будет предшествовать ключевое слово ALL, условие сравнения считается выполненным только в том случае, если оно выполняется для всех значений в результирующем столбце подзапроса.
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 большая дата.
Таким образом, мы получаем список договоров, заключенных после всех договоров на аренду оборудования.
В SQL выражение < > ALL реально означает не равно ни одному из результатов подзапроса.
Если тексту подзапроса предшествует ключевое слово ANY, то условие сравнения будет считаться выполненным, если оно удовлетворяется хотя бы для какого-либо (одного или нескольких) значения в результирующем столбце подзапроса.
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')
Приведенный запрос находит договора, заключенные раньше, чем был заключен первый договор на обслуживание.