Page 142 - 4636
P. 142
Значення, отримані з підзапитів, можна використовувати у всіх стандартних операціях
порівняння. Доступні також деякі спеціальні операції порівняння для підзапиту.
2 Підзапити і операції
Існують п'ять спеціальних операцій підзапитів. Чотири з них використовуються в звичайних
підзапитах, і одна (EXISTS) - як правило, тільки в пов'язаних (correlated) підзапитах, які
розглядаються в наступній лекції. Чотири звичайних операції підзапиту описані в табл. 7.4.
Таблиця 7.4 - Операції підзапиту в MySQL
Назва Приклад синтаксису Опис
Повертає true, якщо
SELECT cl FROM tl
порівняння істинно для
ANY WHERE cl > ANY (SELECT
якого-небудь рядка в
cl FROM t2);
підзапиті.
SELECT cl FROM tl
IN WHERE cl IN (SELECT cl Еквівалент=ANY.
from t2);
SELECT cl FROM tl
Інша назва any; деяким
SOME WHERE cl > SOME
подобається більше.
(SELECT cl FROM t2) ;
SELECT Cl FROM tl Повертає true, якщо
ALL WHERE cl > ALL (SELECT cl порівняння істинне для всіх
from t2); рядків у підзапиті.
Кожна з цих операцій може бути тільки після операції порівняння, за винятком IN, яка має
свою операцію порівняння (=), “згорнуту всередині”, якщо можна так висловитися.
3 Пов'язані підзапити
Пов'язані підзапити більш складні в розумінні. У них елементи, отримані в зовнішньому
запиті, використовуються у внутрішньому запиті. Наприклад:
select isbn, title
from books
where not exists(select * from order_items where
order_iterns.isbn=books.isbn);
У наведеному запиті демонструється застосування як пов'язаних підзапитів, так і
спеціальної операції підзапиту EXISTS. Запит повертає всі книги, які ніколи не були замовлені.
(Вище у лекції ви отримували цю інформацію з допомогою лівого з'єднання.) Зверніть увагу, що
внутрішній запит включає таблицю order_iterns тільки в список FROM, однак посилається на
books.isbn. Іншими словами, внутрішній запит посилається на дані зовнішнього запиту. Це і є
визначення пов'язаного підзапиту: ви шукаєте рядки внутрішнього запиту, які збігаються (або, як
у розглянутому прикладі, не збігаються) з рядками зовнішнього запиту.
Операція EXISTS (існує) повертає true, якщо підзапит містить хоч один рядок, який
збігається. Відповідно, операція NOTEXISTS (не існує) повертає true, якщо підзапит не містить
рядків, які співпадають.
139