az internet ablakok Android

Létezik, és nem létezik az üzemeltetők. A létező operátor használata A legegyszerűbb lekérdezések a predikátummal rendelkező SQL-vel rendelkeznek



Különbség létezik és az SQL-ben? (tizennégy)

Mi a különbség a létező és az SQL-ben?

Mikor kell használni létezik, és mikor kell használni?

    Létezik sokkal gyorsabb, mint amikor az aljzat eredményei nagyon magasak.
    Gyorsabban, mint létezik, amikor a szubkulátor eredmények nagyon kicsiek.

    Hozzon létre T1 T14 (ID INT, CÍM VARCHAR (20), SOMEINTCOL INT) A T2 Táblázat létrehozása (ID INT, T1ID INT, SOMEDATA VARCHAR (20)) A T1 SELECT 1, "1. cím", 5 Unió kiválasztása , "2. cím", 5 Unió Minden kiválasztása 3, "Cím", "3. cím", 5 Unió Válasszon 4, "4. cím", 5 Unió Minden kiválasztása Null, "5. cím", 5 Unió Válassza ki NULL, "CÍM", 5 INSERT IN T2 SELECT 1, 1, "DATA 1" Unió All Select 2, 1, "Data 2" Union All Select 3, 2, "Data 3" Union All Select 4, 3, "Data 4" Union All Select 5 , 3, "Adat 5" Unió mind közül válasszon 6, 3, "adat 6" Unió mind közül Select 7, 4, 4, "Data 7" Unió válasszon 8, , "adat 8" Unió mindegyik 9, 6, "adat 9 "Unió mind közül válasszon 10, 6," adat 10 "Unió mind közül 11, 8," adat 11 "

    1. kérés.

    Válassza ki a T1-t, ahol nem létezik (válassza a * lehetőséget a T2-től, ahol t1.id \u003d t2.t1id)

    2. kérelem.

    Válassza a T1 lehetőséget. * A T1-ről, ahol t1.ID nincs be (válassza a T2.T1ID t2-et)

    Ha a T1-ben az azonosítója nulla értékkel rendelkezik, az 1 lekérdezés megtalálja őket, de a 2 lekérdezés nem lesz képes nulla paraméterek megtalálására.

    Úgy értem, hogy nem lehet összehasonlítani semmit nulla, így nincs az eredmény , de létezik, képes összehasonlítani mindent nulla.

Gyorsabban létezik, mint a. Ha a legtöbb szűrő kritériumban van, akkor jobb, ha jobban használható, és ha a legtöbb szűrési kritérium a fő kérésben van, akkor jobb használni létezik.

Ha a nyilatkozatot használja, az SQL mechanizmus beolvassa a belső kérésből kivont összes rekordot. Másrészt, ha létezik, az SQL mechanizmus leállítja a szkennelési folyamatot, amint a véletlen egybeesés megtalálható.

Ha az aljzat egynél több értéket ad vissza, előfordulhat, hogy külső lekérdezést kell végrehajtania - ha az állapotban megadott oszlopban lévő értékek megfelelnek az ebből eredő szubkutánban lévő értéknek. Ennek a feladatnak a megvalósításához kulcsszót kell használnia.

Használhat egy rubvintát, hogy ellenőrizze, van-e rekordkészlet. Ehhez használnia kell a létező ajánlatot egy rubkulással. A létező kulcsszó mindig igaz vagy hamis.

Melyik a belső kérelem által kapott kérelmek számától gyorsabban függ:

  • Amikor a belső kérés ezer sort választ, akkor létezik a legjobb választás.
  • Amikor a belső lekérdezésének több vonalat választ, akkor gyorsabb lesz

Létezik az igazi vagy hamis érték értéke, de a többszörös értékkel összehasonlítja. Ha nem tudja, hogy a felvétel létezik, vagy sem, akkor léteznie kell

A kulcsszó létezik, értékeli az igazi vagy hamis értéket, de a kulcsszó összehasonlítja az összes értéket a megfelelő szubkután oszlopban. Egy másik kiválasztási 1 használható a létező paranccsal. Példa:

Válassza a * Temp1-ről, ahol létezik (válassza az 1-et a TEMP2-től, ahol körülmények ...)

De kevésbé hatékony, így gyorsabban létezik.

Alapuló szabály-optimalizáló :

  • Sokkal gyorsabb, mint amikor a szubkulátor eredmények nagyon magasak.
  • Gyorsabban, mint létezik, amikor az alkérés eredményei nagyon kicsiek.

Alapuló optimizáló költségek :

  • Nincs különbség.

Adataim szerint, amikor az aljzat visszaadja a null értéket, az egész operátor null lesz. Ebben az esetben a kulcsszóból kilép. Ha bizonyos értékeket szeretnénk összehasonlítani a szubkókában, akkor a kulcs szót használjuk.

    Létezik, ha összehasonlítania kell a kérés eredményeit egy másik feliratozással. Az 1. lekérdezés eredményeit meg kell szerezni, ha a karbantartási eredmények egybeesnek. Nézd meg, hogy csatlakozzon .. Például válassza ki az 1. számú Ügyféltáblát, amely szintén a # 2 alkalmazási táblázatot is elhelyezte

    Benne van szükség, ha egy adott oszlop értékét felsorolja (1,2,3,4,5). Például válassza ki azokat az ügyfeleket, amelyek a következő irányítószámok, azaz a ZIP_CODE értékek a listában vannak (....).

Mikor kell használni az egyiket a másikra ... Ha úgy érzi, hogy ennek megfelelően elolvassa (kommunikál a legjobb szándékokkal).

Úgy találtam, hogy a kulcsszavak használata gyakran nagyon lassú (nagyon igaz a Microsoft Access). Ehelyett az egyesítő üzemeltetőt az alábbiak szerint használom:

Feltételezem, hogy tudod, mit csinálnak, és ezért másképp használják, ezért a következőképpen fogom megérteni a kérdést: ha jó ötlet lenne az SQL átírása, hogy létezik-e, vagy fordítva.

Ez egy tisztességes feltételezés?

változás : Az az ok, amiért megkérdezem, hogy sok esetben az SQL-t újra átírhatja a használatra, és fordítva, és bizonyos adatbázis-motorok esetén a lekérdezési optimalizáló két különböző módon dolgozik.

Például:

Válassza ki a * választást az ügyfelektől, ahol létezik (válassza a * parancsot a megrendelésektől, ahol megrendelések.Customerid \u003d ügyfelek.ID)

Újraírhatja:

SELECT * Ügyfelek WHERE ID (válasszon CustomerID származó megbízások)

vagy kapcsolattal:

Válassza ki az ügyfeleket. * Az ügyfelektől a Belső Csatlakozási megrendelések az ügyfelek számára.ID \u003d megrendelések

Így a kérdésem továbbra is áll, hogy az eredeti poszter egy kérdés, hogy mi teszi és létezik, és ezért hogyan kell használni, vagy kéri, hogy írja át az SQL átírása, a használat, vagy fordítva, jó ötlet?

Azt hiszem, közvetlen választ ad. Miért nem ellenőrizte azokat az emberektől, akik fejlesztették ezt a funkciót a rendszereikben?

Ha Ön az SQL fejlesztői, itt a Microsoft válasza.

Meghatározza, hogy a megadott érték megfelel-e az alosztályban vagy a listában lévő értéknek.

Megadja a szubkvert, hogy ellenőrizze a létezését a karakterláncok.

Bizonyos körülmények között jobb, ha létezik, mint létezik. Általában, ha a szelektív predikátum az alpontban van, akkor használja. Ha a szelektív predikátum a szülői lekérdezésben van, akkor léteznek.

BAN BEN. Csak az egyenlőség (vagy egyenlőtlenség, mikor megelőzi Nem.).
Ez szinonimája \u003d bármilyen / \u003d Néhány , például

Válassza a * from t1-t, ahol x in (válassza az X from t2-t);

LÉTEZIK. Támogatja az olyan kapcsolatok típusát, amelyeket nem lehet kifejezni BAN BEN. , például -

Válassza ki a * t1-et, ahol létezik (válassza ki a NULL-t a T2-ről, ahol t2.x \u003d t1.x és t2.y\u003e t1.y és t2.z, mint "℅" || t1.z || "℅");

És egy másik megjegyzéssel -

Becsült teljesítmény és technikai különbségek között LÉTEZIK. és BAN BEN. Ezek egy adott beszállító konkrét megvalósításai / korlátozásai / hibái miatt merülhetnek fel, de sok esetben nem más, mint a belső adatbázisok elégtelen megértése miatt létrehozott mítoszok.

A táblázatok meghatározásának pontossága, a statisztikák pontossága, az optimalizáló adatbázis-konfigurációja és verziója befolyásolja a végrehajtási tervet, és ezért a teljesítménymutatókat.

"Nagyon könnyebb volt" - gondoltam, leültem az SQL Management Studio következő kérésének optimalizálására. Amikor a MySQL alatt írtam, nagyon könnyebb volt - vagy működik, vagy sem. Vagy lelassul vagy nem. Magyarázd el az összes problémám megoldását, semmi többre nem volt szükség. Most van egy erős fejlesztés, hibakeresési és optimalizálási környezet és eljárások / funkciók, és mindezek ez a zavaró véleményem szerint csak további problémák merülnek fel. És miért? Mivel a beépített lekérdezési optimalizáló gonosz. Ha a mysql és a posztgresql-ben írok

Válassza a * A, B, C-ről, ahol A.ID \u003d B.ID, B.ID \u003d C.ID

És mindegyik asztalnál legalább 5k vonal lesz - minden fog lógni. És hála Istennek! Mert másképp a fejlesztőben, a legjobb esetben, hogy sokat írjon, és a legrosszabb, hogy nem érti, mit csinál! Végtére is, ugyanaz a lekérdezés az MSSQL-ben hasonló lesz

Válassza ki a * csatlakozás B-t az A.ID \u003d B.ID Csatlakozzon a C-ra a B.ID \u003d C.ID

A beépített optimalizáló a szarvasmarháknál kerül sor, és minden lesz az ok.

Azt is eldönti, hogy jobb, ha - létezni vagy csatlakozni és sokkal többet. És minden optimálisan működik.

Csak van egy, de. Egy pillanatra az optimalizáló komplex lekérdezéssé válik, és megmenti, majd kapsz egy méhsejt problémát. És talán nem azonnal, de ha az asztal súlya eléri a kritikus tömeget.

Tehát a cikk lényegében. Létezik, és nagyon nehéz műveletek. Valójában ez egy külön szubkodás az egyes Varrási eredmények. És ha van fészkelő, akkor ez általában egy hasított fény. Minden lesz rendben, amikor 1, 10, 50 sor visszatér. Nem fogod érezni a különbséget, és talán csatlakozik még lassan is. De amikor 500-at veszi fel - a problémák megkezdődnek. Az egyetlen kérelemen belül 500 szubkókák komolyak.

Legyen az emberi megértés szempontjából, és létezik, de az ideiglenes költségek szempontjából 50+ karakterláncot hoznak létre - nem megengedettek.

Szükséges egy fenntartást, amely természetesen, ha valahol csökken - valahol meg kell érkeznie. Igen, csatlakozom az erőforrás-memóriában, mert az, hogy a teljes táblázatot az értékek és működtetni, hogy - mint felső réteget húzni a subqueries az egyes vonalakra gyorsan felszabadítja a memóriát. Szükség van konkrét kérésre, és mérni kell, hogy a felesleges memória használata kritikus-e vagy sem.

Példákat adok a teljes analógiákra. Általánosságban elmondható, hogy nem találkoztam több ilyen nehézséggel olyan nehézséggel, amelyet nem lehetett a Csatlakozás kaszkádába. Hagyja, hogy menjen hozzá, de mindenki feltárható.

Válassza ki a * -ot az A.ID-tól (válassza ki az ID-t b) lehetőséget a * -ról a * -ról (válassza ki a top 1 1-et a b, ahol B.ID \u003d A.ID) Válassza ki a * a B csatlakozás B-t az A.ID \u003d B. ID Válassza ki a * -ot a * -ról az A.ID-ről (válassza ki az ID-t b) lehetőséget a * -ról a * -ról, ahol nem létezik (válassza a TOP 1 1 értéket a b, ahol B.ID \u003d A.ID) Válassza ki a * bal oldali csatlakozást. Id \u003d B.ID, ahol B.ID NULL

Ismétlem - ezek az MSSQL optimalizáló példái optimalizálják a maximális teljesítményt, és soha nem lesznek ilyen egyszerű lekérdezések.

Fontolja meg most egy példát egy igazi kérésre, amely átírnia kellett, mivel az a tény, hogy egyes mintákban egyszerűen függött (a struktúra nagyon egyszerűsített, és a fogalmakat kicserélik, nem szükséges megijeszteni néhányat az adatbázis optimalitását szerkezet).

Meg kell húzni a "termékek" másolatát különböző számlákban, összpontosítva a termék paramétereire, annak csoportjára és a szülőcsoportra, ha van ilyen.

Válassza a D.PRODUCT_ID terméket S, termék_group sg bal csatlakozzon M_PG_DEPENDY SD ON (SG.PRODUCT_GROUP_ID \u003d sd.m_pg_dependency_child_m.m_pg_dependency_child_id), Product_Group DG Balra Csatlakozzon M_PG_DEPENDENCE DD ON (DG.PRODUCT_GROUP_ID \u003d DD.M_PG_GROUPENCE_CHILD_ID), ahol s.product_group_id \u003d sg .PRODUCT_GROUP_ID és d.PRODUCT_GROUP_ID \u003d dg.PRODUCT_GROUP_ID és sg.PRODUCT_GROUP_PERSPEC \u003d dg.PRODUCT_GROUP_PERSPEC és sg.PRODUCT_GROUP_NAME \u003d dg.PRODUCT_GROUP_NAME és s.PRODUCT_NAME \u003d d.PRODUCT_NAME és s.PRODUCT_TYPE \u003d d.PRODUCT_TYPE és s.PRODUCT_IS_SECURE \u003d d.PRODUCT_IS_SECURE és s.product_multiselect \u003d d.product_multiselect \u003d d.product_gultiselect és dg.product_group_is_tmpl \u003d 0 és ((sd.m_pg_dependency_child_id null és dd.m_pg_dependency_child) null), vagy létezik (válassza ki az 1-et a PRODUCT_GROUP SG1, PRODUCT_GROUP DG1, ahol sd.m_pg_dependency_park_id \u003d sg1.product_group_id és dd .M_pg_dependency_parent_id \u003d DG1.PRODUCT_GROUP_ID és SG1.PRODUCT_GROUP_PERSPEC \u003d DG1.PRODUCT_GROUP_PERSPEC és SG1.PRODUCT_GROUP_NAME \u003d DG1.PRODUCT_GROUP_N Ame és)

Tehát ez a helyzet, amikor az optimalizáló megmenti. És minden sorban nehéz létezik, ami megölte az alapot.

Válassza d.PRODUCT_ID származó termék ek csatlakoznak TERMÉK d szóló s.PRODUCT_TYPE \u003d d.PRODUCT_TYPE és s.PRODUCT_NAME \u003d d.PRODUCT_NAME és s.PRODUCT_IS_SECURE \u003d d.PRODUCT_IS_SECURE és s.PRODUCT_MULTISELECT \u003d d.PRODUCT_MULTISELECT csatlakozzon PRODUCT_GROUP vmit s.PRODUCT_GROUP_ID \u003d sg.PRODUCT_GROUP_ID csatlakozzon PRODUCT_GROUP dg on d.PRODUCT_GROUP_ID \u003d dg.PRODUCT_GROUP_ID és sg.PRODUCT_GROUP_NAME \u003d dg.PRODUCT_GROUP_NAME és sg.PRODUCT_GROUP_PERSPEC \u003d dg.PRODUCT_GROUP_PERSPEC elhagyta csatlakozzon M_PG_DEPENDENCY sd a sg.PRODUCT_GROUP_ID \u003d sd.M_PG_DEPENDENCY_CHILD_ID bal join M_PG_DEPENDENCY dd dg.PRODUCT_GROUP_ID \u003d dd.M_PG_DEPENDENCY_CHILD_ID elhagyta csatlakozzon PRODUCT_GROUP SNP a sgp.PRODUCT_GROUP_ID \u003d sd.M_PG_DEPENDENCY_PARENT_ID elhagyta csatlakozzon PRODUCT_GROUP dgp on dgp.PRODUCT_GROUP_ID \u003d dd.M_PG_DEPENDENCY_PARENT_ID és sgp.PRODUCT_GROUP_NAME \u003d dgp.PRODUCT_GROUP_NAME és ISNULL (sgp.PRODUCT_GROUP_IS_TMPL, 0) \u003d ISNULL (DGP. Termék_group_is_tmpl, 0) Hol (sd.m_pg_dependency_child_id null és dd.m_pg_dependency_child_id null) vagy (sgp.product_group_name nem null és a dgp.product_group_name nem null)

Ezen átalakulások után a mélyedések termelékenysége exponenciálisan növelte a talált termékek számát. Inkább a keresési idő szinte független maradt a véletlenségek számától, és mindig nagyon kicsi volt. Ahogy kell.

Ez jó példa arra, hogy az MSSQL bizalom egy optimalizáló, kegyetlen viccet játszhat. Ne bízz benne, ne légy lusta, csatlakozzon a fogantyúk, gondolj minden alkalommal, amikor jobb ebben a helyzetben - létezik, vagy csatlakozik.

Az SQL létezik a predikátum logikai feladatot végez. Az SQL lekérdezéseknél ezt a predikátumot a faj kifejezések használják

Létezik (válassza a * Nate_Table ...) lehetőséget.

Ez a kifejezés visszaadja az igazságot, ha egy vagy több vonal megfelel az állapotnak, kérésre, és hazugság, ha nincs karakterlánc.

Mert nem létezik, fordítva. Kifejezés

Nem létezik (válassza a * Nate_Table ...) lehetőséget

visszaadja az igazságot, ha nem találunk karakterláncot kérésre, és egy hazugság, ha legalább egy sor található.

A legegyszerűbb lekérdezések a predikátummal rendelkező SQL-vel rendelkeznek

A példákban dolgozunk a könyvtári adatbázissal és könyvében a használatban lévő könyvben (Bookinuse) és a "Felhasználó" (felhasználó). Miközben csak a könyv "Bookinuse könyvben van szüksége).

SzerzőCímPubyear.Inv_no.Felhasználói azonosító
KeményHáború és béke2005 28 65
ChekhovA cseresznye gyümölcsös2000 17 31
ChekhovKiválasztott történetek2011 19 120
ChekhovA cseresznye gyümölcsös1991 5 65
Ilf és PetrovA tizenkét szék1985 3 31
MaakovszkijPois1983 2 120
PaszternákOrvos Zhivago2006 69 120
Keményvasárnap2006 77 47
KeményAnna Karenina1989 7 205
TollasKapitány lánya2004 25 47
Gogol.Darabok2007 81 47
ChekhovKiválasztott történetek1987 4 205
PaszternákKedvencek2000 137 18

1. példa.Határozza meg azokat a felhasználók azonosítóját, akiket a Tolstoy Books-nak adnak ki, amelyeket a Chekhov könyvei is kiállítottak. Külső lekérdezésben az adatokat a Tolstoy Books által kiadott felhasználóknál választják ki, és áll fenn a predikátum meghatározza azt a további feltételeket, amelyet egy belső kérésben ellenőriztek - a Chekhov könyvei által kiadott felhasználók. A belső kérelem további feltétele a külső és belső igények felhasználói azonosítók egybeesése: user_id \u003d tols_user.user_id. A kérés a következő:

Ez a lekérdezés visszaadja a következő eredményt:

Létezik és a predikátum különbségekben

Amikor először nézed meg a predikátummal kapcsolatos kéréseket, lenyűgözött, hogy azonos megrajzol . Ez nem igaz. Bár nagyon hasonlóak. A predikátumban az értékek keresése az argumentumban meghatározott tartományból, és ha vannak ilyen értékek, akkor az összes tartománynak megfelelő sorok vannak kiválasztva. A létező predikátum eredménye az "igen" vagy "nem" válasz, hogy vannak-e olyan jelentések, amelyek alkalmasak az érvelésben. Ezenkívül a predikátum előtt az oszlop nevét, amelyen a sorokat a tartományban lévő értékeknek megfelelőnek kell tekinteni. Elemezzünk egy példát, amely bemutatja a predikátumból származó predikátum közötti különbséget, és a feladat megoldásának megoldása.

4. példa. Határozza meg azokat a felhasználók azonosítását, akiket a szerzők könyvei adnak ki, akiknek könyvei a felhasználónak az ID 31. azonosítóval kerülnek kiadásra. A kérés a következő:

Felhasználói azonosító
120
65
205

Belső kérés (után) Kiválasztja a szerzőket: Chekhov; Ilf és Petrov. A külső kérésre kiválasztja az összes felhasználó, aki már kiadott könyvek E szerzők. Látjuk, hogy a létező predikátummal ellentétben a predikátumot az oszlop neve előzi meg, ebben az esetben - szerző.

A predikátummal kapcsolatos kérések és további feltételek

Ha a lekérdezésben szereplő létező predikátum mellett legalább egy további állapotot kell alkalmazni, például a Összesített funkciók Az ilyen kérések egyszerű adatelemzésre használhatók. Ezt a következő példában mutatjuk be.

5. példa.Határozza meg az azonosító azonosítóját, akiket legalább egy Pasternak egyik könyvet adtak ki, és ugyanakkor több mint 2 könyvet adtak ki. Mi írjuk a következő kérést, amelyben az első állapotot egy befektetett kérelemmel rendelkező predikátum állítja be, és a második feltétel, amelynek operátora mindig a befektetett kérelem után kell követnie:

Kérjen eredmény:

Felhasználói azonosító
120

Amint a Bookinuse táblázatból látható, a Pasternak könyve is ki van adva a 18 azonosítóval rendelkező felhasználónak, de csak egy könyv kerül kiadásra, és nem esik a mintába. Ha újra alkalmazza a számláló funkciót egy hasonló lekérdezésre, de már a kiválasztott vonalakhoz (gyakorolja magát), akkor információt kaphat arról, hogy hány felhasználó olvassa el a Pasternak könyveit, miközben más szerzők könyveit olvassa. Ez már az adatelemzés köréből származik.

A predikátummal rendelkező kérések két táblázatra vonatkoznak

Létezik a predikátum kérései több mint egy táblázatból származó adatokat. Sok feladatot ugyanazzal az eredményt lehet megoldani operátor csatlakozik. De egyes esetekben a létező használata lehetővé teszi, hogy kevésbé nehézkes kérelmet készítsen. Használható olyan esetekben, amikor az oszlopok csak egy táblázatból származnak.

A következő példában ugyanabból az adatbázisból, a Bookinuse táblázat mellett a "Felhasználó" táblázat is szükséges.

A lekérdezés eredménye az alábbi táblázat:

Szerző
Chekhov
Maakovszkij
Paszternák

Mint a Csatlakozáskezelő használata esetén, egynél több táblázat esetén az asztali álneveket kell használnia, hogy ellenőrizze az asztalok összekötő kulcsértékek megfelelőségét. Példánkban Pseudonyms - BK és USA, valamint az asztalok csatlakoztatása - USER_ID.

Létezik több mint két táblázat csatlakoztatásában

Most már többet fogunk látni, hogy azokban az esetekben, amikor az oszlopok csak egy táblázatból származnak.

Az "Ingatlan" adatbázisban dolgozunk. Az üzlet táblázat az ügyletekre vonatkozó adatokat tartalmaz. A táblázatban szereplő feladatainkhoz fontos típusú oszlop lesz az adatok típusától a tranzakció típusáról - értékesítés vagy bérlés. Az objektum táblázat tartalmaz adatokat az objektumokra. Ebben a táblázatban szükségünk lesz a szobák oszlopainak (a szobák száma) és a logbalc értékeire, amely egy loggia vagy erkély jelenlétét tartalmazza a loggia formátumban: 1 (igen) vagy 0 (nem). Táblázási ügyfél, menedzser és tulajdonos adatokat tartalmaz az ügyfelek, a vállalat vezetői és az ingatlan tárgyak tulajdonosai. Ezekben a táblázatokban az Fname és az LName, illetve a név és a vezetéknév.

7. példa. Azonosítsa azokat az ügyfeleket, akik olyan tárgyakat vásároltak vagy bérelnek, amelyeknek nincsenek loggia vagy erkély. Mi írjuk a következő kérést, amelyben a létező predikátum két táblázat csatlakoztatása következtében van beállítva:

Mivel az oszlopok a Star Operator segítségével vannak kiválasztva, akkor megjelenik a táblázat összes oszlopa, amelyben annyi sor lesz, amennyiben az ügyfelek összhangban állnak a rendelkezésre álló feltételekkel. A táblázatokból, amelyekre a csatolt kérést rajzoljuk, nem kell egyetlen oszlopot kiutazni. Ezért csak egy oszlopot extrahálunk a gépi idő mentéséhez. Ehhez a szó kiválasztása után egy egység van előírva. Ugyanazt a vételt alkalmazzák a következő példákban lévő lekérdezésekben is.

Írjon egy SQL lekérdezést a létező predikátummal, majd nézze meg a döntést

Továbbra is írjuk az SQL kéréseket a Predikátummal

