ПредишенСледващото

В края на глава 9, казахме, че заявки могат да контролират други искания. В тази глава ще научите как се прави (най-вече) от предиката на заявката поставен в друга заявка и вътрешна заявка използвате изхода в прав или не подлежи на предикат.

Ще имате възможност да разберете какви видове оператори могат да използват подзаявки, и да видим колко подзаявки работят с SQL инструменти като отделни, с композитни функции и изведените изрази.

Ще се научите как да използвате подзаявки да предоставят на имащи и да получите някои инструкции за това как да се използва подзаявки.

Чрез AK РАБОТИ подзаявка?

С помощта на SQL заявки, можете да инвестирате в един от друг. Обикновено вътрешната заявката произвежда стойност, която се проверява по външната предиката на заявката, която определя вярно или не. Например, да предположим, че ние знаем името на продавача: Motika, но не знаете смисъла на неговото поле snum и искате да премахнете всички поръчки от таблицата с поръчки. Ето един начин да направите това (на изхода е показано на фигура 10.1.):

За да изчислите външната (основна) искането, SQL, трябва първо да се оцени вътрешния искането (или подзаявка) вътре, където изречение. Той прави това, защото, както той трябва да направи заявка като една-единствена цел - да се намери маса на Продавачите през всички редове, където полето е равно SNAME Motika стойност, а след това се извлече стойност на полето snum на тези линии.

Само намерен низ естествено ще snum = 1004. Въпреки това, SQL не е просто да го дава стойност, и го слага в предиката на основната заявка вместо подзаявка, така че сказуемото четох, че

След това, основната заявка се извършва както обикновено с горните резултати. Разбира се, подзаявка трябва да изберете една и само една колона, и типа данни на колоната трябва да съответства на стойността, с която той се сравнява с предикат.
Често, както е показано по-горе, избраното поле и неговата стойност ще имат едно и също име (в този случай snum), но това не е задължително. Разбира се, ако ние вече знаем броя на продавача Motika, бихме могли просто да отпечатате КЪДЕ snum = 1004 и ще продължи да работи с подзаявка като цяло, но това не би универсални. В една и съща заявка ще продължи да работи дори ако Motika брой се е променил, и с една проста промяна на името в подзаявка, можете да го използвате за нещо.

W на стойности, а подзаявка могат да бъдат изведени

Най-вероятно това ще бъде по-удобно да ни под-заявка в предишния пример връща един и само един, стойност.

Като избран поле snum "КЪДЕ град =" Лондон ", вместо" КЪДЕ SNAME = 'Motika ", може да се приготви няколко различни стойности. Това може да стане в основната оценка на заявка предикат невъзможно верността или неверността и командата ще върне грешка.

При използване на подзаявка предикати на базата на релационни операции (неравенства или уравнения, както е обяснено в глава 4), трябва да се уверите, че подзаявка използва, което ще даде на един и само един, на изхода на линия. Ако използвате подзаявка, че не показва никакви стойности на всички, отборът не се провали, но основната искането не се отпечатва никакви ценности. Подзаявки, които не произвеждат всеки изход (или нулев изход), са принудени да се помисли за сказуемото не е толкова верен, или като греша, но като неизвестна. Въпреки това, непознат за сказуемото има същия ефект като невалиден: няма избрани редове от основната заявка (виж глава 5 подробности за неизвестен предикат).

Ето един пример за лоша стратегия:

Тъй като ние имаме само един продавач в Барселона - Рифкин, под-заявка ще избере един единствен snum стойност и поради това, тя ще бъде приета. Но това е само в този случай. Повечето SQL бази данни имат много потребители, а ако друг потребител добавя нов продавач на Барселона през подзаявка на масата избира две стойности, и вашият екип ще се провали.

D ISTINCT с подзаявки

Ето един начин да направите това (на изхода е показано на фигура 10.2):

Подзаявка установено, че стойността на поле snum съвпадна с Хофман - 1001, а след това на основната заявка избран всички поръчки с тази стойност snum от таблицата с поръчки (не гледам, те принадлежат към Хофман или не). Тъй като всеки клиент се възлага на продавача, знаем, че всеки ред в таблицата с поръчки с cnum на стойност, има същото значение snum. Въпреки това, тъй като не може да има произволен брой линии, като подзаявка може да извлече много (макар и идентични) snum стойности за това поле cnum. DISTINCT аргумент предотвратява това. Ако нашата подзаявка връща повече от една стойност, това ще е индикация за грешка в данните ни - нещо добро за тези, които знаят за това.
Трябва да има алтернативен подход, да се позове на масата за клиентите, вместо таблица на поръчки в подзаявка. От cnum поле е първичен ключ на таблицата с клиентите, заявката, която избира тя трябва да даде само една стойност. Това е рационално, само ако сте като потребител има достъп до таблицата с поръчки, но не и на масата на клиентите. В този случай, можете да използвате решението, което ние показахме по-горе. (SQL има механизми, които определят кой има права за извършване на определени действия, посочени в таблицата. Това ще бъде обяснено в глава 22.)

Моля, имайте предвид, че методологията, използвана в предишния пример, е приложима само когато знаеш, че две различни области, посочени в таблицата трябва винаги да бъдат същите, както е в нашия случай. Тази ситуация не е типично в релационна база данни (ЧК), това е изключение от правилото.

