Internet ablakok Android

Lekérdezések a létező függvény használatával. Az EXISTS operátor használata

Az SQL lehetővé teszi a lekérdezések egymásba ágyazását. Egy segédlekérdezés általában egyetlen értéket ad vissza, amelyet a rendszer tesztel, hogy kiderüljön, igaz-e az állítmány.

A keresési feltételek típusai:
. Összehasonlítás a segédlekérdezés eredményével (=, >=)
. Annak ellenőrzése, hogy egy segédlekérdezés eredményei hozzátartoznak-e (IN)
. Létezési teszt (EXISTS)
. Többszörös (mennyiségi) összehasonlítás (ANY, ALL)

Megjegyzések a beágyazott lekérdezésekhez:
. Egy részlekérdezésnek csak egy oszlopot kell kijelölnie (kivéve az EXISTS predikátummal rendelkező részlekérdezést), és az eredmény adattípusának meg kell egyeznie a predikátumban megadott érték adattípusával.
. Egyes esetekben használhatja a DISTINCT kulcsszót annak biztosítására, hogy egyetlen értéket kapjon.
. Nem tartalmazhat ORDER BY és UNION záradékot egy részlekérdezésben.
. Egy segédlekérdezés a keresőkifejezéstől balra vagy jobbra is megjelenhet.
. Az allekérdezések GROUP BY záradék nélkül használhatnak összesítő függvényeket, amelyek automatikusan egy speciális értéket adnak vissza tetszőleges számú sorhoz, egy speciális IN predikátumot és oszlopokon alapuló kifejezéseket.
. Amikor csak lehetséges, az allekérdezések helyett a JOIN táblaillesztéseket kell használni.

Példák beágyazott lekérdezésekre:

SELECT * FROM Rendelések WHERE SNum=(SELECT SNum FROM SalesPeople WHERE SName='Motika')
SELECT * FROM Rendelések WHERE SNum IN (SELECT SNum FROM SalesPeople WHERE City='London')
SELECT * FROM Rendelések WHERE SNum=(SELECT DISTINCT SNum FROM Orders WHERE CNum=2001)
SELECT * FROM Orders WHERE Amt>(SELECT AVG(Amt) FROM Orders WHERE Odate=10/04/1990)
SELECT * FROM Customer WHERE CNum=(SELECT SNum+1000 FROM SalesPeople WHERE SName='Serres')

2) Kapcsolódó segédlekérdezések

SQL-ben létrehozhat segédlekérdezéseket egy külső lekérdezésből származó táblahivatkozással. Ebben az esetben az allekérdezés többször végrehajtásra kerül, egyszer a külső lekérdezés tábla minden sorához. Ezért fontos, hogy az allekérdezés indexet használjon. Az allekérdezés hivatkozhat ugyanarra a táblára, mint a külső. Ha a külső lekérdezés viszonylag kis számú sort ad vissza, akkor a társított részlekérdezés gyorsabban fog teljesíteni, mint a nem kapcsolódó lekérdezés. Ha az allekérdezés kis számú sort ad vissza, akkor a társított lekérdezés lassabban fog futni, mint a nem kapcsolódó lekérdezés.

Példák kapcsolódó részlekérdezésekre:

SELECT * FROM SalesPeople Main WHERE 1(SELECT AVG(Amt) FROM Orders O2 WHERE O2.CNum=O1.CNum) //visszaküldi az összes olyan rendelést, amely meghaladja az adott ügyfél átlagos rendelési értékét

3) EXISTS állítmány

Szintaxis forma: LÉTEZIK ()

A predikátum argumentumként veszi az allekérdezést, és igazra értékeli, ha a részlekérdezésnek van kimenete, ellenkező esetben hamisra értékeli. Az allekérdezés egyszer végrehajtásra kerül, és több oszlopot is tartalmazhat, mivel azok értékeit nem ellenőrzik, de a sorok jelenlétének eredménye egyszerűen rögzítésre kerül.

Megjegyzések az EXISTS predikátumhoz:
. Az EXISTS egy predikátum, amely IGAZ vagy FALSE értéket ad vissza, és használható önmagában vagy más logikai kifejezésekkel.
. Az EXISTS nem használhat összesítő függvényeket az allekérdezésében.
. A korrelált (kapcsolódó, függő - korrelált) részlekérdezésekben az EXISTS predikátum végrehajtásra kerül a külső tábla minden sorára.
. Kombinálhatja az EXISTS predikátumot táblaillesztésekkel.

Példák az EXISTS predikátumra:

SELECT * FROM Customer WHERE EXISTS(SELECT * FROM Customer WHERE City='San Jose') – minden ügyfelet visszaad, ha valamelyikük San Joséban él.
SELECT DISTINCT SNum FROM Customer First WHERE NOT EXISTS (SELECT * FROM Customer Send WHERE Send.SNum=First.SNum AND Send.CNumFirst.CNum) – Azon értékesítők számát adja eredményül, akik csak egy ügyfelet szolgáltak ki.
SELECT DISTINCT F.SNum, SNum, F.City FROM SalesPeople F, Customer S WHERE EXISTS (SELECT * FROM Customer T WHERE S.SNum=T.SNum AND S.CNumT.CNum ÉS F.SNum=S.SNum) - visszatér a több vevőt kiszolgáló összes eladó száma, neve és lakóhelye.
SELECT * FROM SalesPeople Frst WHERE EXISTS (SELECT * FROM Customer Send WHERE Frst.SNum=Send.SNum AND 1

4) Kvantitatív összehasonlító predikátumok

Szintaxis forma: (=|>|=|) BÁRMELY|MINDEN ()

Ezek a predikátumok egy segédlekérdezést használnak argumentumként, azonban az EXISTS predikátumhoz képest relációs predikátumokkal (=,>=) együtt használatosak. Ebben az értelemben hasonlóak az IN predikátumhoz, de csak az allekérdezésekre vonatkoznak. A szabvány lehetővé teszi a SOME kulcsszó használatát az ANY helyett, de nem minden DBMS támogatja ezt.

Megjegyzések az összehasonlító predikátumokhoz:
. Az ALL predikátum kiértékelése IGAZ, ha az allekérdezés végrehajtása során kiválasztott minden egyes érték megfelel a külső lekérdezési predikátumban megadott feltételnek. Leggyakrabban egyenlőtlenségekkel használják.
. A BÁRMELY predikátum kiértékelése IGAZ, ha legalább egy, az allekérdezés végrehajtása során kiválasztott érték megfelel a külső lekérdezés predikátumban megadott feltételnek. Leggyakrabban egyenlőtlenségekkel használják.
. Ha az allekérdezés nem ad vissza sorokat, akkor az ALL automatikusan IGAZ értéket vesz fel (az összehasonlítási feltétel teljesül), ANY esetén pedig HAMIS.
. Ha az összehasonlítás egyik sorra sem IGAZ, és van egy vagy több nulla sor, akkor ANY az UNKNOWN értéket adja vissza.
. Ha az összehasonlítás egyik sornál sem HAMIS, és van egy vagy több nulla sor, akkor az ALL értéke ISMERETLEN.

Példák a mennyiségi összehasonlító predikátumra:

SELECT * FROM SalesPeople WHERE City=ANY(Válasszon várost az ügyféltől)
SELECT * FROM Megrendelések WHERE Amt ALL(SELECT Rating FROM Customer WHERE City='Róma')

5) Egyediség állítmány

EGYEDI|KÜLÖNBÖZŐ ()

A predikátum az alákérdezés kimenetének egyediségének (másodpéldányok hiányának) ellenőrzésére szolgál. Ezenkívül az UNIQUT predikátumban a NULL értékű sorokat egyedinek tekintjük, a DISTINCT predikátumban pedig két null értéket tekintünk egyenlőnek egymással.

6) Egyezés predikátum

MÉRKŐZÉS ()

A MATCH predikátum azt teszteli, hogy egy lekérdezési karakterlánc értéke megegyezik-e az allekérdezésből visszaadott karakterlánc értékével. Ez az allekérdezés abban különbözik az IN és ANY predikátumoktól, hogy lehetővé teszi a "részleges" (PARTIAL) egyezések feldolgozását, amelyek olyan sorok között fordulhatnak elő, amelyek részben NULL értékeket tartalmaznak.

7) Kérések a FROM részben

Valójában mindenhol elfogadható az allekérdezés használata, ahol engedélyezett a táblahivatkozás.

SELECT CName, Tot_Amt FROM Customer, (SELECT CNum, SUM(Amt) AS Tot_Amt FROM Orders GROUP BY CNum) WHERE City='London' ÉS Customer.CNum=Orders.CNum
//subquery az egyes londoni vásárlók által leadott megrendelések teljes mennyiségét adja vissza.

8) Rekurzív lekérdezések

REKURSÍVVAL
Q1 AS KIVÁLASZTÁS… FROM… HOL…
Q2 AS KIVÁLASZTÁS… FROM… HOL…

Ezen kívül lehet jelentkezni LÉTEZIK operátor. Ezt az operátort gyakran használják korrelált részlekérdezésekkel annak tesztelésére, hogy a külső lekérdezés által lekért érték létezik-e a belső lekérdezés által lekért eredménykészletben. Ha az allekérdezés legalább egy sort ad vissza, az operátor IGAZ értéket ad vissza. Ha az érték nem létezik, az operátor FALSE értéket ad vissza. Ennek megfelelően a NOT EXISTS operátor segítségével ellenőrzik, hogy a külső lekérdezés által lekért érték nem létezik-e a belső lekérdezés által lekért eredményhalmazban.

    Az EXISTS operátor ellenőrzi, hogy vannak-e sorok egy részlekérdezés eredménykészletében.

    Ha a segédlekérdezés karakterláncának értéke megtalálható:

    • a keresés nem folytatódik a belső lekérdezésben;

      a feltétel IGAZ jelzésű.

    Ha az allekérdezés karakterlánc értéke nem található:

    • a feltétel FALSE-ként van megjelölve;

      a keresés a belső lekérdezésben folytatódik.

LÉTEZIK operátor

Minden logikai operátor beágyazott SELECT utasításokkal működik. Alternatív megoldásként használhatja az EXISTS operátort. Ezt az operátort gyakran használják korrelált részlekérdezésekkel annak tesztelésére, hogy a külső lekérdezés által lekért érték létezik-e a belső lekérdezés által lekért eredménykészletben. Ha az allekérdezés legalább egy sort ad vissza, az operátor IGAZ értéket ad vissza. Ha az érték nem létezik, az operátor FALSE értéket ad vissza. Ennek megfelelően a NOT EXISTS operátor segítségével ellenőrzik, hogy a külső lekérdezés által lekért érték nem létezik-e a belső lekérdezés által lekért eredményhalmazban.

Novoszibirszki Állami Gazdasági és Menedzsment Akadémia

LABORATÓRIUMI MŰHELY A FEGYELMEZTETÉSRŐL

"ADATBÁZIS"

Laboratóriumi munka N 7

"SQL adatbázis nyelv: adatkezelési parancsok»

NOVOSIBIRSK 2000

Az SQL a Structured Query Language rövid neve. A nyelv nevéből kitűnik, hogy fő célja információkérések generálása az adatbázisból. Az adatkiválasztásra vonatkozó parancsok képezik a DML adatkezelési nyelv alapját - az SQL nyelv szerves részét. A DML azonban nem csupán parancsokból áll, amelyek az adatok adatbázisból való lekérésére szolgálnak. Vannak még parancsok az adatok módosításához, adatkezeléshez és egyebekhez.

Ez a labor lefedi a DML nyelv alapjait. Az egész laborban ragaszkodunk az SQL2 szabványhoz.

Tekintettel arra, hogy az SQL egy terjedelmes nyelv, csak a fő parancsokat fogjuk figyelembe venni. A következő laborok számos speciális SQL-szolgáltatással foglalkoznak.

A laboratóriumi munkák elvégzéséhez ismerni kell a relációs adatmodell alapjait, a relációs algebra és a relációszámítás alapjait, valamint az MS SQL Server DBMS-sel való munkavégzés alapelveit.

A laboratóriumi munka eredményeként elsajátítja az adatok kezelését SQL parancsokkal, figyelembe veszi az MS SQL Server DBMS-ben megvalósított nyelv dialektusát.

BEVEZETÉS

Az SQL adatkezelési lehetőségek széles skáláját tartalmazza, mind a lekérdezések létrehozásához, mind az adatbázis frissítéséhez. Ezek a képességek csak az adatbázis logikai struktúrájára támaszkodnak, nem pedig a fizikai struktúrájára, ami összhangban van a relációs modell követelményeivel.

Kezdetben az SQL szintaktikai struktúrája Codd relációs kalkulusán alapult (vagy legalábbis úgy tűnt, hogy alapul). Az Union volt az egyetlen támogatott relációs algebrai művelet.

Az SQL2-ben az előző szabványban kifejlesztett hasonló relációs számítási szintaxis mellett a műveleti unió, metszéspont, különbség és összekapcsolás közvetlenül valósul meg. A kiválasztási, vetítési és termékműveleteket szinte közvetlenül támogatták (és továbbra is támogatják), míg a felosztási és hozzárendelési műveleteket nehézkesebb formában.

Először az SQL lekérdezési nyelvet, majd annak adatbeviteli és módosítási műveleteit írjuk le. Az adatmódosítási műveleteket az utolsó lépésben ismertetjük, mivel szerkezetük bizonyos mértékig a lekérdező nyelv szerkezetétől függ.

Egyszerű lekérdezések

Nekünk egyszerű kérés lesz egy lekérdezés, amely csak egy adatbázistáblát ér el. Az egyszerű lekérdezések segítenek az SQL alapvető szerkezetének illusztrálásában.

Egyszerű kérés. Egy lekérdezés, amely csak egy adatbázistáblához fér hozzá.

Vizsgálat: Ki dolgozik vakolóként?

WHERE SKILL_TYPE = "Gipszoló"

Eredmény:

G. Rickover

Ez a lekérdezés a három leggyakoribbat mutatja be kifejezéseket SQL: SELECT, FROM és WHERE. Bár a példánkban különböző sorokra helyeztük őket, mindegyik lehet ugyanabban a sorban. Különböző behúzások is lehetnek, és a kifejezéseken belüli szavak tetszőleges számú szóközzel elválaszthatók. Vegye figyelembe az egyes kifejezések jellemzőit.

Válassza ki. A SELECT záradék felsorolja azokat az oszlopokat, amelyeknek szerepelniük kell az eredményül kapott táblázatban. Ezek mindig valamilyen relációs tábla oszlopai. Példánkban az eredményül kapott táblázat egy oszlopból áll (NAME), de általában több oszlopot is tartalmazhat; Számított értékeket vagy állandókat is tartalmazhat. Példákat adunk ezekre a lehetőségekre. Ha az eredményül kapott táblázat egynél több oszlopot tartalmaz, akkor az összes szükséges oszlop a SELECT parancs után megjelenik, vesszővel elválasztva. Például a SELECT WORKER_ID, NAME kifejezés egy táblázatot eredményez, amely a WORKER_ID és a NAME oszlopokból áll.

SELECT kifejezés. Meghatározza az eredményül kapott tábla oszlopait.

Tól től. A FROM záradék egy vagy több táblát ad meg, amelyeket a lekérdezés érhet el. A SELECT és WHERE záradékban felsorolt ​​összes oszlopnak szerepelnie kell a FROM záradékban felsorolt ​​táblázatok egyikében. Az SQL2-ben ezek a táblák közvetlenül definiálhatók a sémában alaptáblaként vagy adatnézetként, vagy maguk is lehetnek névtelen táblák, amelyek SQL-lekérdezésekből származnak. Ez utóbbi esetben a lekérdezés kifejezetten a FROM parancsban van megadva.

FROM kifejezés. Meghatározza azokat a meglévő táblákat, amelyekre a lekérdezés hivatkozik.

Ahol. A WHERE záradék feltételt tartalmaz. amely alapján kiválasztásra kerülnek a táblázat (táblázatok) sorai. Példánkban a feltétel az, hogy a SKILL_TYPE oszlopnak tartalmaznia kell a "Plaster" konstanst aposztrófok közé zárva, ahogy az SQL-ben mindig a szöveges konstansoknál történik. A WHERE záradék a leginkább illékony SQL-parancs; sokféle feltételt tartalmazhat. Előadásunk nagy részét a WHERE záradékban megengedett különféle konstrukciók illusztrálására fogjuk fordítani.

WHERE záradék. Megadja azt a feltételt, hogy a megadott táblákból mely sorok legyenek kiválasztva.

A fenti SQL lekérdezést a rendszer a következő sorrendben dolgozza fel: FROM, WHERE, SELECT. Vagyis a FROM parancsban megadott tábla sorai a munkaterületre kerülnek feldolgozás céljából. A WHERE záradék ezután minden sorra sorban kerül alkalmazásra. Minden olyan sor, amely nem felel meg a WHERE záradéknak, kizárásra kerül. Ezután azokat a sorokat, amelyek megfelelnek a WHERE záradéknak, a SELECT parancs dolgozza fel. Példánkban a NÉV ki van választva minden ilyen sorból, és az összes kiválasztott érték lekérdezés eredményeként jelenik meg.

Vizsgálat: Adjon meg minden adatot az irodaházakról.

WHERE TYPE = "iroda"

Eredmény:

BLDG IDADDRESSTYPEQLTY LEVELSTATUS

312 Vyazov St., 123 Office 2 2

210 Berezovaya st. 1011 Office Z 1

Osinovaya utca 111. 1213 Office 4 1

A csillag (*) a SELECT parancsban a "teljes sort" jelenti. Ez egy praktikus gyorsírás, amelyet gyakran fogunk használni.

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

KIVÁLASZTÁS NÉV: "Heti fizetés = ", 40 * HRLY_RATE

WHERE SKILL_TYPE = "villanyszerelő"

Eredmény:

M. Faraday Heti fizetés = 500,00

H. Columbus Heti fizetés = 620,00

Ez a lekérdezés a karakterkonstansok (példánkban a "Heti fizetés = ") és a SELECT parancsban végzett számítások használatát szemlélteti. A SELECT parancson belül olyan számításokat végezhet, amelyek numerikus oszlopokat és numerikus állandókat, valamint szabványos aritmetikai operátorokat használnak. (+, -, *, /), szükség szerint csoportosítva zárójelben. Beépítettünk egy új ORDER BY parancsot is, amely a lekérdezés eredményét növekvő alfanumerikus sorrendbe rendezi a megadott oszlop szerint. Ha csökkenő sorrendbe szeretné rendezni az eredményeket, akkor hozzá kell adnia a DESC parancsot a parancshoz. Az ORDER BY záradék több oszlop szerint rendezheti az eredményeket, egyesek növekvő, mások csökkenő sorrendben. Először a rendezési elsődleges kulcs oszlopot kell megadni.

karakter állandó. Betűkből, számokból és "speciális" karakterekből álló konstans.

Vizsgálat: Kinek van 10-12 dollár órabére?

WHERE HRLY_RATE >= 10 ÉS HRLY_RATE< - 12

Eredmény:

MUNKAVÁLLALÁSI ID NAME HRLY_RATE SKILL_TYPE SUPV_ID

Ez a lekérdezés a WHERE parancs néhány speciális funkcióját szemlélteti: az összehasonlító operátorokat és a logikai ÉS műveletet. A hat összehasonlító operátor (=,<>(nem egyenlő),<, >, <=, >=). Az AND (AND), OR (OR) és NOT (HE) logikai operátorok összetett feltételek létrehozására vagy egy feltétel tagadására használhatók. A zárójelek a feltételek csoportosítására használhatók, ahogy az a programozási nyelvekben megszokott.

Összehasonlító operátorok =,<>, <, >, <=, >=.

Boole-műveletekÉS (ÉS), VAGY (VAGY) és NEM (Ő) .

A lekérdezés megfogalmazásához használhatja a BETWEEN (between) operátort is:

WHERE HRLY_RATE 10 ÉS 12 KÖZÖTT

A BETWEEN segítségével össze lehet hasonlítani néhány értéket két másik értékkel, amelyek közül az első kisebb, mint a második, ha az összehasonlított érték megegyezik az adott érték mindegyikével, vagy bármely közötti értékkel.

Lekérdezés: Sorolja fel a vakolókat, tetőfedőket és villanyszerelőket.

WHERE SKILL_TYPE IN ("Gipszoló", "Tetőfedő", "Villanyszerelő")

Eredmény:

WORKER_ID NAME HRLY_RATE SKILL_TYPE SUPV_ID

1412 C. Nemo 13.75 Vakolat 1520

2920 R. Garrett 10.00 Tetőfedő 2920

1520 G. Rickover 11.75 Vakolat 1520

Ez a lekérdezés elmagyarázza az IN (B) összehasonlító operátor használatát. A WHERE feltétel akkor igaz, ha a sor szakterülete a zárójeles halmazon belül van, vagyis ha a szakterület vakoló, tetőfedő vagy villanyszerelő. Az IN operátort ismét látni fogjuk az allekérdezésekben.

Tegyük fel, hogy nem emlékszünk pontosan a szakterület írásmódjára: "villanyszerelő" vagy "elektronikai mérnök" vagy valami más. A nem meghatározott karakterláncokat helyettesítő helyettesítő karakterek megkönnyítik a pontatlan írásmódok megtalálását a lekérdezésben.

Sablon szimbólumok. A nem meghatározott karakterláncokat helyettesítő karakterek.

Vizsgálat: Sorolja fel azokat a dolgozókat, akiknek a munkaköre Elekkel kezdődik!

WHERE SKILL_TYPE LIKE ("Elek%")

Eredmény:

MUNKAVÁLLALÓ AZONOSÍTÓ NÉV HRLY_RATE SKILL_TYPE SUPV_ID

1235 M.Faraday 12.50 Villanyszerelő 1311

1311 H. Columbus 15.50 Villanyszerelő 1311

Az SQL-ben két helyettesítő karakter található: % (százalék) és _ (aláhúzás). Az aláhúzás pontosan egy meghatározatlan karaktert helyettesít. A százalék tetszőleges számú karaktert helyettesít, nullától kezdve. Helyettesítő karakterek használata esetén a LIKE operátor (like) szükséges a karakterváltozók és a konstansok összehasonlításához. Egyéb példák:

NÉV, SZERETETNEK "__Kolumbus"

A NÉV SZERETET: "__K%"

Az első példa feltétele igaz, ha a NÉV két karakterből áll, amelyet a „Columbus” követ. A WORKER táblázatban minden név kezdőbetűvel és ponttal kezdődik. Így ezzel a feltétellel mi keresse meg az összes "Columbus" vezetéknévvel rendelkező munkavállalót. A második példa feltétele lehetővé teszi, hogy megtalálja az összes alkalmazottat, akinek vezetékneve "K" betűvel kezdődik.

Vizsgálat: Keresse meg az összes olyan munkát, amely a következő két héten belül kezdődik.

HOL KEZDŐ _DÁTUM A CURRENT_DATE ÉS KÖZÖTT

Eredmény:(Tegyük fel, hogy az aktuális dátum AKTUÁLIS DÁTUM = 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 lekérdezés szemlélteti a BETWEEN (beween) operátor használatát dátum (dátum) és intervallum (intervallum) típusú értékekkel. A CURRENT_DATE egy olyan függvény, amely mindig a mai dátumot adja vissza. Kifejezés

CURRENT_DATE + INTERVAL "14" DAY

kéthetes időszakot ad az aktuális dátumhoz. Így a ASSIGNMENT akkor van kiválasztva (feltételezve, hogy ma 10/10), ha START_DATE oszlop értéke 10/10 és 10/24 között van. Ez azt mutatja, hogy intervallumértékeket adhatunk a dátummezőkhöz. Ezenkívül megszorozhatjuk a résértékeket egész értékekkel. Például tegyük fel, hogy meg akarjuk tudni, hány hetek lesz egy bizonyos számú hétben (a NUM_WEEKS (HÉT SZÁMA) változóval jelölve). Megtehetjük így:

CURRENT_DATE + INTERVAL "7" DAY * NUM_WEEKS

2. Többtáblás lekérdezések

Az adatelemek ugyanazon tábla határain keresztüli összekapcsolásának képessége minden adatbázisnyelvben fontos. A relációs algebrában ezt a funkciót az összekapcsolási művelet hajtja végre. Bár az SQL nagy része közvetlenül a relációs számításon alapul, az SQL ugyanúgy kapcsolja össze a különböző táblák adatait, mint a relációs algebrai összekapcsolási művelet. Most megmutatjuk, hogyan történik ez. Fontolja meg a lekérdezést:

Vizsgálat:

A válaszadáshoz szükséges adatok két táblázatban találhatók: MUNKÁS és MEGJEGYZÉS. Az SQL-megoldás megköveteli mindkét tábla felsorolását a FROM záradékban, és meg kell adni egy speciális WHERE záradékot:

KIVÁLASZTÁSA SKILL_TYPE

MUNKÁSTÓL, MEGJEGYZÉS

WHERE WORKER.WORKER_ID = FELADAT.MUNKÁS_ID

ÉS BLDG_ID = 435

Mi folyik itt? Egy adott kérés rendszer általi feldolgozásának két szakaszát kell figyelembe vennünk.

1. Szokás szerint először a FROM záradék kerül feldolgozásra. Ebben az esetben azonban, mivel a parancsban két tábla van megadva, a rendszer ezeknek a tábláknak a soraiból készít egy derékszögű szorzatot. Ez azt jelenti, hogy létrejön egy (logikailag) nagy tábla, amely mindkét tábla oszlopaiból áll, és amelyben az egyik tábla minden sora a másik tábla minden sorával párosul. Példánkban, mivel a MUNKAVÁLLALÁS tábla öt, a ASSIGNMENT tábla pedig négy oszlopot tartalmaz, a FROM paranccsal generált derékszögű szorzat kilenc oszlopos lesz. A derékszögű szorzat sorainak teljes száma m * n, ahol m a MUNKAVÁLLALÓ tábla sorainak száma; és n a HOZZÁADÁS tábla sorainak száma. Mivel a MUNKAVÁLLALÁS táblában 7 sor, a FELADAT táblában 19 sor található, a derékszögű szorzat 7x19 vagy 133 sort fog tartalmazni. Ha kettőnél több tábla szerepel a FROM parancsban, akkor a parancsban megadott összes tábla derékszögű szorzata létrejön.

Descartes termék. Egy táblázat minden sorának egyesítésének eredménye minden egyes sorba egy másik táblázatban.

2. Az óriási relációs tábla létrehozása után a rendszer továbbra is alkalmazza a WHERE záradékot, mint korábban. A FROM paranccsal létrehozott táblázat minden sora. ellenőrzi a WHERE feltételt. A feltételnek nem megfelelő sorokat kizárjuk a figyelembevételből. A SELECT záradék ezután a fennmaradó sorokra kerül alkalmazásra.

A WHERE záradék a lekérdezésünkben két feltételt tartalmaz:

1. MUNKÁS. WORKER_ID = FELADAT.MUNKÁS_ID

2.BLDG_ID = 435

E feltételek közül az első a csatlakozási feltétel. Vegye figyelembe, hogy mivel mind a MUNKAVÁLLALÓ, mind a ASSIGNMENT tábla tartalmaz egy MUNKAVÁLLALÓ_ID nevű oszlopot, a derékszögű szorzatuk két ilyen nevű oszlopot fog tartalmazni. Megkülönböztetésük érdekében az oszlopnév elé a forrástábla nevét írjuk, ponttal elválasztva.

Az első feltétel azt jelenti, hogy bármely kiválasztott sorban a WORKER_ID oszlop értékének meg kell egyeznie a WORKER_ID oszlop értékével a ASSIGNMENT táblából. Valójában WORKER_ID két asztalt egyesítünk. Minden olyan sor, amelyben e két oszlop értéke nem egyenlő, kizárásra kerül a terméktáblázatból. Pontosan ugyanez történik egy relációs algebra természetes összekapcsolási műveletének végrehajtásakor. (A természetes csatlakozáshoz képest azonban még mindig van némi különbség: az SQL nem távolítja el automatikusan a plusz WORKER_ID oszlopot). Ennek a két táblának a teljes összekapcsolása a BLDG_ID = 435 további feltétellel az ábrán látható. 1. A SELECT parancs alkalmazása végül a következő lekérdezési eredményt adja:

KÉPESSÉG TÍPUSA

Vakoló

Tetőfedő

Villanyszerelő

Rizs. 1. A MUNKAVÁLLALÁS és a MEGJEGYZÉS táblák összekapcsolása

Most megmutatjuk, hogyan lehet egy táblát önmagához kapcsolni SQL-ben.

Vizsgálat: Sorolja fel az alkalmazottakat vezetőik nevével.

VÁLASSZA A.WORKER_NAME, B.WORKER_NAME

A MUNKÁSTÓL, B MUNKÁSTÓL

WHERE B.WORKER_ID = A.SUPV_ID

Ebben a példában a FROM záradék a WORKER tábla két „másolatát” hozza létre, megadva nekik az A és B álnevet. Az álnév a táblának adott alternatív név. Ezután a WORKER tábla A és B példányait a WHERE paranccsal összekapcsoljuk azzal a feltétellel, hogy B-ben a WORKER_ID és A-ban a SUPV_ID egyenlő, így A-ból minden sor csatlakozik az A sorkezelőre vonatkozó információkat tartalmazó B sorhoz (ábra . 2).

Rizs. 2. A MUNKÁS tábla két példányának összekapcsolása

Minden sorból két-két alkalmazotti nevet kiválasztva megkapjuk a szükséges listát:

A.NAMEB.NAME

M. Faraday H. Columbus

C.Nemo G.Rickover R.Garrett R.Garrett

P. Mason P. Mason G. Rickover G. Rickover H. Columbus H. Columbus J. Barrister P. Mason

Álnév. A táblázat alternatív elnevezése.

A.WORKER_NAME egy dolgozót, B.WORKER_NAME pedig egy vezetőt képvisel. Kérjük, vegye figyelembe, hogy egyes dolgozók saját maguk menedzserei, ami a soraikban végrehajtott WORKER_ID - SUPV_ID egyenlőségből következik.

SQL-ben egyszerre kettőnél több táblát is összekapcsolhat:

Vizsgálat

SELECT WORKER_NAME

MUNKÁSTÓL, MEGJEGYZÉSBŐL, ÉPÍTÉSBŐL

WHERE MUNKAVÁLLALÓ.MUNKAVÁLLALÓ_AZONOSÍTÓ = FELADATOK.MUNKAVÁLLALÁSI_AZONOSÍTÓ ÉS ASSIGNMENT.BLDG_ID = ÉPÜLET.BLDG_ID ÉS

TYPE = "iroda"

Eredmény:

M. Faraday

G. Rickover

J. Barrister

Vegye figyelembe, hogy ha egy oszlopnév (például WORKER_ID vagy BLDG_ID) egynél több táblában fordul elő, akkor a félreértések elkerülése érdekében az oszlop nevét meg kell előznünk a forrástábla nevével. De ha az oszlopnév csak egy táblában fordul elő, mint a példánkban a TYPE, akkor nincs kétértelműség, így a tábla nevét nem kell megadni.

A lekérdezésben szereplő SQL-parancsok egy táblát hoznak létre három relációs adatbázistáblából. Az első két táblát a WORKER_ID, majd a harmadik táblát a BLDG_ID csatlakozik a kapott táblához. Feltétel

TYPE = "iroda"

a WHERE parancs az összes sor kizárását eredményezi, kivéve az irodaházakhoz kapcsolódó sorokat. Ez megfelel a kérés követelményeinek.

3. Allekérdezések

Allekérdezés. Kérelem kérésben

Egy részlekérdezés elhelyezhető a lekérdezés WHERE záradékában, ezáltal kibővítve a WHERE záradék lehetőségeit. Vegyünk egy példát.

Vizsgálat: Melyek a 435-ös épületbe beosztott dolgozók szakterületei?

SELECT SKTLL_TYPE

FROM WORKER WHERE WORKER_ID IN

(SELECT WORKER_ID

WHERE BLDG_ID = 435)

Allekérdezés ebben a példában

(SELECT WORKER_ID

WHERE BLDG_ID = 435)

A részlekérdezést tartalmazó lekérdezés meghívásra kerül külső kérés vagy fő kérés. Az allekérdezés a következő dolgozói azonosító(k)at eredményezi:

MUNKAVÁLLALÁSI ID

külső kérés. A fő lekérdezés, amely az összes segédlekérdezést tartalmazza.

Ez az azonosítókészlet ezután egy segédlekérdezés helyét veszi át a külső lekérdezésben. Ettől kezdve a külső lekérdezés az allekérdezés által létrehozott halmaz segítségével kerül végrehajtásra. A külső lekérdezés a WORKER tábla minden sorát a WHERE záradéknak megfelelően dolgozza fel. Ha a sor WORKER_ID-je az allekérdezés által létrehozott (IN) halmazban van, akkor a sor SKILL_TYPE-ja kerül kiválasztásra és megjelenik a kapott táblázatban:

KÉPESSÉG TÍPUSA

Vakoló

Tetőfedő

Villanyszerelő

Nagyon fontos, hogy az allekérdezés SELECT záradéka tartalmazza a WORKER_ID-t és csak a WORKER_ID-t. Ellenkező esetben a külső lekérdezés WHERE záradékának, ami azt jelenti, hogy a WORKER_ID a dolgozóazonosítók halmazában van, nem lenne értelme.

Vegye figyelembe, hogy az allekérdezés logikailag végrehajtható, mielőtt a fő lekérdezés akár egy sort is figyelembe venne. Bizonyos értelemben az allekérdezés független a fő lekérdezéstől. Teljes lekérdezésként is végrehajtható. Azt mondjuk, hogy egy ilyen segédlekérdezés nincs összefüggésben a fő lekérdezéssel. Amint azt hamarosan látni fogjuk, az allekérdezések korrelálhatók.

Nem korrelált részlekérdezés. Olyan segédlekérdezés, amelynek értéke nem függ semmilyen külső lekérdezéstől.

Íme egy példa egy segédlekérdezésre egy segédlekérdezésben.

Vizsgálat: Sorolja fel az irodaházakhoz rendelt dolgozókat.

Ismét megvizsgáljuk azt a lekérdezést, amellyel a kapcsolatot megismertük.

SELECT WORKER_MAME

WORKER_ID IN

(SELECT WORKER_ID

WHERE BLDG_ID IN

WHERE TYPE = "iroda"))

Eredmény:

M. Faraday

G. Rickover

J. Barrister

Megjegyzendő, hogy az oszlopneveket sehol nem kell a táblanevekkel megelőznünk, mivel minden részlekérdezés egy és csak egy táblát dolgoz fel, így nem lehet kétértelműség.

A lekérdezés belülről kifelé sorrendben hajtódik végre. Azaz először a legbelső lekérdezés (vagy "alsó") kerül végrehajtásra, majd az azt tartalmazó részlekérdezés, majd a külső lekérdezés.

Összefüggő allekérdezések. A fent tárgyalt összes allekérdezés független volt azoktól a fő lekérdezésektől, amelyekben használták őket. Függetlenség alatt azt értjük, hogy az allekérdezések önállóan is végrehajthatók teljes lekérdezésként. Most áttérünk az allekérdezések egy osztályára, amelyek eredményei a fő lekérdezés által figyelembe vett sortól függhetnek. Az ilyen részlekérdezéseket korrelált részlekérdezéseknek nevezzük.

Korrelált részlekérdezés. Olyan segédlekérdezés, amelynek eredménye a fő lekérdezés által figyelembe vett sortól függ.

Vizsgálat: Sorolja fel azokat az alkalmazottakat, akiknek az órabére magasabb, mint a vezetőiké.

SELECT WORKER_NAME

WHERE A.HRLY_RATE >

(SELECT B.HRLY_RATE

WHERE B.WORKER_ID = A.SUPV_ID)

Eredmény:

A lekérdezés végrehajtásának logikai lépései a következők:

1. A rendszer a MUNKAVÁLLALÁS táblából két másolatot készít: az A példányt és a B példányt. A definíciójuknak megfelelően A a dolgozóra, B a vezetőre vonatkozik.

2. A rendszer ezután minden A sort megvizsgál. Ez a sor akkor van kiválasztva, ha megfelel a WHERE záradéknak. Ez a feltétel azt jelenti, hogy egy sor kerül kiválasztásra, ha a HRLY_RATE értéke nagyobb, mint az allekérdezés által generált HRLY_RATE.

3. Az allekérdezés kiválaszt egy HRLY_RATE értéket a B sorból, amelynek WORKER_ID értéke megegyezik a fő lekérdezés által jelenleg vizsgált A sor SUPV_ID-jével. Ez a menedzser HRLY_RATE.

Vegye figyelembe, hogy mivel az A.HRLY_RATE csak egy értékkel hasonlítható össze, az allekérdezésnek csak egy értéket kell visszaadnia. Ez az érték attól függően változik, hogy melyik A sort veszi figyelembe. Így az allekérdezés korrelál a fő lekérdezéssel. További példákat fogunk látni a korrelált részlekérdezésekre később, amikor megvizsgáljuk a beépített függvényeket.

EXISTS és NOT EXISTS operátorok

Tegyük fel, hogy azonosítani akarjuk azokat a munkásokat, akiket nem az épületen dolgoznak. A felszínen úgy tűnik, hogy egy ilyen kérés könnyen benyújtható a kérelem igenlő változatának egyszerűen tagadásával. Tegyük fel például, hogy egy BLDG_ID 435-ös épület iránt érdeklődünk. Tekintsük a lekérdezést:

SELECT WORKER_ID

AHOL BLDG_ID NEM 435

Sajnos ez a megoldás rossz megfogalmazása. A lekérdezés egyszerűen megadja a más épületeken dolgozó munkások azonosítóit. Nyilvánvalóan ezek egy része a 435-ös épülethez is hozzárendelhető.

A jól megfogalmazott megoldás a NOT EXISTS operátort használja (nem létezik):

SELECT WORKER_ID

AHOL NEM LÉTEZIK

WHERE ASSIGNMENT.WORKER_ID = WORKER.WORKER_ID ÉS

Eredmény:

WORKER_ID

Az EXISTS és NOT EXISTS operátorok mindig az allekérdezés elé kerülnek. Az EXISTS értéke igaz, ha az allekérdezés által generált halmaz nem üres. Ha az allekérdezés által generált halmaz üres, akkor az EXISTS értéke hamis. A NOT EXISTS operátor természetesen pont fordítva működik. Igaz, ha az allekérdezés eredménye üres, egyébként hamis.

LÉTEZIK operátor. Igaz értéket ad vissza, ha az eredményhalmaz nem üres.

NOT EXISTS operátor. Igaz értéket ad vissza, ha az eredményhalmaz üres.

Ebben a példában a NOT EXISTS operátort használtuk. Az allekérdezés a ASSIGNMENT tábla összes sorát kiválasztja, ahol a WORKER_ID megegyezik a fő lekérdezés által figyelembe vett sorral, és a BLDG_ID értéke 435. Ha ez a halmaz üres, akkor a fő lekérdezés által figyelembe vett dolgozó sor kerül kiválasztásra, mert ez azt jelenti, hogy hogy ez a munkás nem a 435-ös épületben dolgozik.

Megoldásunkban korrelált részlekérdezés használatával. Ha a NOT EXISTS helyett az IN operátort használjuk, akkor egy nem korrelált részlekérdezéssel is megvagyunk:

SELECT WORKER_ID

WORKER_ID NINCS BE

(SELECT WORKER_ID

WHERE BLDG_ID = 435)

Ez a megoldás egyszerűbb, mint a NOT EXISTS operátor megoldása. Felmerül a természetes kérdés, hogy miért van szükségünk LÉTEZEKRE, és miért NEM LÉTEZIK. A válasz az, hogy a NOT EXISTS az egyetlen módja azoknak a lekérdezéseknek a megoldására, amelyek a feltételben az "each" szót tartalmazzák. Az ilyen lekérdezéseket a relációs algebrában az osztási művelettel, a relációs kalkulusban pedig az univerzális kvantor segítségével oldjuk meg. Íme egy példa egy olyan lekérdezésre, amely az "each" szót tartalmazza a feltételben:

Vizsgálat: Sorolja fel az egyes épületekhez rendelt munkásokat!

Ez a kérdés megvalósítható SQL-ben kettős negációval. A lekérdezést újrafogalmazzuk, hogy tartalmazza a kettős negatívot:

Vizsgálat: Sorolja fel azokat az alkalmazottakat, akiknek nem van egy épület, amelyhez nincsenek hozzárendelve.

Kiemeltük a kettős negatívumot. Nyilvánvaló, hogy ez a lekérdezés logikailag egyenértékű az előzővel.

Most egy megoldást szeretnénk megfogalmazni SQL-ben. A végső megoldás megértésének megkönnyítése érdekében először egy előzetes problémára adunk megoldást: azon épületek azonosításának problémáját, amelyekre a feltételezett munkás, "1234" nem kijelölt.

(I) SELECT BLDG_ID

AHOL NEM LÉTEZIK

FELADAT.MUNKAVÁLLALÓ_ID = 1234)

Ezt a lekérdezést (I) címkével láttuk el, ahogy később hivatkozni fogunk rá. Ha nincs olyan épület, amely eleget tenne ennek a kérésnek, akkor az 1234-es munkás minden épülethez hozzá van rendelve, és ezért megfelel az eredeti kérés feltételeinek. Az eredeti lekérdezés megoldásához általánosítanunk kell a lekérdezést (I) egy adott 1234 dolgozótól a WORKER_ID változóra, és ezt a módosított lekérdezést a nagyobb lekérdezés részlekérdezésévé kell alakítanunk. Íme a megoldás:

(II) KIVÁLASZTÁSA MUNKAVÁLLALÓ_ID

AHOL NEM LÉTEZIK

AHOL NEM LÉTEZIK

WHERE ASSIGNMENT.BLDG_ID = ÉPÜLET.BLDG_ID ÉS

ASSIGNMENT.WORKER_ID = WORKER.WORKER_ID)

Eredmény:

MUNKAVÁLLALÁSI ID

Vegye figyelembe, hogy a negyedik lekérdezéssorban (II) kezdődő részlekérdezés megegyezik az (I) lekérdezéssel, amelyben az „1234” helyett a WORKER.WORKER_ID áll. A (II) lekérdezés a következőképpen olvasható:

Válassza ki a WORKER_ID elemet a WORKER közül, ha nincs olyan épület, amelyhez ne lenne hozzárendelve WORKER_ID.

Ez megfelel az eredeti kérés feltételeinek.

Látjuk, hogy a NOT EXISTS operátorral megfogalmazhatók azok a lekérdezések, amelyek relációs algebrában az osztás műveletét igényelték, a relációs számításban pedig az univerzális kvantort. A könnyű kezelhetőség szempontjából a NOT EXISTS operátor nem ad különösebb előnyt, vagyis a NOT EXISTS kétszer használó SQL lekérdezések semmivel sem könnyebben megérthetők, mint az osztásműveletű relációs algebrai megoldások vagy az univerzális kvantorral rendelkező relációs számítási megoldások. További kutatásokra van szükség olyan nyelvi konstrukciók létrehozásához, amelyek lehetővé teszik az ilyen lekérdezések természetesebb megoldását.

Beépített funkciók

Fontolja meg az ilyen típusú kérdéseket:

Melyek a maximális és minimális óradíjak? Átlagosan hány napot töltenek az alkalmazottak a 435-ös épületben? Hány napja van összesen a 312-es épület vakolási munkáinak? Hány különböző szakterület létezik?

E kérdések megválaszolásához olyan összesítő függvényekre van szükség, amelyek több táblázatsort néznek meg, és egyetlen értéket állítanak elő. Az SQL-nek öt ilyen funkciója van, amelyeket beépített függvényeknek vagy beállított függvényeknek neveznek. Ezek a SUM (összeg), AVG (átlag), COUNT (count), MAX (maximum) és MIN (minimum) függvények.

Inline funkció (beállítási funkció). Statisztikai függvény, amely több sorban működik: SUM (összeg), AVG (átlag), COUNT (számlálás), MAX (maximum), MIN (minimum).

Vizsgálat: Melyek a maximális és minimális óradíjak?

MAX(HRLY_RATE), MIN(HRLY_RATE) KIVÁLASZTÁS

Eredmény: 17.40, 8.20

A MAX és MIN függvények egyetlen táblázatoszlopon működnek. Ebből az oszlopból kiválasztják a maximális vagy minimális értéket. A lekérdezés megfogalmazásunk nem tartalmaz WHERE záradékot. A legtöbb kérés esetében előfordulhat, hogy ez nem így van, ahogy a következő példánk is mutatja.

Vizsgálat:Átlagosan hány napot töltenek az alkalmazottak a 435-ös épületben?

AVG KIVÁLASZTÁSA (NUM_DAYS)

WHERE BLDG_ID=435

Eredmény: 12.33

Vizsgálat: Hány napja van összesen a 312-es épület vakolási munkáinak?

SZUM VÁLASZTÁSA (NUM_DAYS)

MEGJEGYZÉSBŐL, MUNKÁS

WHERE WORKER.WORKER_ID = MEGJEGYZÉS.MUNKÁS_ID ÉS

SKILL_TYPE = "Gipszoló" ÉS

Eredmény: 27

A megoldás az ASSIGNMENT és a WORKER táblák összekapcsolását használja. Erre azért van szükség, mert a SKILL_TYPE a WORKER táblában, a BLDG_ID pedig a ASSIGNMENT táblában található.

Vizsgálat: Hány különböző szakterület létezik?

SZÁM KIVÁLASZTÁSA (DISTINCT SKILL_TYPE)

Eredmény: 4

Mivel ugyanaz a szakterület több különböző sorban is megismételhető, ezért a DISTINCT (different) kulcsszót kell használni ebben a lekérdezésben, hogy a rendszer ne számolja többször ugyanazt a szakterületet. A DISTINCT operátor bármelyik beépített funkcióval használható, bár természetesen redundáns a MAX és MIN funkciókkal.

KÜLÖNBÖZŐ. Egy operátor, amely kizárja az ismétlődő sorokat.

A SUM és AVG függvényeket csak numerikus oszlopokkal szabad használni. Más funkciók numerikus és karakteres adatokkal is használhatók. A COUNT kivételével minden függvény használható számított kifejezésekkel. Például:

Vizsgálat: Mennyi az átlag heti fizetés?

AVG (40*HRLY_RATE)

Eredmény: 509.14

A COUNT a teljes sorra vonatkozhat, nem csak egyetlen oszlopra :

Vizsgálat: Hány épület rendelkezik 3-as minőségi fokozattal?

SZÁM KIVÁLASZTÁSA (*)

ÉPÜLETBŐL, HONNAN

Eredmény: 3

Ahogy ezek a példák is mutatják, ha van beépített függvény a SELECT parancsban, akkor semmi más nem lehet ebben a SELECT parancsban. Az egyetlen kivétel ez alól a szabály alól a GROUP BY záradék, amelyet hamarosan megvizsgálunk.

GROUP BY és HAVING kifejezések

A menedzsment során gyakran szükség van statisztikai információkra a több csoportban lévő egyes csoportokról. Vegyük például a következő lekérdezést:

Vizsgálat: Minden vezetőnél tájékozódjon a beosztottak közül a maximális órabérről.

A probléma megoldásához a dolgozókat vezetőik szerint csoportokba kell osztani. Ezután minden csoporton belül meghatározzuk a maximális tétet. SQL-ben ez így történik:

CSOPORTOSÍTÁS SUPV_ID SZERINT

Eredmény:

SUPV_IDMAX(HRLY RATE)

A lekérdezés feldolgozásakor a rendszer először a következő szabály szerint csoportokra osztja a WORKER tábla sorait. A sorok akkor és csak akkor kerülnek ugyanabba a csoportba, ha azonos SUPV_ID-vel rendelkeznek. A SELECT záradék ezután minden csoportra vonatkozik. Mivel ebben a csoportban csak egy SUPV_ID érték található, a csoportban nincs SUPV_ID kétértelműség. A SELECT utasítás minden csoporthoz kiadja a SUPV_ID értéket, valamint kiszámítja és kiadja a MAX(HRLY_RATE) értéket. Az eredményt fent mutatjuk be.

A beépített függvényekkel rendelkező SELECT utasításban csak azok az oszlopok fordulhatnak elő, amelyek a GROUP BY záradékban szerepelnek. Vegye figyelembe, hogy a SUPV_ID használható a SELECT utasításban, mert benne van a GROUP BY záradékban.

Kifejezés GROUP BY. Azt jelzi, hogy a sorokat csoportokra kell osztani a megadott oszlop(ok) közös értékeivel.

A GROUP BY záradék lehetővé teszi bizonyos összetett számítások elvégzését. Például érdemes megtudnunk ezeknek a maximális ajánlatoknak az átlagát. A beépített függvényekkel végzett számítások azonban korlátozottak abban az értelemben, hogy a beépített függvények más beépített függvényeken belüli használata nem megengedett. Szóval olyan kifejezés, mint

AVG(MAX(HRLY_RATE))

tiltott. Egy ilyen kérés végrehajtása két szakaszból áll. Először egy új táblázatba kell feltenni a maximális ajánlatokat, majd a második lépésben kiszámítani az átlagot.

A GROUP BY paranccsal használhatja a WHERE parancsot:

Vizsgálat: Minden egyes épülettípus esetében állapítsa meg az 1. státuszú épületek átlagos minőségi szintjét.

TÍPUS KIVÁLASZTÁSA, AVG (QLTY_LEVEL)

AHOL ÁLLAPOT = 1

Eredmény:

TYPEAVG (QLTY_SZINT)

1. bolt

Lakóépület 3

A WHERE záradék a GROUP BY parancs előtt kerül végrehajtásra. Így egyetlen csoport sem tartalmazhat 1-től eltérő állapotú sort. Az 1. állapot sorai a TÍPUS szerint vannak csoportosítva, majd minden csoportra egy SELECT záradék kerül alkalmazásra.

HAVING kifejezés. Feltételeket szab a csoportokra.

A GROUP BY záradék által létrehozott csoportokra is alkalmazhatunk feltételeket. Ez a HAVING záradékkal történik. Tegyük fel például, hogy úgy döntünk, hogy kiegészítjük az előző lekérdezések egyikét:

Vizsgálat: Minden olyan vezető esetében, akinek egynél több beosztottja van, tájékozódjon a beosztottak közül a maximális óradíjról.

Ezt a feltételt a megfelelő HAVING paranccsal tükrözhetjük:

SUPV_ID, MAX (HRLY_RATE) KIVÁLASZTÁSA

MUNKÁSCSOPORTBÓL, SUPV_ID

HAVING COUNT(*) > 1

Eredmény:

SUPV_ID MAX (HRLY_RATE)

A WHERE és a HAVING záradék közötti különbség az, hogy a WHERE a sorokra, míg a HAVING a csoportokra vonatkozik.

A lekérdezés tartalmazhat egy WHERE és egy HAVING záradékot is. Ebben az esetben először a WHERE záradék kerül kiértékelésre, mert a csoportosítás előtt kerül kiértékelésre. Vegyük például a korábbi lekérdezés következő módosítását:

Vizsgálat: Minden egyes épülettípusnál keresse meg az átlagos minőségi szintet az 1-es állapotú épületek között. Csak azokat az épülettípusokat vegye figyelembe, amelyek maximális minőségi szintje nem haladja meg a 3-at.

TÍPUS KIVÁLASZTÁSA, AVG (QLTY_JLEVEL)

AHOL ÁLLAPOT = 1

MAXIMÁLIS (QLTY_SZINT)<= 3

Eredmény:

TYPEAVG (QLTY_SZINT)

1. bolt

Lakóépület 3

Vegye figyelembe, hogy a FROM záradékkal kezdve a kifejezések sorrendben kerülnek végrehajtásra, majd a SELECT záradék kerül alkalmazásra. Például a WHERE záradékot alkalmazzák a BUILDING táblára, és minden olyan sor törlődik, amelyben a STATUS nem 1. A fennmaradó sorok TYPE szerint vannak csoportosítva; minden sor azonos TYPE értékkel ugyanabba a csoportba kerül. Ez több csoportot hoz létre, egyet minden TYPE értékhez. A HAVING záradék ezután minden csoportra vonatkozik, és azokat a csoportokat, amelyek maximális minőségi szintje 3-nál nagyobb, eltávolítjuk. Végül a SELECT záradékot alkalmazzuk a fennmaradó csoportokra.

7. Beépített függvények és segédlekérdezések

A beépített függvények csak SELECT záradékban vagy HAVING utasításban használhatók. A soron belüli függvényt tartalmazó SELECT záradék azonban része lehet egy segédlekérdezésnek. Vegyünk egy példát egy ilyen segédlekérdezésre:

Vizsgálat: Melyik munkavállalónak van átlag feletti órabére?

SELECT WORKER_NAME

WHERE HRLY_RATE >

(AVG (HRLY_RATE) KIVÁLASZTÁSA

Eredmény:

H. Columbus

Vegye figyelembe, hogy az allekérdezés nem korrelál a fő lekérdezéssel. Az allekérdezés pontosan egy értéket ad vissza – az átlagos óradíjat. A fő lekérdezés csak akkor választ ki egy dolgozót, ha az ajánlata nagyobb, mint a számított átlag.

A kapcsolódó lekérdezések beépített függvényeket is használhatnak:

Lekérdezés: Ugyanannak a vezetőnek a beosztottjai közül kinek van magasabb órabére az átlagos órabérnél?

Ebben az esetben ahelyett, hogy minden alkalmazottra egy átlagos óradíjat számítanánk ki, az azonos vezetőnek beosztott munkavállalói csoportok átlagos óradíját kell kiszámítanunk. Sőt, a számítást újra el kell végezni minden egyes fő lekérdezésben érintett dolgozó esetében:

SELECT A. WORKER_NAME

Ebben az oktatóanyagban megtudhatja, hogyan kell használni az SQL-t LÉTEZIK állapot szintaxissal és példákkal.

Leírás

Az SQL EXISTS záradékot egy segédlekérdezéssel együtt használják, és akkor tekinthető elégedettnek, ha az allekérdezés legalább egy sort ad vissza. SELECT, INSERT, UPDATE vagy DELETE utasításban használható.

Szintaxis

Az EXISTS feltétel szintaxisa az SQL-ben a következő:

Opciók vagy érvek

subquery subquery egy SELECT utasítás. Ha az allekérdezés legalább egy rekordot ad vissza az eredményhalmazban, az EXISTS záradék igazra értékelődik, és az EXISTS feltétel teljesül. Ha az allekérdezés nem ad vissza rekordokat, az EXISTS záradék hamisra értékelődik, és az EXISTS feltétel meghiúsul.

jegyzet

Az EXISTS záradékot használó SQL-utasítások nagyon nem hatékonyak, mivel az allekérdezés a külső lekérdezési tábla MINDEN sorára újra lefut. Léteznek hatékonyabb módszerek a legtöbb olyan lekérdezés írásához, amelyek nem használják az EXISTS záradékot.

Példa - A EXISTS feltétel használata SELECT utasítással

Kezdjük egy példával, amely bemutatja, hogyan kell használni az EXISTS feltételt egy SELECT utasítással.

Ebben a példában van egy ügyféltáblánk a következő adatokkal:

Most keressük meg az összes olyan rekordot a vevőtáblából, ahol legalább egy rekord van a rendelési táblában ugyanazzal az ügyfél_azonosítóval. Futtassa a következő SELECT lekérdezést:

4 bejegyzés kerül kiválasztásra. Íme, milyen eredményeket kell elérnie:

Ügyfél-azonosító keresztnév vezetéknév kedvenc_webhely
4000 Justin Bieber google.com
5000 Selena Gomez bing.com
7000 Tom Hajókázás oracle.com
8000 Johnny Depp NULLA

Ebben a példában 4 olyan rekord van az ügyfelek táblájában, amelyeknek van egy customer_id értéke a rendelések táblában.

Példa – A EXISTS feltétel használata UPDATE utasítással

Nézzünk egy példát, amely az EXISTS záradékot használja egy UPDATE utasításban.
Ebben a példában van egy terméktáblázatunk a következő adatokkal:

Most frissítsük a summary_data táblát a termékek tábla értékeivel. Írja be a következő SQL utasítást:

PgSQL

5 bejegyzés frissül. Válassza ki újra az adatokat a summary_data táblából:

PgSQL

SELECT * FROM összefoglaló_adatok;

Ez a példa frissíti az aktuális_kategória mezőt az összegző_adatok táblában a kategória_azonosítójával a terméktáblázatból, ahol a termékazonosító értékek egyeznek. Az összegző_adatok tábla első 5 rekordja frissítve lett.

gyors: Ha nem adnánk meg az EXISTS záradékot, akkor az UPDATE lekérdezés az summary_data tábla 6. sorában az aktuális_kategória mezőt NULL-ra frissíti (mivel a termékek táblájában nincs olyan bejegyzés, ahol a termékazonosító = 8).

Példa – A EXISTS feltétel használata TÖRLÉS utasítással

Nézzünk egy példát, amely az EXISTS feltételt használja egy DELETE utasításban.

Ebben a példában van egy ügyféltáblánk a következő adatokkal:

Írja be a következő DELETE utasítást:

PgSQL

1 bejegyzés törlésre kerül. Válassza ki ismét az adatokat a rendelési táblázatból:

PgSQL

SELECT * FROM megrendelések;

KIVÁLASZTÁS *A rendelésekből;

Íme, milyen eredményeket kell elérnie.