9. példa. Meghatározza a bérelt tárgyakat. Mi írjuk a következő kérést, amelyben a létező predikátumot két táblázat összekapcsolására is vonja be:

Mint az előző példában, az asztalról, amelyhez a külső kérelem címzettje van, minden mező megjelenik.

10. példa. Határozza meg a tulajdonosok számát, amelynek tárgyait egy Saveliev menedzser végezték. Írunk egy kérést, amelyben egy külső kérés három táblázat csatlakoztatására vonatkozik, és a létező predikátum csak egy táblázatra vonatkozik:

Minden kérést egy meglévő adatbázisban ellenőrzik. Sikeres használat!

Relációs adatbázisok és SQL nyelv

Novosibirsk Állami Közgazdaságtudományi Akadémia és menedzsment

Laboratóriumi műhely a fegyelemen

"Adatbázis"

Laboratóriumi munka N 7

"SQL adatbázis nyelv: adat-manipulációs csapatok»

Novosibirsk 2000.

Az SQL a strukturált lekérdezési nyelv (strukturált lekérdezési nyelv) rövidített neve. A nyelv címétől nyilvánvaló, hogy fő célja az adatbázisból származó információk kéréseinek kialakítása. Az adatválasztás parancsok alkotják a DML adatkezelési nyelvet - az SQL nyelv összetevőjét. A DML azonban nem csak az adatmintavételi parancsokból áll az adatbázisból. Vannak parancsmódosítási parancsok, adatkezelés és mások is.

A laboratóriumi munka tárgyalja a DML nyelv alapvető eszközeit. A laboratóriumi munka elvégzésének folyamatában az SQL2 szabványhoz ragaszkodunk.

Ennek köszönhetően, hogy az SQL egy nagyszerű nyelv, csak a főparancsokat vizsgáljuk. Különböző SQL-specifikus eszközöket tárgyalunk a későbbi laboratóriumi munkában.

A laboratóriumi munka elvégzéséhez a relációs adatmodell alapjainak ismerete, a relációs algebra alapjai és a relációs számítás alapjai, az MS SQL Server DBMS-vel való együttműködés elvei.

A laboratóriumi munka eredményeképpen elsajátították az adatok manipulálását az SQL parancsokkal, tekintse meg az SQL Server DBMS-ben végrehajtott nyelvi dialektusokat.

Bevezetés

Az SQL számos adatkezelési lehetőséget tartalmaz, mindkettő lekérdezések létrehozásához és az adatbázis frissítéséhez. Ezek a képességek csak az adatbázis logikai struktúráján alapulnak, és nem a fizikai struktúráján, amely összhangban van a relációs modell követelményeivel.

Kezdetben az SQL szintaxis struktúrája alapult (vagy legalábbis úgy tűnt, hogy megalapozott) a kód relációs számításánál. Az egyetlen támogatott relációs algebra támogatás volt egyesült.

Az SQL2-ben az előző szabványban kifejlesztett szintaxis hasonló relációs kiszámítása mellett a műveleteket közvetlenül kombinálják, metszés, különbség és vegyületek kombinálásával, metszéssel, különbséggel és vegyületekkel. A választás, a tervezés és a munkák működését szinte közvetlenül tartották (és továbbra is támogatták), míg a hasadási és megbízási műveletek sokkal nehezebb formában vannak támogatva.

Először leírjuk az SQL lekérdezési nyelvet, majd a bemenetét és az adatokat. Az adatváltási műveleteket az utolsó leírások leírják, mivel szerkezete bizonyos mértékben a lekérdezési nyelv szerkezetén alapul.

Egyszerű kérések

Nekünk egyszerű kérés Lekérdezés lesz, amely csak egy adatbázis-táblára vonatkozik. Az egyszerű kérések segítenek bemutatni az SQL alapszerkezetét.

Egyszerű kérés. A lekérdezés, amely csak egy adatbázis-táblára vonatkozik.

Vizsgálat: Ki működik a vakolatok?

Ahol Skill_Type \u003d "Plastekers"

Eredmény:

Ryikover

Ez a kérés szemlélteti a három leggyakrabban találkozott. mondatok SQL: Válassza ki, hogy hol. Bár példánkban különböző vonalakra helyeztük őket, mindegyike ugyanabban a sorban állhat. Különböző retardokkal is elhelyezhetők, és a szavak belső mondatai önkényes szóközzel elválaszthatók. Tekintsük az egyes kifejezések jellemzőit.

Kiválaszt. A kiválasztott kifejezés felsorolja azokat az oszlopokat, amelyeket be kell jelentkezni a kapott táblázatba. Mindig néhány relációs asztal oszlopa. Példánkban a kapott táblázat egy oszlopból (név), de általában több oszlopot tartalmazhat; Tartalmazhat kiszámított értékeket vagy konstansokat is. Példákat adunk mindegyik lehetőségre. Ha a kapott táblázatnak több oszlopot kell tartalmaznia, akkor az összes szükséges oszlop a vesszőn keresztüli kiválasztási parancs után szerepel. Például a Select Worker_Id kifejezés, a név a WORPER_ID és a Név oszlopokból álló táblázatot eredményez.

PHRASE SELECT. Megadja a kapott táblázat oszlopait.

Tól től.. A kifejezésből egy vagy több táblázatot állít be, amelyekre a kérelmet említik. A kiválasztott és ahol a kifejezések a parancsparancsban felsorolt \u200b\u200btáblázatok egyikében kell létezniük. Az SQL2-ben ezek a táblázatok közvetlenül a rendszerben alapulhatnak az alap táblázatokban vagy az adatok ábrázolásaként, vagy maguk is nem rendelkeznek az SQL kérések eredményeként kapott táblázatokat. Az utóbbi esetben a kérés kifejezetten hivatkozik a parancsban.

Kifejezés. Megadja a meglévő táblázatokat, amelyekre a kérelmet említik.

Hol. A kifejezés, ahol a kifejezés feltétele. Amelyen az asztal sorai (táblák) vannak kiválasztva. Példánkban az a feltétel, hogy a Skill_type oszlopnak tartalmaznia kell egy "gipsz" állandó állást, amely az Apostrophes-ben van, mint az SQL-ben lévő szöveges állandókkal. A kifejezés a legváltozatosabb SQL parancs; Különböző feltételeket tartalmazhat. A prezentációnk nagy részét különböző formatervezési minták illusztrációként fogják szentelni, ahol a parancsban megengedett.

Kifejezés, ahol.Beállítja azt az állapotot, amelyen a megadott táblázatokból származó vonalak vannak kiválasztva.

A fenti SQL lekérdezést a rendszer a következő sorrendben dolgozza fel: a, ahol, válasszon. Ahhoz, hogy a parancsparancsban megadott táblázat sorai a feldolgozáshoz a műhelybe kerüljenek. Ezután az egyes sorokhoz használt mondatot használják. Minden olyan sor, amely nem felel meg, hol nem zárja ki a feltételeket. Ezután azok a húrok, amelyek megfelelnek a kiválasztott parancs által feldolgozva. Példánkban a név minden ilyen vonal közül választott, és az összes kiválasztott érték lekérdezési eredményként jelenik meg.

Vizsgálat: Az irodák épületekre vonatkozó összes adatot törölje.

Hol típus \u003d "Office"

Eredmény:

BLDG IDADRESTYPEQLTY LEVELSTATUS.

312 ul.v., 123 Office 2 2

210 nyírfa ul. 1011 Iroda C 1

111 Osinovaya ul. 1213 Office 4 1

A SELECT COMMITY ASTERISK (*) a "teljes sort" jelenti. Ez egy kényelmes csökkentés, amelyet gyakran használunk.

Vizsgálat: Mi az egyes villanyszerelő heti fizetése?

Válassza ki a név, a "Heti fizetés = ", 40 * hrly_rate

Ahol Skill_Type \u003d "Elektromos"

Eredmény:

M. Faraday heti fizetés \u003d 500.00

H.Colbumb Heti fizetés \u003d 620.00

Ez a kérés használatát szemlélteti és szimbolikus állandók (példánkban „heti fizetést \u003d”), és számítások a SELECT parancs, belül a SELECT parancs lehet számítani, amelyben a numerikus oszlopok és számkonstanst használnak, valamint aritmetikai operátorok ( +, -, *, /), a zárójelek használatával csoportosítottak. Azt is bevonta az új rendelés parancsot, amely a megadott oszlop által a növekvő alfanumerikus sorrendben lévő lekérdezés eredményét rendezi. Ha meg akarja rendelni az eredményeket csökkenő, akkor hozzá kell adnia egy Desc-t a parancsra. A rendelet kifejezés szerint számos oszlopban rendezheti az eredményeket, az egyikben - a növekedés érdekében, mások szerint - csökkenő sorrendben. Az első jelzi az elsődleges rendezési kulcs oszlopát.

Szimbolikus állandó. Állandó betűkből, számokból és "különleges" karakterekből áll.

Vizsgálat: Kinek van egy óradíj 10-12 dollárról?

Ahol hrly_rate\u003e \u003d 10 és hrly_rate< - 12

Eredmény:

Munkavállalói azonosító. Név HRLY_RATE SKIRT_TYPE SUPV_ID

Ez a kérés néhány további lehetőséget mutat a parancsra: összehasonlító üzemeltetők és logikai műveletek és (ok). Az oszlopok összehasonlítása más oszlopokkal vagy állandókkal, hat összehasonlító operátor használható (\u003d,<> (nem egyenlő),<, >, <=, >\u003d). Összetett feltételek vagy tagadás, logikai műveletek és (ok), vagy (vagy), és nem (nem) használható. A csoportosulok csoportosítása a programozási nyelveken, a zárójeleket használhatjuk.

Az operátorok összehasonlítása \u003d,<>, <, >, <=, >=.

Boolean műveletekÉs (s), vagy (vagy), és nem (ő) .

A kérés megfogalmazásához használhatja a következő (között):

Ahol hrly_rate 10 és 12 között van

A két másik értékű mennyiség összehasonlítására használható, amelyek közül az első kisebb, mint a második, ha az összehasonlító érték egyenlő lehet mindegyik értékével vagy bármely értékkel.

Kérés: Lista vakolók, tetőfedőek és villanyszerelők.

Ahol Skill_Type ("Plastekers", "Roofer", "Electric")

Eredmény:

WORKER_ID NAME HRLY_RATE SKIRT_TYPE SUPV_ID

1412 K.NOO 13.75 Gipszkarterek 1520

2920 R.Garret 10.00 Roofer 2920

1520 Rykovover 11.75 Gipszkarterek 1520

Ez a kérés megmagyarázza a (b) összehasonlító üzemeltető használatát. Az a helyzet, ha a feltétel igaz, ha a speciális vonal típusát a zárójelben megadott készlet belsejében helyezkedik el, vagyis, ha a specialitás fajtája vakolat, tetőfedő vagy villanyszerelő. Találkozunk a Subqueries input operátorral.

Tegyük fel, hogy nem tudjuk pontosan emlékezni a specialitás írásában: "Elektromos" vagy "elektrik" vagy valahogy. Sablon szimbólumok, amelyek a homályos karakterek helyettesítése megkönnyítik a pontatlan írás keresését a lekérdezésben.

Sablon szimbólumai.Szimbólumok, amelyek a karakterláncos karakterláncokat helyettesítik.

Vizsgálat: Sorolja fel az alkalmazottakat, akiknek a specialitása "Ele" -vel kezdődik.

Ahol a Skill_Type, mint ("Elek%")

Eredmény:

WORKER ID NAME HRLY_RATE SKIRT_TYPE SUPV_ID

1235 m. Faraday 12.50 villanyszerelő 1311

1311 x.columba 15.50 villanyszerelő 1311

Az SQL két sablon szimbólummal rendelkezik:% (százalék) és _ (aláhúzás). Az aláhúzás pontosan egy határozatlan szimbólumot helyettesít. A százalékos arány tetszőleges számú karakterből áll, a nullától kezdődően. A sablonszimbólumok használatakor egy hasonló operátor (AS) alkalmazható a szimbolikus változók összehasonlítására konstansokkal. Más példák:

Név, mint "__ Columb"

Név, mint a "__K%"

Az első példa állapota igaz, ha a név két karakterből áll, amelyet Columbus követ. A munkásasztalon minden név az első kezdeti és ponttal kezdődik. Így ezt a feltételt felhasználjuk. Az összes alkalmazottat a "Columbus" név szerint találjuk meg. A második példa állapota lehetővé teszi, hogy megtalálja az összes olyan alkalmazottat, akinek a neve a "K" betűvel kezdődik.

Vizsgálat:Keresse meg az összes két héten elinduló munkát.

Ahol indulnak _date a current_date és

Eredmény: (Tegyük fel, hogy az aktuális dátum aktuális dátuma \u003d 10.10)

WORKER_ID BLDG_ID START_DATE NUM_DAYS

1235 312 10.10 5

1235 515 17.10 22

3231 111 10.10 8

1412 435 15.10 15

3231 312 24.10 20

1311 460 23.10 24

Ez a kérés szemlélteti az üzemeltető (a dátum) és az intervallum értékek közötti használatát. A Current_Date olyan funkció, amely mindig visszaadja a mai dátum értékét. Kifejezés

Current_date + intervallum "14" nap

kéthetes intervallumot ad az aktuális dátumhoz. Így a hozzárendelés kiválasztásra kerül (mint a ma 10.10 feltételezéseként) abban az esetben, ha a START_DATE oszlop értéke 10.10 és 24.10 között helyezkedik el. Ebből látható, hogy hozzáadhatunk az intervallum típusának értékeit. Ezenkívül meg tudjuk szorozni az egész számok hiányait. Tegyük fel például, hogy meg szeretnénk tudni, hogy milyen számon lesz egy bizonyos számú hetes (jelezve a NUM_WEEKS változó (hetek száma)). Ezt úgy tehetjük meg:

Current_date + intervallum "7" nap * NUM_WEEKS

2. Többszörös kérések

Az adatelemek ugyanazon a táblázaton kívüli adatelemek összekapcsolásának képessége minden adatbázis-nyelv számára fontos. A relációs algebra-ban ez a funkció végrehajtja a kapcsolat működését. Bár az SQL jelentős része közvetlenül relációs kalkuluson alapul, az SQL a különböző táblázatokból származó adatokat ugyanúgy köti össze, mint a kapcsolódó relációs algebra működését. Most megmutatjuk, hogyan történik meg. Tekintsük a lekérdezést:

Vizsgálat:

A válaszhoz szükséges adatok két táblázatban vannak: munkás és megbízás. Az SQL-ben való megoldáshoz fel kell sorolni mindkét táblázatot a parancsban, és állítsa be a különleges típusú állapotot:

Válassza a Skill_Type lehetőséget.

A munkavállalótól, hozzárendelésből

Ahol a munkavállaló.worker_id \u003d hozzárendelés.worker_id

És blundg_id \u003d 435

Mi folyik itt? Meg kell vizsgálnunk a kérés rendszerének feldolgozásának két szakaszát.

1. A szokásos módon a kifejezést először feldolgozzák. Ebben az esetben azonban, mivel a csapat két asztalt tartalmaz, a rendszer létrehoz egy dekartant terméket ezeknek a táblázatoknak. Ez azt jelenti, hogy létrehozott (logikailag) egy nagy asztal, amely mindkét asztal oszlopa, amelyben az egyik asztal minden vonala párosítva egy másik táblázat minden sorával. Példánkban, mert öt oszlop van a munkavállalói asztalon, és négy oszlop van a hozzárendelési táblázatban, a Czecional Command-i munkahelyen, kilenc oszlop lesz. A termék dekorsztári vonalainak teljes száma m * n, ahol m a munkás asztal húrjainak száma; A n a hozzárendelési táblázat sorai. Mivel a munkavállalói táblázat 7 sorban és a 19 sorrendben a 19 sorrendben található, akkor a karteziai termék 7x19 vagy 133 vonalat tartalmaz. Ha a parancsok listája több mint két táblázatot sorol fel, akkor a parancsban megadott összes táblázat dekartant termékét hozza létre.

Karteziai munka. Az egy asztal minden egyes vonalának kombinálásának eredménye minden egyes Egy másik asztal sora.

2. Miután létrehozott egy óriás relációs táblát, a rendszert, mint korábban, használja a parancsot. A parancs által létrehozott táblázat minden sora. Ellenőrizték, hogy a helyzet feltétele legyen. A feltételeket nem megfelelő sorok kizárják a megfontolásból. Ezután a kiválasztott kifejezés a fennmaradó sorokra kerül.

A kérésünkben a kifejezés két körülményt tartalmaz:

1. Munkás. WORPER_ID \u003d hozzárendelés.worker_id

2. BLDG_ID \u003d 435

Az első ilyen feltételek a kapcsolat állapota. Kérjük, vegye figyelembe, hogy mivel mind a munkavállaló, mind a megbízási táblázatok tartalmazzák a Worker_ID nevű oszlopot, a karteziai munkájuk két azonos nevű oszlopot tartalmaz. Annak érdekében, hogy megkülönböztessük őket, a forrás táblázat oszlopának nevét megelőzően helyeztük el, elválasztva pontját.

Az első feltétel azt jelenti, hogy bármelyik kiválasztott sávban a munkavállalói táblázatban lévő munkavállaló_ID oszlop értékének meg kell egyeznie a munkavállalói oszlop értékét a hozzárendelési táblázatból. Valójában két asztalt csatlakoztatunk a WORPOR_ID segítségével. Minden olyan vonal, amelyben a két oszlop értékei nem egyenlőek, kizárják a munkatáblából. Pontosan ugyanaz a dolog történik, ha a relációs algebra természetes csatlakozását végzi. (Ugyanakkor a természetes kapcsolattól való különbség még mindig ott van: az SQL nyelv automatikusan nem törli automatikusan a WORPEN_ID sütő oszlopát). A két táblázat teljes csatlakoztatása további állapotú BLDG_ID \u003d 435 ábrán látható az 1. ábrán. 1. A SELECT parancs alkalmazása végül a végén a következő lekérdezési eredmény:

Készségtípus

Vakoló

Tetőfedő

Egy elektronikus

Ábra. 1. A munkavállalók és a hozzárendelési táblák csatlakoztatása

Most megmutatjuk, hogyan kell csatolni az asztalt az SQL-ben.

Vizsgálat: Sorolja fel az alkalmazottakat, meghatározza a vezetők nevét.

Válassza az A.Worker_Name, B.worker_Name lehetőséget

A munkavállaló, a munkavállaló

Ahol b.worker_id \u003d a.supv_id

A példa szerinti kifejezés két példányt hoz létre a munkavállalói asztal két "példánya", így az A és a V. pszeudonim álnevezése - ez egy alternatív név az asztalhoz. Ezután példányban A és a munkavégző táblázatban vannak csatlakoztatva a ahol parancs alapján a feltétele a worker_id egyenlőség B és supv_id A. Így, minden sor tól kapcsolódik a B-vonal, amely információt tartalmaz a Row menedzser (Fig . 2).

Ábra. 2. A munkás asztal két példányának összekapcsolása

Az egyes sorok közül két alkalmazott nevét választjuk, megkapjuk a kívánt listát:

A.names.name.

M. Faraday H. Columbus

K. ELEO Ryikover R. Gareret R. GARRRERET

P. Mayson P.mayson Ryikover Ryikovener H.Colbum X.columba J. Barrister P. Maison

Álnév. Az asztalnak adott alternatív név.

A.worker_Name képviseli a munkavállalót, a b.worker_name képviseli a menedzsert. Felhívjuk figyelmét, hogy egyes dolgozók vezetők maguk, ami következik worker_id - supv_id végre a sorokat.

Az SQL-ben több mint két táblázatot érhet el egyszerre:

Vizsgálat

Válassza ki a WORPER_NAME lehetőséget.

A munkavállalótól, hozzárendelésből, épületből

Ahol a munkavállaló.worker_id \u003d hozzárendelés.worker_id és hozzárendelés.bldg_id \u003d building.bldg_id és

Típus \u003d "Office"

Eredmény:

M. Faraday

Ryikover

J. Barristers

Kérjük, vegye figyelembe, hogy ha a neve az oszlop (például Worker_ID vagy BLDG_ID) nem észlel több, mint egy táblázat, akkor bizonytalanság elkerülése érdekében, meg kell adnia a nevét, a forrás tábla előtt az oszlop nevét. De ha az oszlop neve csak egy asztalnál található, például a példánk típusához, akkor nincs bizonytalanság, így nem kell megadnia az asztal nevét.

A lekérdezés SQL parancsai három relációs adatbázis táblázatot tartalmaznak. Az első két táblázat a WORPOR_ID csatlakozik, majd a harmadik táblázat a Bldg_ID asztalra van csatlakoztatva. Feltétel

Típus \u003d "Office"

ahol a parancsok az összes vonal kivételével, kivéve az irodaházakkal kapcsolatos vonalakat. Ez megfelel a kérelem követelményeinek.

3. Subqueries

Subquery.Kérés a lekérdezésen belül

A szubkorok elhelyezhetők a lekérdezési parancsba, amelynek eredményeképpen a parancs lehetősége bővül. Fontolja meg a példát.

Vizsgálat: Melyek a 435-es épülethez rendelt speciális munkások?

Válassza a SKTLL_TYPE lehetőséget.

A munkavállalóra, ahol a munkavállaló_id

(Válassza a Worker_ID lehetőséget

Ahol bldg_id. = 435)

Ebben a példában

(Válassza a Worker_ID lehetőséget

Ahol bldg_id. = 435)

A kérelmet tartalmazó kérelmet hívják külső kérés vagy fő kérés. Az aljzat a munkavállalók következő több azonosítójának (azonosítók) létrehozásához vezet:

Munkavállalói azonosító.

Külső kérés. A fő kérés, amelyben az összes alpont található.

Ezután sok azonosító vesz egy szubkután egy külső lekérdezésben. Ettől a ponttól kezdve külső kérelmet hajtanak végre az alfejezet által létrehozott készlet segítségével. A külső kérés feldolgozza a munkavállalói tábla minden karakterláncát a hol állapotnak megfelelően. Ha a WORPOR_ID vonalak a subquery által létrehozott készletben (IN), akkor a Skill_type sorok kiválaszthatók és megjelennek a kapott táblázatban:

Készségtípus

Vakoló

Tetőfedő

Egy elektronikus

Nagyon fontos, hogy a SELECT subquering kifejezést tartalmaz worker_id csak worker_id. Ellenkező esetben a kifejezés, ahol egy külső kérés, ami azt jelenti, hogy a munkavállaló_id a különböző munkavállalók azonosításaiban fekszik, nem lenne értelme.

Kérjük, vegye figyelembe, hogy az aljzat logikusan végrehajthatja, mielőtt legalább egy sort vesz igénybe a fő kérés. Bizonyos értelemben az aljzat független a fő kérelmetől. Ez teljes körű kérésként hajtható végre. Azt mondjuk, hogy ez az aljzat nem korrelál a fő kéréssel. Amint hamarosan látni fogjuk, a szubkókák korrelálhatók.

Nem korróziómentes felirat.Olyan felirat, amelynek értéke nem függ semmilyen külső kérelmet.

Adunk egy példát egy subquery belsejében.

Vizsgálat: Lista az irodákhoz rendelt alkalmazottak.

Ismét figyelembe vesszük a kérelmet, amellyel tanulmányoztuk a kapcsolatot.

Válassza ki a WORPER_MAME lehetőséget.

Ahol a munkavállaló_id.

(Válassza a Worker_ID lehetőséget

Ahol bldg_id in.

Hol típus \u003d "Office"))

Eredmény:

M. Faraday

Ryikover

J. Barristers

Kérjük, vegye figyelembe, hogy soha nem szükséges meg kell adni az asztalok nevét az oszlopok nevét megelőzően, mivel minden alkvágás egy és egyetlen táblázatot folytat, így nem fordul elő bizonytalanságok.

A kérelem végrehajtása a belsejéből kívülről kívülről történik. Ez az, hogy a legtöbb belső lekérdezés (vagy "legalacsonyabb") kerül végrehajtásra, majd az azt tartalmazó rubkulát, majd a külső kérést.

Korrelált szubkókák. A fent említett összes alpont független volt a főbb lekérdezésektől, amelyekben használták őket. A függetlenség értelmében azt értjük, hogy a szubkókákat teljes kérésként végezhetjük. Most a Subqueries osztály megfontolásához fordulunk, amelynek eredményei, amelynek végrehajtása a fő kérelem által vizsgált vonaltól függ. Az ilyen feliratokat korrelált szubkóknak nevezik.

Korrelált szubkolás. A szubkolás, amelynek eredménye a fő kérés által vizsgált vonaltól függ.

Vizsgálat: Sorolja fel az alkalmazottakat, akiknek óránkénti aránya magasabb, mint a vezetők aránya.

Válassza ki a WORPER_NAME lehetőséget.

Ahol a.hrly_rate\u003e

(Válassza a B.hrly_Rate lehetőséget

Ahol b.worker_id \u003d a.supv_id)

Eredmény:

A kérelem logikai szakaszai a következők:

1. A rendszer a munkavállalói asztal két példányát hozza létre: egy másolatot A és a V. Egy példányát. Összhangban, hogyan határoztuk meg őket, de utal a munkavállalóra, a menedzserre.

2. A rendszer ezután megvizsgálja az A. vonalat. Ez a karakterlánc akkor van kiválasztva, ha kielégíti a helyzetet. Ez a feltétel azt jelenti, hogy a karakterlánc akkor lesz kiválasztva, ha a hrly_rate értéke nagyobb, mint a szubkülés által generált hrly_rate.

3. A szubkután kiválasztja a hrly_rate értéket a sorban, amelynek munkavállalója megegyezik a Supv_ID karakterlánc A, jelenleg a fő kérés. Ez egy hrly_rate menedzser.

Kérjük, vegye figyelembe, hogy mivel az A.Hrly_Rate csak egy értékkel összehasonlítható, az alkvágásnak csak egy értéket kell termelnie. Ez az érték függ attól függően, hogy melyik karakterláncot veszik figyelembe. Így az aljzat korrelál a fő kéréssel. Később találkozunk más példákkal a korrelált szubkókákkal később, amikor a beépített funkciókat tanulmányozzuk.

Létezik és nem létezik operátorok

Tegyük fel, hogy meg akarjuk azonosítani a munkavállalókat, akiket nem neveztek ki, hogy néhány épületen dolgozzanak. Felszínes megjelenéssel úgy tűnik, hogy egy ilyen kérés egyszerűen elvégezhető a lekérdezés igenlő változatának egyszerű tagadásával. Tegyük fel például, hogy érdeklődünk az épületben az BLDG_ID 435-ös épületben. Fontolja meg a kérelmet:

Válassza a Worker_ID lehetőséget

Ahol bldg_id nem 435

Sajnos ez egy hibás megfogalmazási megoldás. A kérés egyszerűen megadja nekünk az azonosító munkavállalókat más épületeken. Nyilvánvaló, hogy néhányat kinevezhet az épületen 435.

Helyesen megfogalmazott oldatban a nem létező üzemkezelőt használják (nem létezik):

Válassza a Worker_ID lehetőséget

Ahol nem létezik.

Ahol hozzárendelés.worker_id \u003d WORKER.WORKER_ID ÉS

Eredmény:

Munkavállaló_id

Léteznek, és nem léteznek mindig a felirat előtt. Létezik az "igazság" értéket, ha a subquery által létrehozott készlet nem üres. Ha egy szubkoritás által létrehozott készlet üres, akkor létezik a "hazugság" értéke. A nem létező operátor természetesen pontosan éppen ellenkezőleg működik. Igaz, ha az aljzat eredménye üres, és hamis.

Létezik operátor. Az "igazság" értéket veszi figyelembe, ha a kapott készlet nem üres.

Nem létezik operátor. Az "igazság" értéket veszi figyelembe, ha a kapott készlet üres.

Ebben a példában használtuk a nem létező üzemeltetőt. A ripkelés kiválasztja a hozzárendelési táblázat összes ilyen sorát, amelyben a munkavállaló_id ugyanazt jelenti, mint a fő kérelem által vizsgált sorban, és a BLDG_ID 435. Ha ez a készlet üres, akkor a munkavállaló által a fő kérés vizsgálta Kiválasztott, mivel ez azt jelenti, hogy ez azt jelenti, hogy ez azt jelenti, hogy ez azt jelenti, hogy ez azt jelenti, hogy ez azt jelenti, hogy ez azt jelenti, hogy ez a munkavállaló nem működik az épületben 435.

Az általunk adott megoldásban, a korrelált szubkután használatával. Ha nem használjuk, nem létezik operátor, akkor nem korróziómentes rubkitást tehetünk:

Válassza a Worker_ID lehetőséget

Ahol a munkavállaló_id nincs

(Válassza a Worker_ID lehetőséget

Ahol bldg_id \u003d 435)

Ez a megoldás könnyebb, mint a nem létező megoldás megoldás. Van egy természetes kérdés, miért kell általában szükségünk van, és nem létezik. A válasz az, hogy nem létezik, az egyetlen eszköz, amely az "mindegyik" szót tartalmazó kérelmek megoldására szolgál. Az ilyen kérelmeket megoldani relációs algebra segítségével osztás, és a relációs kalkulus - segítségével egy kvantorával egyetemesség. Adjunk példát egy kérésre, amelynek állapotában van egy "mindegyik" szó:

Vizsgálat: Lista az egyes épületekhez rendelt alkalmazottak.

Ezt a kérdést az SQL-ben lehet végrehajtani kettős megtagadás alkalmazásával. Reformáljuk a kérést, beleértve a kettős negációt is:

Vizsgálat: Sorolja fel az ilyen munkavállalókat nem Van egy épület, amelyen nincsenek kinevezésre.

A kettős tagadást kiosztottuk. Nyilvánvaló, hogy ez a kérés logikusan egyenértékű az előzővel.

Most meg akarunk dolgozni egy megoldást az SQL-en. A végső döntés megértésének egyszerűsítése érdekében először döntünk az előzetes problémáról: az olyan épületek azonosítása, amelyekre a hipotetikus munkavállaló "1234" nem Kijelölt.

(I) Válassza a BLDG_ID lehetőséget

Ahol nem létezik.

Hozzárendelés.worker_id \u003d 1234)

Ezt a lekérdezést jelöltük (I), mivel később hivatkozunk. Ha nincs olyan épület, amely megfelel ez a kérés, akkor az 1234 munkavállaló minden épülethez van hozzárendelve, ezért kielégíti a forráskérés feltételeit. Annak érdekében, hogy a forrás kérés megoldás, meg kell összefoglalni a lekérdezés (i) egy adott dolgozó 1234 a WORKER_ID változó, és kapcsolja be a módosított kérelmet a allekérdezés egy nagyobb lekérdezés. Adjuk meg a döntést:

(Ii) Válassza ki a WORPER_ID-t

Ahol nem létezik.

Ahol nem létezik.

Ahol hozzárendelés.bldg_id \u003d building.bldg_id és

Hozzárendelés.worker_id \u003d WORKER.WORKER_ID)

Eredmény:

Munkavállalói azonosító.

Kérjük, vegye figyelembe, hogy a negyedik lekérdezési karakterlánc (II) kezdődik, megegyezik a lekérdezéssel (I), amelyben a "1234" helyettesíti a munkavállaló.Worker_ID. A lekérdezés (ii) a következőképpen olvasható:

Válassza ki a munkavállalótól a munkavállalót, ha nincs olyan épület, amelyre a munkavállaló nem hozzárendel.

Ez megfelel a forráskérés feltételeinek.

Látjuk, hogy a nem létező operátor használható az említett kérelmek megfogalmazására, amelynek megoldása relációs algebra esetében a felosztás működését és a relációs kalkulumot - az egyetemesség számszerűsítője. A könnyű használat szempontjából a nem létező operátor nem ad különleges előnyöket, vagyis az SQL lekérdezésekben, amelyekben nem haladja meg kétszer, akkor nem könnyebb megmutatni, mint a relációs algebra megoldásaiban A relációs kalkulus megosztási műveletével vagy megoldásaival az egyetemesség kvantivitelével. A nyelvi struktúrák létrehozásához, amelyek lehetővé teszik, hogy természetesen megoldja az ilyen kéréseket, további kutatásokra van szükség.

Beépített funkciók

Tekintsük az ilyen típusú kérdéseket:

Melyek a maximális és minimális óránkénti arányok? Mi az átlagos napok száma a munkavállalók az épületben 435? Mi az a teljes számú nap, amely az épületben 312-es vakolásra kerül sor? Hány különböző specialitás?

Ahhoz, hogy ezekre a kérdésekre válaszolni, a statisztikai funkciókra van szükség, hogy fontolja meg a készlet táblázat sorait és kérdés egy értéket. Az SQL-nek öt ilyen funkciója van a beépített funkcióknak vagy a beállított funkcióknak. Ezek az összegfunkciók (összeg), avg (átlagos), szám (szám), maximes (maximum) és min (minimum).

Beépített funkció (beállított funkció). Sok karakterláncban működő statisztikai funkció: SUM (SUM), AVG (Átlagos), COUNT (szám), maximák (maximum), min (minimum).

Vizsgálat: Melyek a maximális és minimális óránkénti arányok?

Válassza a MAX (HRLY_RATE), MIN (HRLY_RATE)

Eredmény:17.40, 8.20

A Max és a Min funkciója egy asztaloszlopon működik. Ezek közül az oszlopból kiválasztják a maximális vagy minimális értéket. A kérésünk megfogalmazása nem tartalmazza a parancsokat. A legtöbb kérés esetén ezt nem lehet az alábbi példánk által mutatott módon.

Vizsgálat:Mi az átlagos napok száma a munkavállalók az épületben 435?

Válassza az AVG (NUM_DAYS) lehetőséget

Ahol bldg_id \u003d 435

Eredmény: 12.33

Vizsgálat:Mi az a teljes számú nap, amely az épületben 312-es vakolásra kerül sor?

Válassza ki az összeget (NUM_DAYS)

A feladat, a munkavállaló

Ahol a munkavállaló.worker_id \u003d hozzárendelés.worker_id és

Skill_Type \u003d "Plastekers" és

Eredmény: 27

A megoldás a hozzárendelés és a munkás asztalok csatlakoztatását használja. Ez szükséges, mivel a Skill_Type a munkásasztalon található, egy bldg_id - a hozzárendelési táblázatban.

Vizsgálat: Hány különböző specialitás?

Válassza ki a számot (külön skill_type)

Eredmény: 4

Mivel ugyanazt a specialitást több különböző sorban lehet megismételni, ebben a kérelemben a különálló kulcsszót kell használni (más), hogy a rendszer ne számolja ugyanazt a fajta specialitást többször is. A különálló operátor használható bármely beépített funkciók bármelyikével, bár természetesen a maximum és perc funkciói redundánsak.

Különböző.. Az ismétlődő vonalak megszüntetése.

Az összeg és az AVG funkciókat csak numerikus oszlopokkal kell használni. Más funkciók használhatók numerikus és szimbolikus adatokkal. Minden funkció, kivéve a számot, számított kifejezésekkel használható. Például:

Vizsgálat: Mi az átlagos heti fizetés?

Válassza az AVG (40 * HRLY_RATE) lehetőséget

Eredmény: 509.14

A szám az egész karakterláncra utalhat, és nem a félig tartóban :

Vizsgálat: Hány épületnek minőségi szintje van?

Válassza ki a számot (*)

Épületből.

Eredmény: 3

Mivel ezek a példák azt mutatják, hogy ha a SELECT parancs beépített funkció, akkor semmi más nem tud állni ebben a parancsban. Az egyetlen kivétel e szabályhoz kapcsolódik a Csoport kifejezéssel, amelyet most úgy gondolunk.

Mondatok csoportja és annak

A menedzsment gyakran statisztikai információkat igényel minden csoport számára számos csoportban. Például vegye figyelembe a következő lekérdezést:

Vizsgálat:Minden egyes menedzser számára, hogy az alárendeltek között találja meg a maximális óradíjat.

A feladat megoldásához a munkavállalókat csoportokba kell osztanunk a vezetőknek megfelelően. Ezután meghatározzuk az egyes csoportok belsejében lévő maximális fogadást. Az SQL-ben ez így történik:

Csoportja Supv_id

Eredmény:

Supv_idmax (hrly sebesség))

A lekérdezés feldolgozásakor a rendszer először megszakítja a munkavállalói asztal sorokat a következő szabályra. A sorok egy csoportba kerülnek, ha és csak akkor, ha megfelelnek a SOPV_ID-nek. Ezután az egyes csoportokra alkalmazzák a kiválasztott kifejezést. Mivel ebben a csoportban csak egy SOPV_ID érték, akkor nincs Supv_ID bizonytalanság a csoportban. Minden egyes csoportban, a SELECT kifejezést kijelzők SUPV_ID, valamint kiszámítja és megjeleníti a MAX-érték (HRY_RATE). Az eredmény a fentiekben kerül bemutatásra.

A beágyazott funkciók kiválasztása parancsban csak a csoport által a csoportban szereplő oszlopok fordulhatnak elő. Felhívjuk figyelmét, hogy a SUPV_ID lehet használni a SELECT parancs, mert belép a csoport kifejezést.

Mondatcsoport.. Ez azt jelenti, hogy a vonalakat a meghatározott oszlop közös értékeivel (oszlopok) közös értékeire kell törni.

A csoport által kifejezett komplex számítások elvégzését. Például szükségünk lehet, hogy meg kell találnunk a maximális értékek átlagos értékét. Azonban a beágyazott funkciókkal történő számítások korlátozottak abban az értelemben, hogy a beépített funkciók más beépített funkciókon belül nem engedélyezettek. Így a típus kifejezése

AVG (max (hrly_rát))

tiltott. A lekérdezés végrehajtása két szakaszból áll. Először is meg kell tennünk a maximális fogadásokat az új táblázatba, és a második szakaszban kiszámítanunk átlagukat.

A Csoport segítségével parancsot használhat a parancsra:

Vizsgálat: Mindegyik típusú épületek esetében tudja meg az átlagos minőségi szintet az állapotépületek között 1.

Válassza a Típus, AVG (QLTY_LEVEL) lehetőséget

Ahol az állapot \u003d 1

Eredmény:

Typeavg (QLTY_LEVEL)

Shop 1.

Lakóépület 3.

Az, ahol a kifejezést a csoport előtt végzik el. Tehát egyetlen csoport sem tartalmazhat olyan sztringet, amelyben az állapot különbözik az 1. Általános állapotot.

Kifejezés. Csoportok feltételeit.

A feltételeket a kifejezéscsoport által létrehozott csoportokra is alkalmazhatjuk. Ez a kifejezéssel történik. Tegyük fel például, hogy úgy döntöttünk, hogy megadjuk az előző lekérdezések egyikét:

Vizsgálat: Minden menedzser esetében, akinek több alárendeltje van, az alárendeltek közötti maximális óránkénti arányt.

Tükrözhetjük ezt a feltételt, hogy a megfelelő csapat a csapattal:

Válassza a SUPV_ID, MAX (HRLY_RATE) lehetőséget

A SPAV_ID munkáscsoporttól

Számít (*)\u003e 1

Eredmény:

Supv_id max (hrly_rate)

A különbség a kifejezések között, és az az, hogy hol alkalmazzák a sorokat, miközben a csoportokra vonatkoznak.

A kérés tartalmazhatja a parancsot is, és a parancsot. Ebben az esetben az első dolog az, ahol a kifejezés, mivel a csoportok bebontása előtt történik. Például vegye figyelembe a korábban bemutatott kérelem alábbi módosítását:

Vizsgálat: Minden egyes típusú épületek esetében ismerkedjen meg az átlagos minőségi szintet a státusz épületek között 1. Csak olyan épületek, amelyek maximális minőségi szintje nem haladja meg a 3.

Válassza a Típus, az AVG (QLTY_JLEVEL) lehetőséget

Ahol az állapot \u003d 1

Max (QLTY_LEVEL)<= 3

Eredmény:

Type AVG (QLTY_LEVEL)

Shop 1.

Lakóépület 3.

Felhívjuk figyelmét, hogy kezdve a mondat a mondat végre annak érdekében, majd a SELECT kifejezést használták. Tehát a WHERE kifejezést használják az épület asztalra, és az összes sort, amely állapota eltér 1 eltávolítják. A fennmaradó vonalakat típus szerint csoportosítják; Minden típusú karakterlánc ugyanabban a csoportban van. Így létrejött egy elhanyagolható csoportok, az egyik minden típusú értékre. Ezután a kifejezést minden csoporthoz használják, és azok a csoportok, amelyekben a maximális minőségi szint értéket meghaladja a 3-at. Végül a kiválasztott kifejezés a fennmaradó csoportokra vonatkozik.

7. Beépített funkciók és szubkókák

A beépített funkciók csak a kiválasztott kifejezésben vagy a csapatban használhatók. Azonban a beépített funkciót tartalmazó kiválasztott kifejezés része lehet az alpontnak. Tekintsünk egy ilyen subkiter példát:

Vizsgálat: Ki az alkalmazottaktól az átlag feletti óradíj?

Válassza ki a WORPER_NAME lehetőséget.

Ahol hrly_rate\u003e

(Válassza az AVG (HRLY_RATE) lehetőséget

Eredmény:

H. Columbus

Kérjük, vegye figyelembe, hogy az aljzat nem korrelál a fő kéréssel. A szubkután pontosan egy értéket eredményez - az átlagos óránkénti sebesség. A fő kérelem csak akkor választja ki a munkavállalót, ha az aránya több kiszámított átlag.

A beágyazott funkciók korrelált kérésekben is használhatók:

Kérés: Ki az alkalmazottaktól az óránkénti árfolyam az átlagos óránkénti arány felett az azonos menedzser alárendeltjei között?

Ebben az esetben, ahelyett, hogy az összes munkavállaló számára átlagos óránkénti árfolyam kiszámítása helyett ki kell számolnunk az egyes munkavállalók csoportjának átlagos arányát, ugyanarra a menedzserre. Ezenkívül kiszámításunkat meg kell újítani a fő kérelem által tárgyalt munkavállalók számára:

Válassza az A. WORPER_NAME lehetőséget