Mis vahe on tabelite ühendamisel (join) ja ühendi leidmisel (union)?

Postitas Erki Eessaar, 01.06.2022 00:00
Ühendamine (join) on selleks, et saada tabelist loetud ritta juurde uusi andmeid (enamasti mõnest teisest tabelist, ehki ka tabeli ühendamine iseendaga - self-join - on võimalik).

Näiteks oletame, et andmebaasis on järgmise struktuuriga tabelid.

[Tudeng]-1----------0..*-[Oppimine]

Iga õppimine on seotud täpselt ühe tudengiga. Loen ridu tabelist Oppimine ja tahan, et igas saadud reas oleks ka selle õppimisega seotud tudengi perenimi. Selleks pean ühendada õppimise tabeli read tudengi tabeli ridadega. Pean seda tegema nii, et iga õppimise tabeli rida ühendatakse just ja ainult selle tudengi tabeli reaga, kus vastav tudeng on seotud vastava õppimisega.

Vanem süntaks:
SELECT Oppimine.*, Tudeng.perenimi AS tudengi_perenimi
FROM Oppimine, Tudeng
WHERE Oppimine.tudeng=Tudeng.tudkood;


Uuem süntaks:
SELECT Oppimine.*, Tudeng.perenimi AS tudengi_perenimi
FROM Oppimine INNER JOIN Tudeng ON Oppimine.tudeng=Tudeng.tudkood;

Ühendi (union) leidmine on selleks, et leida hulkade ühend.

SELECT eesnimi, perenimi
FROM Tudeng
UNION SELECT eesnimi, perenimi
FROM Oppejoud;

Eelnev päring moodustab tabeli, kus on nii õppejõudude kui tudengite ees- ja perenimed. Vaikimisi eemaldatakse kordused.

UNION operatsioonis osaleb kaks hulka (antud juhul ridade hulka). Nende hulga elementidel peab olema ühesugune struktuur.

SELECT eesnimi, perenimi
FROM Tudeng

leiab read, kus on kaks tekstitüüpi välja.

SELECT eesnimi, perenimi
FROM Oppejoud;

leiab read, kus on kaks tekstitüüpi välja.

Seega kahes ridade hulgas, mida UNION'iga kokku panen, peavad olema samasuguse struktuuriga read.

Hästi piltlikult rääkides.
  • Ühendamine (join) on nagu rongile vagunite lisamine, kusjuures rongile tuleb lisada õiged vagunid, mis peavad jõudma rongi sihtkohta.
  • Ühendi (union) leidmine on nagu ühesuguse kujuga kastide üksteise otsa virna laadimine.

Kas postitus oli kasulik? Hinda seda!

Keskmine hinne: Pole veel hinnanguid!


← Eelmine postitus Kuidas leida andmebaasist andmeid, mida seal justkui ei ole? Näiteks on andmebaasis andmed külaliste ja nende hotellide reserveerimiste kohta ja pean leidma külalised, kes EI OLE, 2014. aastal ühegi reserveerimist alustanud. Järgmine postitus → Ühes õppematerjalis on öeldud "Objekt-relatsiooniliste andmebaasisüsteemide loomine tuleneb lõppkokkuvõttes sellest, et tänapäeva SQL-andmebaasisüsteemid ei realiseeri täies ulatuses relatsioonilist mudelit ja see tekitab probleeme." Millist osa relatsioonilisest mudelist SQL andmebaasisüsteemid ei realiseeri? Miks nõnda?