Monen taulun kyselyt FROM-lausekkeessa voidaan määritellä useampi kuin yksi taulu, josta tietoja haetaan: SELECT <sarakelista> FROM <taululista> Tuloksena on taululistassa lueteltujen taulujen rivien karteesinen tulo Karteesista tuloa muodostettaessa kutakin taulun riviä käsitellään kokonaisuutena joukko-opillisena alkiona. Karteesisessa tulossa ovat mukana kaikki mahdolliset alkuperäisten taulujen rivien (alkioiden) yhdistelmät. Pasi Ranne 25.9.2013 Metropolia Ammattikorkeakoulu 3
Karteesinen tulo - esimerkki Karteesinen tulo saadaan kyselyllä: SELECT osnimi, snimi, enimi FROM osasto, henkilo Tuloksena taulu, jossa kaikki mahdolliset henkilöiden ja osastojen yhdistelmät (ei siis vain ne, jotka ovat viiteavain pääavain arvojen perusteella mielekkäitä!) Karteesista tuloa tarvitaan hyvin harvoin ja se voi olla laskennallisesti hyvin raskas. Pasi Ranne 25.9.2013 Metropolia Ammattikorkeakoulu 4
Monen taulun kyselyt liitoksien avulla Kun kyselyn tulokseen halutaan mielekkäästi tietoa useammasta kuin yhdestä taulusta, täytyy eri taulujen rivit yhdistää muodostamalla niiden välille liitos Yhdistäminen perustuu tavallisesti viite- ja pääavainkenttien arvojen yhtäsuuruuteen, mutta ei välttämättä Yhdistäminen voidaan tehdä kahdella tavalla 1. JOIN-lauseketta käyttäen Useita erilaisia, yhdistävät tietoa eri tavoin (erikoisempia ei välttämättä tueta kaikissa TKHJ-tuotteissa) Suositeltavampi tapa 2. Kirjoitetaan yhdistämissääntö WHERE-lausekkeeseen Vanha tapa Pasi Ranne 25.9.2013 Metropolia Ammattikorkeakoulu 5
Sisäliitos: INNER JOIN INNER JOIN kyselyn tulokseen otetaan mukaan vain sellaiset rivit joilla valintaehdossa käytettyjen sarakkeiden arvo on sama Liitos voidaan muodostaa kahden tai useamman taulun välille Kahden taulun liitos: SELECT <sarakelista> FROM <taulu1> INNER JOIN <taulu2> ON <sarake1> = <sarake2> WHERE <rivien valintaehdot>; Pasi Ranne 25.9.2013 Metropolia Ammattikorkeakoulu 6
Kahden taulun sisäliitos Esimerkki Tehtävä: Listaa työntekijöiden nimet osastoittain. SELECT ostun, snimi, enimi FROM henkilo Jos tuloksesta ilmettävä osaston nimi, joudutaan tiedot hakemaan kahdesta taulusta sisäliitoksen avulla: SELECT osnimi, snimi, enimi FROM henkilo INNER JOIN osasto ON henkilo.ostun = osasto.ostun Huom! Taulun nimi on laitettava sarakenimen eteen, jos saman niminen sarake useammassa kuin yhdessä taulussa Pasi Ranne 25.9.2013 Metropolia Ammattikorkeakoulu 7
Kahden taulun sisäliitos Tulosten rajaus ja järjestely Tehtävä: Listaa tietohallinnon työntekijöiden nimet aakkosjärjestyksessä. SELECT snimi, enimi FROM henkilo INNER JOIN osasto ON henkilo.ostun = osasto.ostun WHERE osnimi = "Tietohallinto ORDER BY snimi, enimi; Pasi Ranne 25.9.2013 Metropolia Ammattikorkeakoulu 8
Kahden taulun sisäliitos Tulosten ryhmittely Tehtävä: Listaa eri osastojen työntekijöiden lukumäärät. Tarvitaan koostefunktiota ja tulosten ryhmittelyä: SELECT osnimi, COUNT(*) FROM henkilo INNER JOIN osasto ON henkilo.ostun = osasto.ostun GROUP BY osnimi; Pasi Ranne 25.9.2013 Metropolia Ammattikorkeakoulu 9
INNER JOIN vaihtoehtoisia syntakseja (SQL-92) SELECT osnimi, snimi, enimi FROM henkilo INNER JOIN osasto ON henkilo.ostun = osasto.ostun; Jos liitoksessa käytettyjen sarakkeiden nimet ovat molemmissa tauluissa samat, tarjolla on seuraavat vaihtoehtoiset muodot: SELECT osnimi, snimi, enimi FROM henkilo JOIN osasto USING (ostun); SELECT osnimi, snimi, enimi FROM henkilo NATURAL JOIN osasto; Pasi Ranne 25.9.2013 Metropolia Ammattikorkeakoulu 10
Kolmen taulun sisäliitos proj (ptun, pnimi) proj_henk (ptun, htun, tunnit) Tehtävä: Listaa henkilöiden eri projekteille tekemät tunnit käyttäen henkilön ja projektin nimiä. Kyselyn rakenne on sama kuin kahden taulun kyselyssä, mutta FROM lausekkeen INNER JOIN määreen toisena tauluna onkin nyt toisella INNER JOIN määreen mukainen kahden taulun liitoksena syntynyt taulu (eli sillä on INNER JOIN operaation mukaiset rivit). SELECT snimi, enimi, pnimi, tunnit FROM henkilo INNER JOIN proj_henk ON henkilo.htun = proj_henk.htun INNER JOIN proj ON proj_henk.ptun = proj.ptun ORDER BY snimi, enimi, pnimi Pasi Ranne 25.9.2013 Metropolia Ammattikorkeakoulu 11
Monen taulun kyselyt Vanha tapa Relaatiot ja INNER JOIN -kysely: SELECT osnimi, snimi, enimi FROM henkilo INNER JOIN osasto ON henkilo.ostun = osasto.ostun Vanha tapa Annetaan yhdistämissääntö WHERE-lausekkeessa: SELECT osnimi, snimi, enimi FROM henkilo, osasto WHERE henkilo.ostun = osasto.ostun Kyselyn suoritus: muodostetaan ensin karteesinen tulo ja valitaan siitä WHERE-ehdon mukaiset rivit Laskennallinen tehokkuus? WHERE-ehdon unohtaminen? Pasi Ranne 25.9.2013 Metropolia Ammattikorkeakoulu 12