Підзапити у MS Access - Програмні продукти

Стандартом SQL передбачається можливість вкладати запити один в одного, що має велике практичне застосування. Ще раз – одні запити можуть керувати іншими. Щоб розібрати всі тонкощі даного поняття, пропоную спочатку розглянути практичний приклад використання підзапиту, а потім перейти до його теоретичного обговорення.

Наприклад, нас цікавлять книжки видавництва BHV. Для цього, як варіант одного з рішень, ми можемо використовувати підзапит.

Щоб виконати основний (він зовнішній) запит, SQL перш за все повинен виконати підзапит (він же внутрішній запит) у пропозиції WHERE. Таким чином, спочатку виконується підзапит, як би він був єдиним запитом. Інакше кажучи, проглядаються всі записи таблиці Press і вибираються всі записи, котрим значення поля Name='BHV'. Отриманий результат підставляється в основний запит та виконується основний запит. Зрештою, виявляється вибраними записи, що містять інформацію тільки про видавництво BHV.

Тепер поговоримо про обмеження, які накладає використання підзапитів. Підзапит повинен вибирати одне і лише одне поле. Більше того, тип даних цього поля повинен відповідати типу значення, який використовується в основному запиті. Наприклад, запит поданий нижче, повинен призвести до помилки, тому що в ньому на виході підзапит дає кілька значень:

Чому помилка? Вихідні дані містять більше одного рядка (повертається ID для видавництва BHV та Біном). Таким чином, використовуючи підзапити, що ґрунтуються на операторах відносини, необхідно бути впевненим, що кінцевими вихідними даними підзапиту є лише один рядок.

Добре, з перебором (тобто коли на виході з підзапиту виявляється дещозначень) розібралися. А якщо підзапит взагалі не поверне жодних даних, так званий NULL-вихід? Це призведе до того, що підзапит буде оцінений не як TRUE або FALSE, а як значення UNKNOWN. Результат UNKNOWN аналогічний результату FALSE - основний запит не вибере жодного рядка, тобто. теж призведе до виходу NULL. Наприклад, серед видавництв представлених у нашій БД видавництво Agatone відсутнє, таким чином розглянутий варіант з NULL-виходом спрацює і в даному випадку.

Звичайно, виникає питання: "А чи спрацює наступний підзапит?"

Так спрацює, тому що підзапит на виході поверне один рядок.

У деяких випадках можна використовувати DISTINCT для гарантії отримання єдиного значення на виході підзапиту. Тобто, якщо Ви не впевнені в тому, що підзапит поверне лише один рядок, Ви можете підстрахуватися за допомогою DISTINCT з підзапитами.

Наступне обмеження використання підзапитів – це некомутативність або, більш доступними словами, непереміщуваність. Відповідно до угод ANSI це означає, що розглянутий раніше запит

не можна переписати у вигляді

Проте наш "найвізуальніший їх усі СУБД" грає за своїми правилами. На наведений останній запит, Access згенерує такі самі вихідні дані як і на передостанній (правильний) запит.

Трохи про взаємозв'язки агрегатних функцій з підзапитами. Враховуючи той факт, що агрегатні функції на виході мають єдине значення для будь-якої кількості рядків, то, логічно зробити висновок, що будь-яке підзапит, що використовує єдину агрегатну функцію без пропозиції GROUP BY, дає в результаті єдине значення для використання його в основному запиті.

Згадаймо минуле заняття. Зокрема, оператор IN. ЧомуЗгадаймо саме про нього? Справа в тому, що завдяки оператору IN можливо сформулювати підзапити, в результаті виконання яких виходить будь-яке число рядків. Відразу зазначу, що оператори BETWEEN, LIKE, IS NULL до підзапитів застосовувати не можна. Приклад, вибрати імена та прізвища всіх студентів, які брали книги в проміжку між 1 Січня 2001 року та поточною датою:

Таким чином, як ми переконалися на практиці, підзапити можуть бути використані не тільки в пропозиції WHERE, але і в пропозиції FROM. За аналогією з пропозицією WHERE підзапит може бути використаний у реченні HAVING.

Окремий різновид підзапитів виділяється до групи пов'язаних підзапитів. З'ясуємо, що це таке. Коли SQL використовуються підзапити, у внутрішньому (вкладеному) запиті можна посилатися на таблицю, ім'я якої зазначено у пропозиції FROM зовнішнього запиту. Саме таким чином формується пов'язане підзапит. У цьому варіанті використання підзапитів підзапит виконується повторно, точніше по одному разу для кожного рядка таблиці з основного запиту. Наприклад, дізнаємося всю інформацію про видавництва, у яких загальна кількість сторінок випущених ними книг більше 700:

На загальне щастя тема підпитів об'ємна. З цієї причини ми ще не раз торкнемося теми підзапрсів у наступних заняттях.