Подзаявки в MS Access - Софтуерни продукти

Стандартът SQL предоставя възможност за влагане на заявки една в друга, което има голямо практическо приложение. Още веднъж - някои заявки могат да контролират други. За да анализирам всички тънкости на тази концепция, предлагам първо да разгледаме практически пример за използване на подзаявка и след това да преминем към нейното теоретично обсъждане.

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

За да изпълни основната (известна още като външна) заявка, SQL трябва първо да изпълни подзаявка (известна още като вътрешна заявка) в клаузата WHERE. По този начин подзаявката първо се изпълнява, сякаш е единична заявка. С други думи, всички записи в таблицата Press се търсят и се избират всички записи, за които стойността на полето Name е „BHV“. Резултатът се замества в основната заявка и основната заявка се изпълнява. Крайният резултат е, че се избират записи, съдържащи само информация за издателя на BHV.

Сега нека поговорим за ограниченията, които налага използването на подзаявки. Подзаявката трябва да избере едно и само едно поле. Освен това типът данни на това поле трябва да съответства на типа стойност, използван в основната заявка. Например, заявката по-долу трябва да доведе до грешка, тъй като подзаявката в нея произвежда няколко стойности на изхода:

Защо грешка? Резултатът съдържа повече от един ред (връща се ID за издателя BHV и Binom). По този начин, когато използвате подзаявки, базирани на релационни оператори, трябва да сте сигурни, че крайният изход на подзаявката е само един ред.

Страхотно, с итерация (тоест, когато резултатът от подзаявката се окаже, че е няколкоценности) разбрани. Но какво ще стане, ако подзаявката не върне никакви данни, така нареченият 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:

За щастие на всички, темата за закъснелите заявки е обемна. Поради тази причина ще засегнем темата за подзаявките повече от веднъж в следващите уроци.