Helyezzen be egy lekérdezést belül egy másik
Végén 9. fejezet, azt mondta, hogy a lekérdezéseket az ellenőrzés más kéréseket. Ebben a fejezetben megtudhatja, hogyan történik (többnyire) a lekérdezés állítmány helyezni egy másik lekérdezés és a belső lekérdezés kimenetét a helyes vagy helytelen alá feltételnek.
Ön képes lesz arra, hogy megtudja, milyen szereplők használhatják subqueries, és hogyan subqueries az SQL eszközök, mint például a elkülönül, összetett funkciók és az ebből levezetett kifejezéseket.
Meg fogja tanulni, hogyan kell használni subqueries bocsátani a RENDELKEZŐ, és egy kis útmutatást, hogyan kell használni subqueries.
AK WORKS segédlekérdezés?
Segítségével SQL lekérdezések, akkor befektetni egymást. Jellemzően, a belső lekérdezés termel egy értéket, amely be van jelölve a külső lekérdezés predikátum, amely meghatározza, igaz vagy nem. Tegyük fel például, hogy tudjuk a nevét az eladó számára: Motika, de nem tudom a jelentését a mező SNUM és szeretné eltávolítani az összes megrendelést a Rendelések tábla. Íme egy példa arra, hogy ezt (az ábrán látható eredményt 10.1.):
Megbecsülni a külső (fő) kérésére, az SQL először becsülni a belső kérése (vagy segédlekérdezés) belül, ahol a mondat. Ezt azzal éri el, mert hiszen kérelmet kell benyújtania, amelynek egyetlen célja -, hogy megtalálja a táblázatot Sellers keresztül az összes sort, ahol a mező egyenlő SNAME Motika értéket, majd vonjuk ki a mező értékét SNUM ezeket a sorokat.
Csak találtam egy húr természetesen SNUM = 1004. Azonban az SQL nem egyszerűen adja értékét, és beteszi az állítmány a fő lekérdezés helyett segédlekérdezésként, hogy az állítmány olvasni, hogy
A fő lekérdezés ezután végezzük a szokásos módon a fenti eredményeket. Természetesen a allekérdezés kell választani egy és csak egy oszlopot, majd az oszlopot adatokat meg kell egyeznie az érték, amellyel szemben egy állítmány.
Gyakori, hogy a fentiek szerint, a kiválasztott területen, és annak értéke is ugyanaz a neve (ebben az esetben SNUM), de ez nem kötelező. Természetesen, ha már tudjuk a számát az eladó Motika tudtuk egyszerűen nyomtassa WHERE SNUM = 1004 és továbbra is együttműködik segédlekérdezésként egészére, de ez nem általános. Ugyanaz a lekérdezés továbbra is működni fog, ha Motika száma megváltozott, és egy egyszerű névváltozás segédlekérdezésként, akkor tudja használni semmit.
Az értékek W, segédlekérdezésként kiadható
A legvalószínűbb, hogy kényelmesebb lenne a mi al-lekérdezés az előző példában visszatér egy, és csakis egy értéket.
Miután kiválasztott mező SNUM „WHERE város =” London „helyett” WHERE SNAME = „Motika” állíthatók elő számos különböző értékeket. Ez megtehető a fő lekérdezés állítmány kiértékelését lehetetlenné hűség vagy hűtlenség, és a parancs hibaüzenetet.
Amikor allekérdezés predikátumok alapján relációs műveletek (egyenlőtlenségeket vagy egyenletek ahogyan a 4. fejezetben), meg kell győződnie arról, hogy segédlekérdezésként használt, amely megadja egy, és csak egy sorba. Ha segédlekérdezésként hogy nem jelenik meg semmilyen értéket egyáltalán, a csapat nem sikerül, de a fő kérés nem nyomtat egyetlen értékeket. Subqueries hogy nem termelnek kimenet (vagy nulla kimenet), arra kényszerülnek, hogy fontolja meg az állítmány nem olyan hű, vagy rossz, hanem egy ismeretlen. Azonban ismeretlen az alapul ugyanaz a hatása, mint egy érvénytelen: nem kijelölt sor a fő lekérdezés (lásd 5. fejezet részleteket az ismeretlen állítmány).
Itt egy példa a rossz stratégia:
Mivel már csak egy eladó Barcelona - Rifkin, az al-lekérdezés kiválaszt egy értéket SNUM, és ezért el fogja fogadni. De ez csak ebben az esetben. A legtöbb SQL adatbázisok sok felhasználó, és ha egy másik felhasználó hozzáad egy új eladó Barcelona a táblázatban allekérdezésben kiválaszt két értéket, és a csapat nem fog működni.
D ISTINCT a subqueries
Íme egy példa arra, hogy ezt (az ábrán látható eredményt 10.2):
Segédlekérdezés megállapította, hogy a mező értéke SNUM egybeesett Hoffman - 1001, majd a fő lekérdezés kiválasztott minden megrendelést ezzel az értékkel SNUM a Rendelések tábla (nem keres, amelyhez tartoznak Hoffman vagy sem). Mivel minden ügyfél van rendelve az eladó, tudjuk, hogy minden sorban a Rendelések tábla értékkel cnum ugyanazzal a jelentéssel SNUM. Azonban, mivel nem lehet tetszőleges számú vonalak, mint segédlekérdezés eredhetnek sok (bár azonos) SNUM értékei ezen a területen cnum. KÜLÖNÁLLÓ érv megakadályozza ezt. Ha a allekérdezés egynél több értéket, ez azt jelzi, hiba adataink - jó dolog azok számára, akik tudnak róla.
Ott kell lennie egy alternatív megközelítés, hogy olvassa el a Vevők táblában, ahelyett, hogy egy asztalon lévő megrendelések segédlekérdezésként. Mivel cnum mező az elsődleges kulcs a Vevők táblában, akkor a lekérdezés, amely kiválasztja meg kell adni csak egy érték. Ez racionális csak akkor, ha a felhasználó hozzáférhet a Rendelések tábla, de nem a Vevők táblában. Ebben az esetben, akkor a megoldás, hogy azt korábban bemutattuk. (SQL szerkezetekkel, amelyek meghatározzák, akinek jogosultsága bizonyos műveleteket a táblázatban. Ez azzal magyarázható, a 22. fejezetben)
Felhívjuk figyelmét, hogy az alkalmazott módszer az előző példában, csak akkor alkalmazható, ha tudjuk, hogy két különböző területen a táblázatban kell mindig ugyanaz, mint a mi esetünkben. Ez a helyzet nem jellemző egy relációs adatbázis (RDB), ez a kivétel a szabály alól.
N REDIKATY segédlekérdezés visszafordíthatatlan
Meg kell figyelni, hogy a predikátumok, amelyek tartalmazzák al-lekérdezések, használja a kifejezést
Más szóval, akkor nem kell írni az előző példában az alábbiak szerint:
A szigorú ANSI-megvalósítását ez vezet a hiba, bár néhány program lehetővé teszi, hogy ilyen dolgokat csinálni. ANSI is megakadályozza, hogy a megjelenése a kimeneti allekérdezésben mindkét értéket az összehasonlításhoz.
Hasznosítása aggregált függvények subqueries
A típus a funkciók, amelyek automatikusan előállítani egy érték tetszőleges számú sor, természetesen - az összesítő függvény.
Például, a következő kérdés, hogy az, hogy megtaláljuk az átlagos értéke a kereskedő a londoni,
nem lehet használni a segédlekérdezésként! Különben is, nem ez a legjobb módja annak, hogy a kérelmet.
Egy másik módszer lehet
U énekelni segédlekérdezés hogy egy csomó sort az IN operátor
Használhatja subqueries hogy semmilyen sorok számát, ha használja a speciális szereplő (az üzemeltetők, a LIKE és NULL nem lehet használni subqueries). Ahogy emlékszem, IN meghatároz egy értékrendet, amelyek közül az egyik meg kell egyeznie a másik kifejezéssel állítmány egyenlet érdekében predikátum igaz volt.
Amikor használja IN segédlekérdezésként, SQL egyszerűen létrehoz ez meg az segédlekérdezés kimenet. Mi lehet tehát használni, hogy megtörténhessen segédlekérdezésként, ami nem fog működni egy relációs operátor, és megtalálja a Rendelések tábla attribútumai az eladóhoz Londonban (az ábrán látható eredményt 10.4):
Egy ilyen helyzetben a allekérdezés a felhasználók számára egyszerűbb megérteni és könnyebb a számítógép végre, mint ha használják az egyesület:
Akkor nincs szükség a DISTINCT felhasználásra helyett (=):
Mi történik, ha hiba van, és az egyik megbízás akkreditálta különböző eladók? Verziót IN, kapsz minden megrendelést mind az eladók. Nincs nyilvánvaló módon megfigyelni a hiba, ezért az előállított jelentéseket vagy döntések alapján ezt a kérést, nem tartalmaznak hibát. Alternatív módon, a (=) egyszerűen nem. Ez legalább, akkor tudd, hogy van ilyen probléma. Ezután végre kell hajtania hibaelhárítás futtatásával allekérdezés külön, és megfigyeljük az értékeket, amelyeket termel. Alapvetően, ha tudjuk, hogy a allekérdezés must (logikusan), hogy csak egy értéket, akkor használja =.
IN akkor megfelelő, ha a kérés korlátozottan elő egy vagy több értéket, hogy vársz tőlük, vagy sem. Tegyük fel, hogy szeretnénk tudni, hogy a díjak a kereskedők az ügyfelek rendelkezésére London:
Levezethető ehhez a kéréshez ábrán látható 10.5 olyan értékek eladó díjak Peel (SNUM = 1001), amelynek az ügyfelek Londonban. De ez csak ebben az esetben. Nincs oka, hogy egyes ügyfelek London nem tud rendelni másnak. Ezért, - ez a leglogikusabb formában tartalmazza a lekérdezés.
Subqueries SELECT-egy oszlop
Az mit jelent az összes al-lekérdezések, ebben a fejezetben tárgyaljuk az, hogy válasszon egy oszlop. Erre azért van szükség, mert a keletkező kimenet képest egyetlen érték. Ennek bizonyítéka, hogy a SELECT * nem használható segédlekérdezésként. Van egy kivétel ez alól, ha a kapcsolót subqueries EXISTS üzemben, amely megbeszéljük a 12. fejezetben.
Használható olyan kifejezés segédlekérdezés
Használhatja egy kifejezés-alapú oszlop, nem csak magát oszlop a SELECT záradék segédlekérdezés. Ezt meg lehet tenni akár a relációs operátorok vagy IN. Például, a következő lekérdezést használ egy relációs operátor = (a kimenet ábrán látható 10.6):
Rájön, hogy minden ügyfél, amelynek értéke mező CNUM, 1000, a mező felett SNUM Serres. Azt feltételezzük, hogy SNAME oszlopot nem bináris értékek (amely lehet előírt vagy egyedi index, fejezetben tárgyalt 17 vagy utasbiztonsági UNIQUE, tárgyalt 18. fejezet); egyébként
segédlekérdezés képes több értéket. Ha a mezők és SNUM SNUM nincs ilyen egyszerű funkcionális jelentősége, például egy elsődleges kulcsot, ami nem mindig jó, a fent említett típusok kérni rendkívül hasznos.
N ODZAPROSY mondat HAVING
Ön is használja subqueries a HAVING. Ezek subqueries használhatja saját összesítő függvények, ha azok nem termelnek több értéket, vagy használja a GROUP BY vagy korábban. Az alábbiakban egy példa a kérelmet (a kimenet ábrán látható 10.7):
Ez a parancs számít ügyfelek San Jose a minősítés átlag feletti. Mivel vannak más becslések más, mint 300, akkor meg kell vonni a száma ügyfelek számát, ami már ezt az értékelést.
Most, akkor használja a lekérdezéseket hierarchikus módon. Azt már láttuk, hogy az egyik használata következtében, hogy ellenőrizzék a többi bővíti, amely lehetővé teszi, hogy végre több funkció.
Akkor már értem, hogyan kell használni subqueries a relációs műveletek és különleges szereplő, vagy a WHERE vagy HAVING a külső lekérdezés.
A következő fejezetekben fogjuk vizsgálni al-lekérdezések. Először is, a 11. fejezetben lesz szó egy másik fajta segédlekérdezés, amely végrehajtásra mindegyik sor az asztalra, az úgynevezett külső lekérdezés. Ezután fejezetében a 12. és 13. fogjuk bemutatunk néhány speciális operátorok működnek minden al-lekérdezések, akárcsak a IN, kivéve azokat az eseteket, amikor a gazdasági szereplők csak az al-lekérdezések használhatók.