Підзапити, повертають кілька значень

Ця група включає підзапити, що починаються з IN, NOT IN або оператора порівняння з ключовими словами ANY або ALL.

Підзапити, що починаються з IN і NOT IN

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

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

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

Отримати список клієнтів з Сіетла, які уклали договір на оренду обладнання (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')

Зверніть увагу на допустимість використання об'єднання і декількох умов в пропозицію 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, умова порівняння вважається виконаним тільки в тому випадку, якщо воно виконується для всіх значень в результуючому стовпці підзапиту.

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, то умова порівняння буде вважатися виконаним, якщо воно задовольняється хоча б для будь-якого (одного або декількох) значення в результуючому стовпці підзапиту.

SQL:
SELECT contract_id, contract_date
FROM tbl_contract WHERE contract_date SELECT contract_date
FROM tbl_contract JOIN tbl_serviceON tbl_contract.service_id = tbl_service.service_id
WHERE service = 'Equipment rental')

Наведений запит знаходить договори, укладені раніше, ніж було укладено перший договір на обслуговування.

Якщо внутрішній підзапит, що починається з ALL або ANY, повертає порожнє значення, вважається, що запит в цілому завершився невдало. В цьому випадку ви не отримаєте ніяких результатів, оскільки неможливо виконати порівняння зі значенням NULL.

Схожі статті