Liitos (JOIN)

Graphic1

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, Tenttii
WHERE Opiskelija.hetu = Tenttii.opiskelija
AND arvosana> 2.5;
SUKUNIMI ARVOSANA
------------ --------
Lahtonen 3,00
Kielinero 3,00
Kielinero 3,00
Kirjailija 2,75
Kirjailija 3,00
Kasvattaja 2,75
Kasvattaja 2,75
Kasvattaja 3,00
Heinonen 2,75
Heinonen 2,75
10 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 Opiskelija 
RIVEJÄ 
-----------
8
1 record(s) selected.

Montako riviä on Opiskelija-relaatiossa:

SELECT COUNT(*) AS rivejä FROM Tenttii 
WHERE arvosana> 2.5 
RIVEJÄ 
-----------
10
1 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, Tenttii 
WHERE arvosana> 2.5 
RIVEJÄ 
-----------
80
1 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, Tenttii 
WHERE arvosana> 2.5 

AND Opiskelija.Hetu = Tenttii.Opiskelija

RIVEJÄ -----------
10
1 record(s) selected.

Käyttäjien kommentit

Kommentoi tätä sivua Lisää uusi kommentti
Kurssimateriaalien käyttäminen kaupallisiin tarkoituksiin tai opetusmateriaalina ilman lupaa on ehdottomasti kielletty!
http://appro.mit.jyu.fi/doc/tiedonhallinta/sql/dml/index17.html
© Antti Ekonoja (anjoekon@jyu.fi) <http://users.jyu.fi/~anjoekon/>
Tommi Lahtonen (tommi.j.lahtonen@jyu.fi) <http://hazor.iki.fi/>
Jukka Mäntylä (jmantyla@iki.fi) <http://www.iki.fi/jmantyla/>
2004-11-05 15:25:31
Informaatioteknologia - Jyväskylän yliopiston IT-tiedekunta ja avoin yliopisto