Kapcsolások és csoportosítások
Kapcsolási típusok
- Descartes-szorzat
CROSS JOIN
- Belső összekapcsolás
NATURAL JOIN,INNER JOIN
- Külső összekapcsolás
OUTER JOIN
Belső összekapcsolás
- Természetes összekapcsolás
- Theta összekapcsolás
- Félig összekapcsolás
- semi join, jele: \(\semijoin\)
- Adott \(R(A_1, \ldots, A_n), S(B_1,\ldots,B_m)\) esetén \(R \semijoin S \equiv \Pi_{A_1,A_2,\ldots,A_n}(R \Join S)\)
- Anti összekapcsolás
- anti join, jele: \(\antijoin\)
- \(R \antijoin S \equiv R - R \semijoin S\)
SQL megfeleltetés - Belső összekapcsolás
Semi join
\[
\large{R \semijoin S}
\]
Anti join
\[
\large{R\antijoin S}
\]
Külső összekapcsolás

- Kiterjesztett relációs algebra
- \(R\leftouterjoin_C\,S\), \(R\rightouterjoin_C\,S\), \(R\fullouterjoin_C\,S\)
- Természetes változatban a
Cfeltétel nincs
- Természetes változatban a
- Lógó sorok
- Azon sorok, amiknek a másik relációban nincs párja
- A külső kapcsolás megőrzi a lógó sorokat
NULLértékkel helyettesítve a hiányzó értékeket
Külső összekapcsolás - változatok
R <típus> OUTER JOIN SNATURALazOUTERelőtt- vagy
ON <feltétel>azSután
- Lógó sorok megőrzése
LEFT OUTEReseténRRIGHT OUTEReseténSFULL OUTEResetén mindkettő
SQL megfeleltetés - Külső összekapcsolás
Left outer join
\[
\large{R \leftouterjoin_{R.A=S.A}\;S}
\]
Right outer join
\[
\large{R \rightouterjoin_{R.A=S.A}\;S}
\]
Full outer join
\[
\large{R \fullouterjoin_{R.A=S.A}\;S}
\]
Aggregációk (Összesítések)
SUM,AVG,COUNT,MINésMAXfüggvények aSELECTzáradékban egy-egy oszlopraCOUNT(*)megadja az eredmény sorainak számát- Nem számítanak a
NULLértékek kiértékeléskor- Ha csak
NULLérték va, akkor az összesítő eredménye isNULL - Kivétel a
COUNTaz üreshalamazon0-t ad vissza
- Ha csak
Aggregáció - Példa
Adjuk meg a Bud átlagos árát a
Felszolgál(kocsma, sör, ár)alapján
Adjuk meg, hány különféle áron árulják a Budot
Ehhez a
DISTINCT.re lesz szükség az összesítőn belül
Csoportosítás
GROUP BY <oszlopok>aWHEREzáradék után- Adott oszlopok alapján, rendre csoportosít
- Tehát első oszlopon belül a második oszlop szerinte és így tovább
Összesítés esetén megkötések a
SELECTzáradékban felsorollt attribútumokra:
- Az aggregátorok csoportonként külön kerülnek kiértékelésre
- Például minden sör átlagos árát a sörök csoportosításával és a
AVGfüggvénnyel megoldható- Összesítő operátor nélkül csak a
GROUP BY _-ban felsorolt oszlopok kerülhetnek
- Nem is volna értelme, hiszen ezek halmazok, nem lenne konzisztens a visszatérő érték
- Az előző sörös példánál mondjuk ha a query:
SELECT sör, AVG(ár) FROM Felszolgál GROUP BY sör;
- akkor itt nem írhatjuk ki csak úgy a kocsmát, mert a sörre csoportosítottunk. (meg nem is logikus, hogy átlagosan hol volt eladva)
Csoportosítás szűrése - HAVING
GROUP BY <oszlopok> HAVING <feltétel>- Ebben az esetben a feltétel a csoportokra vonatkozik, és csak a feltételnek eleget tevő csoportok kerülnek az eredménybe
Megkötések
- Az alkérdésekre nincsen semmilyen megkötés
- Az alkérdésen kívül a csoportosításra vonatkozó szabályok élnek
- Összesítéssel a
FROMzáradékban megadott relációk bármyely attribútumát használhatjuk aHAVINGzáradékban- Összesítés nélkül csak olyan attribútumok használhatók, amik a
GROUP BY _záradékban is szerepelnek- A
HAVINGzáradékban az összesítés csak az éppen feldolgozott csoport soraira vonatkozik
Csoportosítás szűréssel - Példa
A
Felszolgál(kocsma, sör, ár)ésSörök(név, gyártó)táblák felhasználásával adjuk meg azon sörök átlagos árát, melyeket legalább három kocsmában felszolgáltak, vagy Pete a gyártójukNyilván a feketén eladott (
NULLkocsmás) felszolgálások nem számítanak