Liitos (JOIN)

Kuva 1 Liitos
FROM-lauseessa luetellaan pilkulla eroteltuna kaikki taulut, joista tietoja halutaan liittää (engl. join) yhteen.. SELECT-lauseessa voidaan viitata kaikkien FROM-lauseessa lueteltujen taulujen kenttiin. Jos tauluissa on samannimisiä kenttiä, on ne erotettava toisistaan lisäämällä kentän nimen eteen taulun nimi ja piste. WHERE-lauseessa määriteltävät liitosehdot kertovat, kuinka taulut liittyvät toisiinsa. Taulut yhdistävistä sarakkeista pitää löytyä toisiaan vastaavat arvot. Useimmiten yhdistäminen tapahtuu äititaulun (Opiskelija) perusavaimen (sotu) ja lapsi-taulun (Tenttii) viiteavaimen (sotu) välillä. Yhdistävien kenttien ei tarvitse olla samaa tietotyyppiä. Molempien tulee kuitenkin olla numeerisia, merkkimuotoisia tai päivämäärätyyppisiä. On kuitenkin suositeltavaa käyttää samoja tyyppejä samoilla pituusmäärityksillä, jotta vältytään turhilta tyyppimuunnoksilta.
Jos FROM-lauseessa on lueteltu N taulua niin liitosehtoja pitää olla vähintään N - 1 kappaletta!
Ilman liitosehtoja lopputulokseen tulisi aivan liian monta riviä, koska tietokannanhallintajärjestelmä antaisi lopputulokseen kaikki mahdolliset riviyhdistelmät käsiteltävistä tauluista.
Tavallisin liitos luodaan seuraavasti:
Haetaan kaikki yli 2.5 arvosanan tenttisuoritukset ja ne saaneiden opiskelijoiden sukunimet
SELECT Opiskelija.sukunimi, Tenttii.arvosanaFROM Opiskelija, TenttiiWHERE Opiskelija.hetu = Tenttii.opiskelijaAND arvosana> 2.5;SUKUNIMI ARVOSANA------------ --------Lahtonen 3,00Kielinero 3,00Kielinero 3,00Kirjailija 2,75Kirjailija 3,00Kasvattaja 2,75Kasvattaja 2,75Kasvattaja 3,00Heinonen 2,75Heinonen 2,7510 record(s) selected.
Ilman liitosehtoa kyselyn lopputulokseen olisi tullut 80 riviä. Opiskelija-relaatiossa on 8 riviä ja Tenttii-relaatiossa 10 riviä joilla tenttitulos on yli 2.5. Jos mitään liitosehtoa ei ole niin näistä riveistä muodostetaan kaikki mahdolliset kombinaatiot eli yhteensä 8*10 eli 80 riviä. Joukossa ovat oikeatkin yhdistelmät, mutta myös 70 kappaletta yhdistelmiä, jotka ovat väärin. Tietokannanhallintajärjestelmä tekee ensin kaikki mahdolliset yhdistelmät joista sitten pitää kelpuuttaa vain oikeat liitosehdon perusteella.
Montako riviä on Opiskelija-relaatiossa:
SELECT COUNT(*) AS rivejäFROM OpiskelijaRIVEJÄ-----------81 record(s) selected.
Montako riviä on Opiskelija-relaatiossa:
SELECT COUNT(*) AS rivejäFROM TenttiiWHERE arvosana> 2.5RIVEJÄ-----------101 record(s) selected.
Montako yhdistelmää saadaan aikaan Opiskelija- ja Tenttii-relaatioista, jos kelpuutetaan mukaan ne rivit joissa arvosana on> 2.5:
SELECT COUNT(*) AS rivejäFROM Opiskelija, TenttiiWHERE arvosana> 2.5RIVEJÄ-----------801 record(s) selected.
Montako yhdistelmää saadaan aikaan Opiskelija- ja Tenttii-relaatioista, jos kelpuutetaan mukaan ne rivit joissa arvosana on> 2.5 ja ne rivit joissa opiskelijan hetu on sama kuin tenttii-taulun opiskelija-kenttä (liitosehto):
SELECT COUNT(*) AS rivejäFROM Opiskelija, TenttiiWHERE arvosana> 2.5
AND Opiskelija.Hetu = Tenttii.Opiskelija
RIVEJÄ-----------101 record(s) selected.

Käyttäjien kommentit