Головний запит по черзі перевіряє кожний рядок таблиці Filii. Підлеглий запит знаходить всіх працівників „біжучої” філії і повертає стовпчик з фактичними об’ємами продаж для кожного працівника. Секція WHERE головного запиту обчислює 50% від плану продаж філії і порівнює це значення зі всіма об’ємами фактичних продаж, отриманих в результаті виконання підлеглого запиту. Якщо всі об’єми фактичних продаж працівників перевищують значення 50% від плану філії, то перевірка < ALL повертає значення TRUE і дана філія включається в таблицю результатів запиту. Якщо – ні, то така філія не попадає в таблицю результатів.
Перевірка ALL, як і перевірка ANY, включає в себе не одне порівняння, а кілька. Якщо прочитати умову порівняння дещо по-іншому, то це допоможе зрозуміти зміст перевірки і дозволить уникнути помилок.
Наприклад, перевірку
WHERE X < ALL (SELECT Y . . .)
слід читати не як
„де Х менше, чим всі вибрані Y . . .”
а так:
„де для всіх Y: Х менше, чим Y . . .”
Тоді запит із прикладу 94 можна переформулювати таким чином:
94). Вивести список філій, в яких для всіх працівників: 50% плану філії менше, чим фактичний об’єм продаж кожного працівника цієї філії.
Якщо підлеглий запит в перевірці ALL не повертає жодного рядка, або якщо стовпчик його результатів містить значення NULL, то в різних СУБД перевірка ALL виконується по-різному. Стандарт SQL задає правила, які визначають результати перевірки ALL:
1) Якщо підлеглий запит повертає порожній стовпчик, то перевірка ALL дає результат TRUE (вважається, що умова порівняння виконується, навіть якщо результати підлеглого запиту відсутні; тобто виконується для всіх рядків => якщо рядків нема → TRUE.
2) Якщо операція порівняння має значення TRUE для кожного значення в стовпчику результатів підлеглого запиту, то перевірка ALL дає результат TRUE (умова порівняння виконується для кожного значення, отримано підлеглим запитом).
3) Якщо операція порівняння має значення FALSE для якогось (хоча би одного) значення в стовпчику результатів підлеглого запиту, то перевірка ALL дає результат FALSE (умова порівняння виконується не для кожного значення, отримано підлеглим запитом).
4) Якщо операція порівняння не має значення FALSE для жодного значення в стовпчику результатів підлеглого запиту, але в цьому стовпчику є одне або кілька значень NULL, то перевірка ALL дає результат NULL (не можна визначити, чи для всіх значень, отриманих підлеглим запитом, справедлива умова порівняння: можливо – для всіх, а можливо – і ні, - все залежить від „справжніх” значень невідомих чи відсутніх даних).
Ті самі помилки, що виникають коли перевірка ANY містить операцію порівняння „не дорівнює” <>, можуть бути і в перевірці ALL.
Щоб уникнути таких помилок, слід перевірку ALL перетворити в еквівалентну перевірку на існування (EXISTS) за допомогою перенесення операції порівняння в підлеглий запит, - подібно до того, як це робилося для перевірки ANY:
Завдання із прикладу
93). Вивести прізвища і вік всіх працівників, які не керують філіями, можна переформулювати таким чином:
93’). Вивести прізвище і вік працівників – таких, що для всіх філій: код керівника даної філії відрізняється від коду цього працівника і розв’язати за допомогою перевірки ALL: