В способі 89).а). в результати запиту будуть включені лише ті рядки таблиці Т1, для яких не існує результатів підлеглого запиту (тобто, для яких підлеглий запит повертає порожню таблицю).
В способі 89).б). в результати запиту увійдуть ті рядки таблиці Т1, для яких значення Т1. не входить у множину результатів підлеглого запиту.
Якщо підлеглий запит 1) повертає не порожню таблицю, або 2) результат не містить значення NULL, або 3) значення Т1. не є значенням NULL – то способи 89).а). та 89).б). – еквівалентні.
У всіх інших випадках – тобто, коли результат Т2. ,підлеглого запита складається із значення NULL, або значення Т1. є значенням NULL – то такий рядок не увійде в результати запиту 89) б), але він буде включений в результати запиту 89).а)!
- тому, в загальному випадку, запити 89).а). та 89).б). – не еквівалентні.
(Вони приводять до однакових результатів лише за умови, що ні стовпчик Т1. , ні стовпчик Т2.
гарантовано не містить значення NULL і таблиця Т2 – не порожня).
13.2.3.2. Зв’язок між перевіркою „для всіх” та перевіркою на не існування (NOT EXISTS)
Clienty
Kod_Clienta
Prizv
. . .
1 : N (=)
Zamovlennia
No_ Zamovlennia
. . .
Client
. . .
Tovar
Vyrobnyk
. . .
Tovary
Kod_Tovaru
Kod_Vyrobnyka
. . .
90). Вивести список клієнтів, які замовили весь набір наявних на складі товарів (тобто всі види товарів, які є на складі).
Це завдання можна переформулювати наступним чином.
90). Вивести список клієнтів, таких що для всіх товарів існує замовлення даного клієнта на цей товар.
Позначимо:
- множина всіх клієнтів;
- множина всіх товарів;
- множина всіх замовлень;
с - деякий клієнт,
t - деякий товар,
z ct - замовлення клієнта с на товар t
Фактично, завдання 90) полягає в побудові множини
Відомо, що предикат „для всіх ... існує ...” еквівалентний предикату „не існує ... не існує ...”
- тому завдання 90) можна записати таким чином:
90). а). Вивести список клієнтів, таких що не існує товару, для якого не існує замовлення даного клієнта на цей товар.
Використовуючи наведену систему позначень – потрібно побудувати множину
SQL не має перевірки „для всіх”. Для реалізації такої перевірки потрібно переформульовувати завдання за допомогою перевірки „не існує” – так, як це зроблено в прикладі 90). Тоді такий запит легко записується засобами SQL: