Többrelációs lekérdezések
Jellemzően több táblát érintenek a lekérdezések
- Több reláció is felsorakoztatható a
FROMzáradékban - Kétértelműséget a
<reláció>.<attribútum>szintaxissal lehet feloldani
Formális szemantika
- Vegyük a
FROMzáradékban szereplő relációk Descartes-szorzatát - Alkalmazzuk a
WHEREzáradék feltételét - Vetítsünk a
SELECTzáradék oszlopaira
Többrelációs példa
Operációs szemantika
- A
FROMzáradékbili táblá(k)hoz egy sorváltozó tartozik- A sorok minden lehetséges kombinációját vesszük
- Ha a változók a
WHEREfeltételének eleget tesznek, akkor azt továbbküldjük aSELECTzáradéknak
Explicit sorváltozók
- Egy relációhoz tartozó "sorváltozót" át lehet nevezni
- Hasznos, amikor egy táblának több példányára is szükség van
- Elkerülve a kétértelműséget
- Akkor is alkalmazható, ha egyébként nem szükséges
- Például hosszú nevű tábláknál, vagy allekérdezéseknél
- Hasznos, amikor egy táblának több példányára is szükség van
Önmagával vett kapcsolás
Gyakori módszer, hogy ne legyen a párosításokban ismétlődés
Alkérdések
"subqueries"
A FROM és WHERE záradékokban zárójelezett SELECT _ FROM _ WHERE alkérdéseket is használhatunk, speciális esetben a SELECT-ben is használható.
Alkérdések zárójelben vannak, így azokat nem választjuk el sorelválasztóval...
Alkérdések - Példa
Keressük meg Joe bárját látogató vendégek kedvelt söreit
SELECT sör
FROM Szeret , (SELECT alkesz
FROM Látogat
WHERE kocsma = 'Joe bárja') JD
WHERE Szeret.alkesz = JS.alkesz;
Az alkérdés itt megadja a keresett alkeszeket, majd azzal tudunk összehasonlítani a
Szeret-el
Egy soros alkérdések
- Ha egy alkérdés biztosan egy sort ad eredményül, akkor konstans értékként használható
- Általában egy oszlopa ban
- Ha több eredménye lenne, azt futásidejű hibát okoz
- Érdemes olyan függvényt alkalmazni, aminek egy soros tulajdonsága ismert
MAX,MIN,FIRST,COUNT,AVG...
Egysoros alkérdés - Példa
Keressük meg azokat a kocsmákat, ahol a miller ugyanannyiva kerül, mint Joe bárjában a Bud
SELECT kocsma
FROM Felszolgál
WHERE sör = 'Miller'
AND ár = (SELECT ár
FROM Felszolgál
WHERE kocsma = 'Joe bárja'
AND sör = 'Bud');
Kotlin reminder
Most kérdezhetnénk, hogy honnan tudjuk mi azt, hogy csak egy elemmel tér vissza ez az alkérdés.
Jusson eszünkbe, hogy a Felszolgál(kocsma, sör, ár) esetén a kocsma és sör párban kulcsot alkotnak, ami azt jelenti, hogy azért, mert a kulcsra szűrtünk, az előfordulás garantáltan egyedi.
Az így kapott egy sor lesz a WHERE-ben felhasznált konstans.
Tartalmazás - IN
WHEREzáradékban használható<sor> IN (<alkérdés>)feltétel akkor és csak akkor igaz, ha a sor eleme az alkérdés eredményének- Elentétnek adott a
<sor> NOT IN (<alkérdés>)feltétel
- Elentétnek adott a
Tartalmazás - Példa
Listázzuk ki azon sörök minden információját, amiket Fred kedvel
Tartalmazás vs Descartes-szorzat
SELECT a
FROM R, S -- Dupla ciklus R és S felett
--> Tehát veszünk minden R x S párosítást
WHERE R.b = S.b; -- És abból vesszük az egyezőket
SELECT a
FROM R -- Egy ciklus R sorai felett
WHERE b IN (SELECT b FROM S); -- S-et csak egyszer vesszük
A Descartes-szorzat a legtöbb rendszerben engedi az ismétlődést (for performance reasons), így annak elkerülésére tartalmazást szoktunk ellenőrizni
Létezés - EXISTS
EXISTS (<alkérdés>)akkor és csak akkor igaz, ha az alkérdés eredménye nem üres- Legalább egy sort visszaad
- Hasonlóan
NOT EXISTS (<alkérdés>)is létezik
Létezés - Példa
keressünk olyan söröket, amiknek a gyártói nem gyártanak más sört
SELECT név
FROM Sörök b1
WHERE NOT EXISTS (
SELECT *
FROM Sörök
WHERE gyártó = b1.gyártó
AND név <> b1.név
);
<>is \(\ne\) in SQL
Bármelyik - ANY
x\(\circ\)ANY (<alkérdés>)akkor és csak akkor igaz, ha az alkérdés legalább egy sorával igaz a \(\circ \in \{=,<,\ldots\}\) feltétel- Példa:
x > ANY (<alkérdés>)
- Példa:
- Az alkérdés sorai egy mezőből kell álljanak
Mindegyik - ALL
x\(\circ\)ALL (<alkérdés>)akkor és csak akkor lesz igaz, ha az alkérdés minden sorát kielégíti a \(\circ\in\{=,>,\ldots\}\) feltétel
Halmazműveletek
(<alkérdés>) UNION (<alkérdés>)(<alkérdés>) INTERSECT (<alkérdés>)(<alkérdés>) MINUS (<alkérdés>)EXCEPTmegyezzik aMINUS-al
Halmazműveletek - Motiváció
- Projekciónál hatékonyabb nem kiszűrni az ismétlődéseket
- A metszet és különbség számításakor általában egy rendezés előbb megtörténik
- Ezt követően az ismétlődések szűrése kissebb számítási igényű
Ismétlődés módosítása
SELECT DISTINCT _- Ismétlődések kiszűrése
SELECT ALL _,UNION ALL _...- Ismétlődések megtartása
Kapcsolások - JOIN
- Számos formája van SQL-ben
- Állhat önmagában, vagy a
FROMzáradékban használható
Kapcsolási formák
Természetes kapcsolás
Szorzat
Theta kapcsolás
Relációs algebra és SQL - Példák
\(\large{\sigma_{R.B=S.B}(R\times S)}\)
Létezik relációs kalkulus, amik deklaratív nyelvek (nem részletezi a köztes lépéseket)
Sor,- és oszlopkalkulus