Subqueries blog Michael flonova
A legnehezebb, de ugyanakkor a legérdekesebb téma a subqueries. Ez egy nagyon hatékony eszköz, hogy megszerezze a szükséges adatokat, és másrészt, ez az eszköz nagyon sok erőfeszítést a lekérdezés feldolgozása teljesítményű szerver. Először is megtanul dolgozni subqueries mert lehet használni, hogy gyorsan megoldja a problémát, majd megtudjuk, hogy megszabaduljon a subqueries, ami megegyezik az optimalizálás.
Ez a probléma egyszerűen megoldható segítségével al-lekérdezések:
Ebben a példában, akkor válassza ki az összes rekordot táblázatból tbPhoneNumbers. Ebben az esetben a mező „idPhoneType” összehasonlítjuk az eredménye allekérdezés hogy meg van írva zárójelben. Mivel van egy jele az egyenlőség, a allekérdezés eredménnyel kell egy területen, és egy sorban. Ha az eredmény két terület vagy több mint egy sorban, a kiszolgáló visszatér hozzánk egy hiba.
Próbáljuk futtatni a következő lekérdezést:
Ez lekérdezés két sorban két érték az elsődleges kulcs. Válaszként a szerver hibát jelez:
Allekérdezés vissza több mint 1 értéket. Ez nem megengedett, ha a segédlekérdezés következik =. = <, <=. &qt;, &qt;= or when the subquery is used as an expression.
(Allekérdezés egynél több értéket. Ez nem megengedett, ha segédlekérdezésként követi a karakter =. = <, <=. &qt;, &qt;= или когда подзапрос используется как выражение)
Akkor mit lehet használni? Ha úgy gondolja, egy kicsit, akkor ez egyenlőségjel kérelem helyébe az üzemeltető:
Először SQL végre a belső kérés elrendezett zárójelben, helyettesítheti az eredmény külső igény.
Már utaltam arra, hogy az eredmény a allekérdezés tartalmaznia kell csak egy oszlopot. Ez azt jelenti, hogy nem tud írni a belső lekérdezés SELECT *, de akkor csak a ImyaOdnogoPolya. Ne feledje, hogy ez a név, csak egy típusú és meg kell az ugyanolyan típusú értékeket hasonlítják össze. Subqueries kell használni, nagyon óvatosan, mert hibát okoz.
Nagyon fontos, hogy a allekérdezés legyen zárójelben és jobbra az egyenlőségjel. A szabvány nem teszi lehetővé írható subqueries maradt. Ez azt jelenti, hogy a következő lekérdezést nem igaz:
Ebben a példában először van egy al-lekérdezést, majd egy egyenlőségjel, és csak ezután adja meg a területen, ami szükséges ahhoz, hogy az összehasonlítást.
A fő kérdés (más néven külső) elérheti az allekérdezés (belső kérésre). Ehhez meg kell adnia a fedőnevek. Nézzük meg a következő lekérdezést:
Ügyeljen arra, hogy az utolsó előtti sort:
Itt van egy összehasonlítás ének „vcPhoneNumber” ot az asztalra a mintát. A legérdekesebb dolog az, hogy ot - egy alias asztal tbPhoneNumbers, amely részben leírt külső kérésre. De ennek ellenére, tudjuk kezelni a allekérdezés alias hogy az oszlopok a külső kéréseket. Így lehetőség van arra, hogy közvetlen kapcsolat meglehetősen bonyolult kérelmek között.
Az ilyen kérelmet fogja elvégezni a következő algoritmus:
- Jelölje egy sort tbPhoneNumbers táblázat a külső lekérdezés. Ez lesz az aktuális sort jelölt.
- Mentse az érték ebben a sorban-jelölt alias nevű ot.
- Fuss segédlekérdezés e, és a külső lekérdezés részt vesz a keresésben.
- Rate „idPhoneType” külső lekérdezés eredményei alapján a allekérdezés végre az előző lépésben. Ez határozza meg -, hogy a vonal jelölt kiválasztott kijelzés.
Subqueries lehet nem csak a WHERE, hanem a SELECT és FROM záradék listájában. Nézzük először az al-lekérdezések a FROM, hogy azt elég bonyolult, de érdekes feladat. A csoport tudtunk tanulni, hogyan határozza meg a felhasználók száma a nevét Andrew. És mi van, ha létrehoz egy táblázatot, amely három oszlopból áll:
Ezt a problémát meg lehet oldani egyszerűen formájában két lekérdezés. Az alábbi lekérdezés meghatározza az egyes név az alábbi táblázatban:
Az ilyen kérés már elemezték.
Van két különböző táblázatok. És most, hogy egyesítse őket egy? Próbálja megoldani ezt a problémát. Saját döntés látható lista 2.3.
A FROM záradék, ahelyett, hogy a táblák utasításait fenti kéréseket, zárójelbe téve. Minden egyes lekérdezés, álnév, különben lehetetlen dolgozni a lekérdezés területeken. Kiderült, hogy ahelyett, hogy az adatokat közvetlenül az asztalra, megkapjuk azokat a lekérdezés.
Az ilyen kéréseket, csak egy korlátozás - egyes szakaszain a területen az al-lekérdezés FROM záradék kell egy nevet. Van mezőket számolni a belépés és mezők egy ilyen név nincs megadva, így én meg álnevek. Az első al-lekérdezés oszlopot rekordok száma nevezik PeopleNumber, és a második al-lekérdezés - PhoneNum.
Külső linkek egyesítése mindkét kérelem érkezett a tábla neve mezőben „vcName”, és az eredmény egy általános táblázatot (lásd 2.7 ábra ..), amely a négy oszlop - a nevét és mennyiségét az első kérés, és a nevét és számát, a második kérelmet. Az egyik az oszlopok neveit lehet távolítani, mert ezek azonosak, de úgy döntöttem, hogy elhagyja, így láthatja a kapcsolatot.
Az eredmény egyesíti a két tábla
Az első rész SELECT érdeklődik minden oszlopot a táblázat tbPeoples (pl. *). Ezután, ahelyett, hogy a következő mező zárójelben tüntetjük fel allekérdezésben amely kiválasztja adatokat. Ebben az esetben a allekérdezés a WHERE indukált táblák közötti kapcsolatot. Kiderült, hogy ez a segédlekérdezés tudjuk elérni a mezőket a külső lekérdezés.
Az egyetlen korlátozás - segédlekérdezésként a SELECT részben vissza kell csak egy sor. Ha az eredmény nem lesz több sor, a lekérdezés egy hiba.
Az összes példa, hogy mi tekinthető a fenti, elegendő egyszerűen megvalósítani, használata nélkül subqueries. Például nézd meg a következő lekérdezést:
Ugyanez a probléma is megoldható az alábbiak szerint:
Egyszerűen csatlakoztassa a két táblát, és azt mutatják, ugyanabban az állapotban. Tehát megszabadult az segédlekérdezés, és most a szerver képes elvégezni a feladatot gyorsabban. A legtöbb probléma megoldható anélkül segédlekérdezésként, ha a táblázat a link jól működjön. Ezért ebben a könyvben megpróbálom használni a minimális subqueries, és minden próbálja megoldani egy SELECT.
De a következő lekérdezés elég nehéz megtenni anélkül, hogy az al-lekérdezések. Tegyük fel, hogy meg kell határozni az adatok utolsó adunk a húr asztalra. Ha az elsődleges kulcs segítségével automatikusan nagyítja a területen, meg kell tudni, hogy a legmagasabb elsődleges kulcs értéket MAX operátor, majd talál egy sor ezzel a kulccsal. Itt van, hogy az utolsó sort a táblázatban tbPeoples:
Az ilyen kérelem segít sokat, ha megtanuljuk, hogy bejegyzéseket az asztalra, hogy gyorsan látni lehetett az eredményt.