N REDIKATY подзаявка е необратима

Трябва да се обърне внимание, че предикатите, които включват под-заявки, използват израза

С други думи, вие не трябва да пиша предишния пример, както следва:

В строг ANSI-реализация на това ще доведе до провал, макар че някои програми ви позволяват да правите такива неща. ANSI също така предотвратява появата на изходния подзаявка двете стойности в сравнението.

Използване на обобщаващи функции в подзаявки

Видът на функции, които може автоматично да произведе една стойност за произволен брой линии, разбира се - общата функция.

Така например, следната заявка, която трябва да се намери средната стойност на търговеца в Лондон,

не може да се използва в подзаявка! Както и да е, това не е най-добрият начин за генериране на искането.

Друг метод може да бъде

U пее подзаявка, че виждам много редове с помощта на оператора на ПО

Можете да използвате подзаявки, които произвеждат произволен брой редове, ако използвате специален оператор в (между операторите, подобни и е нула, не може да се използва с подзаявки). Както си спомняте, ПО определя набор от ценности, една от които трябва да бъдат еднакви с друг термин предикат уравнение, за да предикат е вярно.
Когато използвате с подзаявка, SQL просто създава този набор от подзаявка изход. Ние можем, следователно, да се използва, за да извършите подзаявка, който няма да работи с релационна оператор, и да намерят всички поръчки маса атрибути за продавача в Лондон (на изхода е показано на фигура 10.4):

В ситуация като тази, на подзаявка е по-лесно за потребителите да разберат и по-лесно за компютър, за да се изпълни, отколкото ако се използва на сдружението:

Можете да елиминира нуждата от отделни, използване при вместо (=):

Какво се случва, ако има грешка и една от поръчките е акредитиран от различни продавачи? Версия с помощта на IN, ще ви даде всички поръчки за двете продавачи. Не съществува начин да се наблюдава грешката, и следователно на генерираните доклади или решения, взети въз основа на това искане, не съдържат грешки. Алтернативно, с използване на (=), просто се провали. Това най-малкото ще ви позволи да знаят, че има такъв проблем. След това трябва да изпълнява отстраняване на проблеми с управлението на подзаявка отделно и при спазване на ценностите, които тя произвежда. По принцип, ако знаете, че подзаявка мъстта (логично), за да донесе само една стойност, трябва да използвате =.
ПО е подходяща, ако искането може ограничено производство на една или повече стойности, независимо дали сте ги очакваме или не. Да предположим, че искате да знаете всички такси търговци, обслужващи клиенти в Лондон:

Извличани за това искане, както е показано на фигура 10.5 са ценности продавача такси Peel (snum = 1,001), което има както клиенти в Лондон. Но това е само в този случай. Няма причина, че някои клиенти в Лондон не може да се възлага на някой друг. Ето защо, в - това е най-логичното форма за употреба при заявка.

Подзаявки SELECT единични колони

Смисълът на всички под-заявки, обсъдени в тази глава, е, че те избират една колона. Това е необходимо, защото получената продукция се сравнява с една стойност. Доказателство за това е, че SELECT * Не може да се използва в подзаявка. Налице е изключение от това правило, когато се използва с подзаявки СЪЩЕСТВУВА оператор, който ще обсъдим в глава 12.

Използване на експресионен подзаявка

Можете да използвате колона израз основа, а не само себе си колона в SELECT клаузата подзаявка. Това може да стане или чрез използване на релационни оператори, или IN. Например, следната заявка използва релационна оператор = (изходът е показано на фигура 10.6):

Той открива всички клиенти, чиято стойност поле CNUM, 1000, над поле snum Серес. Ние приемаме, че SNAME колона още няма двоични стойности (които могат да бъдат предписани или UNIQUE INDEX, разгледани в глава 17 или сдържаност UNIQUE, разгледани в глава 18); в противен случай

подзаявка може да доведе до множество стойности. Когато нивите и snum snum не разполагат с такъв прост функционален значение, като първичен ключ, което не винаги е добро, посочените по-горе видове изискват изключително полезни.

N ODZAPROSY изречение КАТО

Можете да използвате и подзаявки в КАТО клауза. Тези подзаявки могат да използват собствените си агрегатни функции, ако те не произвеждат повече от една стойност, или да използвате GROUP BY или има. Следното е пример на искането (изходът е показано на фигура 10.7):

Тази команда се брои клиенти в Сан Хосе с рейтинг над средното ниво. Тъй като има различни оценки, различни от 300, те трябва да бъдат изтеглени от броя на абонатни номера, който имаше тази оценка.

Сега можете да използвате заявки в йерархичен начин. Вие видяхте, че използването на един резултат, за да контролира другата разширява възможностите, като ви дава възможност да изпълнява други функции.

Сега разберете как да използвате подзаявки до релационни операции и специален оператор IN, или в КЪДЕ клауза или КАТО клауза на външната заявка.

В следващите глави ще разгледаме под-запитвания. На първо място, в глава 11 ще обсъдим друг вид подзаявка, която се изпълнява за всеки ред от таблицата, наречен външната заявка. След това, в глави 12 и 13 ще ви представим няколко специални оператори, които работят на всички под-заявки, също както и в, с изключение на случаите, когато могат да се използват от операторите само в под-заявки.

Започната SQL CO

Свързани статии

Подкрепете проекта - споделете линка, благодаря!