Tietokannat -kurssi KSAO, Datanomit, käytön tuki kevät 2015 Lauri Tapola
Tietojen yhdistäminen eri taulujen välillä. SQL join Lauri Tapola
Miksi tietoja pitää yhdistellä? Relaatiotietokannoissa tiettyyn asiaan liittyvä data on vain yhdessä taulussa. Jos esimerkiksi lainaus raportille halutaan asiakkaan nimi asiakas – taulusta ja kirjan nimi kirja –taulusta, niin taulujen data pitää yhdistellä perus- ja viiteavainten avulla.
Kuinka tietoja yhdistellään? Avaimet! Ohessa on kirjasto- taulujen avaimet. lainaus –taulusta on viite-avaimet kirja –tauluun sekä asiakas –tauluun. Taulu: kirja Perusavain : kirja_id Taulu: lainaus Perusavain: lainaus_id Viiteavaimet: asiakas_id ja kirja_id Taulu: asiakas Perusavain: asiakas_id
Yhdistelmäkyselyt. Perus- ja viiteavaimet. Kun yhdistellään taulujen tietoja, ensiksi annetaan tauluille aliasnimet, jotta kysely lyhenee. Esimerkiksi kirja=kir, asiakas=asi, lainaus=lai. ( Voidaan myös käyttää kokonaisia taulujen nimiä, mutta se on hitaampaa.) SELECT –komennossa valitaan alias-nimet ja kentät: SELECT asi.asiakas_nimi, lai.lainauspaiva, lai.palautuspaiva, lai.kirja_id FROM asiakas asi, lainaus lai WHERE asi.asiakas_id=lai.asiakas_id WHERE –komennossa linkitetään taulut avainkenttien perusteella. Taulu: kirja = kir Perusavain : kirja_id Taulu: lainaus = lai Perusavain: lainaus_id Viiteavaimet: asiakas_id ja kirja_id Taulu: asiakas = asi Perusavain: asiakas_id
Taulujen tietojen yhdistämiseksi tarvitaan join- komentoja tai viiteavainten linkitys WHERE ehdossa. Yleisin tapa eri taulujen tietojen yhdistämiseksi on viiteavainten linkitys WHERE ehdossa seuraavan esimerkin mukaisesti: SELECT asi.asiakas_nimi, lai.lainauspaiva, lai.palautuspaiva, lai.kirja_id FROM asiakas asi, lainaus lai WHERE asi.asiakas_id = lai.asiakas_id mitä edellinen kysely palauttaa? JOIN –komennot käydään jatkokurssilla. Jos asia kiinnostaa, katso INNER JOIN, LEFT JOIN, RIGHT JOIN, FULL JOIN.
Yhdistelmäkyselyt. Esimerkki1, kirjasto 1.Hae lainatut kirjat. Listaa kirja_id, kirjan nimi ja lainauspäivä. SELECT kir.kirja_id, kir.kirjan_nimi, lai.lainauspaiva FROM kirja kir, lainaus lai WHERE kir.kirja_id = lai.kirja_id Kysely palauttaa 17 riviä. Taulu: kirja = kir Perusavain : kirja_id Taulu: lainaus = lai Perusavain: lainaus_id Viiteavaimet: asiakas_id ja kirja_id
Yhdistelmäkyselyt. Esimerkki2, kirjasto 2. Hae lainassa olevat kirjat. Listaa kirja_id, kirjan nimi, lainauspäivä ja palautuspäivä. Jos kirjaa ei ole palautettu, niin palautuspäivä on siis tyhjä isnull(lai.palautuspaiva). SELECT kir.kirja_id, kir.kirjan_nimi, lai.lainauspaiva, lai.palautuspaiva FROM kirja kir, lainaus lai WHERE kir.kirja_id = lai.kirja_id AND ISNULL(lai.palautuspaiva) Kysely palauttaa 10 riviä. Taulu: kirja = kir Perusavain : kirja_id Taulu: lainaus = lai Perusavain: lainaus_id Viiteavaimet: asiakas_id ja kirja_id
Yhdistelmäkyselyt. Esimerkki3, kirjasto 3. Hae lainassa olevat kirjat. Listaa kirja_id, kirjan nimi, lainauspäivä, eräpäivä ja Asiakasnimi. Listaa Asiakasnimen ja lainauspäivän mukaisessa järjestyksessä. SELECT kir.kirja_id, kir.kirjan_nimi, lai.lainauspaiva, lai.erapaiva, asi.asiakas_nimi FROM kirja kir, lainaus lai, asiakas asi WHERE kir.kirja_id = lai.kirja_id AND asi.asiakas_id=lai.asiakas_id AND ISNULL(lai.palautuspaiva) ORDER BY asi.asiakas_nimi, lai.lainauspaiva Taulu: kirja = kir Perusavain : kirja_id Taulu: lainaus = lai Perusavain: lainaus_id Viiteavaimet: asiakas_id ja kirja_id Taulu: asiakas = asi Perusavain: asiakas_id
Yhdistelmäkyselyt. Esimerkki4, kirjasto 4. Hae myöhässä olevat kirjat. Listaa kirja_id, kirjan nimi, lainauspäivä, eräpäivä, nykyinen päivä, asiakasnimi ja lisäksi teksti ”MYÖHÄSSÄ”. Listaa Asiakasnimen mukaisessa järjestyksessä. SELECT kir.kirja_id, kir.kirjan_nimi, lai.lainauspaiva, lai.erapaiva, date(now()) as tanaan, asi.asiakas_nimi, "MYÖHÄSSÄ" as tila FROM kirja kir, lainaus lai, asiakas asi WHERE kir.kirja_id = lai.kirja_id AND asi.asiakas_id=lai.asiakas_id AND ISNULL(lai.palautuspaiva) AND date(now()) > lai.erapaiva ORDER BY asi.asiakas_nimi, lai.lainauspaiva
Oppimistehtävä 6 – kysymys Suunnittele kysely seuraavaan tarpeeseen. h1. Hae Maaliskuussa lainatut kirjat. Listaa niiden nimet ja lainauspäivä. Ohje: hae ensin maaliskuun lainaukset. Select * from lainaus where lainauspaiva >= " " and lainauspaiva < " ” Yhdistä lainaus-taulu ja kirja-taulu. WHERE lai.kirja_id = kir.kirja_id Lopuksi valitset sarakkeet yhdistelmäkyselyyn. SELECT kir.kirjan_nimi, lai.lainauspaiva FROM lainaus lai, kirja kir Taulu: kirja Perusavain : kirja_id Taulu: lainaus Perusavain: lainaus_id Viiteavaimet: asiakas_id ja kirja_id
Oppimistehtävä 6 – VIHJE Alla on oikeat vastaus, mutta rivit ovat menneet väärään järjestykseen, laita ne oikeaan järjestykseen niin löydät oikean vastauksen. h1. Hae Maaliskuussa lainatut kirjat. Listaa niiden nimet ja lainauspäivä. lai.lainauspaiva >= " " and lai.lainauspaiva < " " FROM lainaus lai, kirja kir SELECT kir.kirjan_nimi, lai.lainauspaiva WHERE lai.kirja_id = kir.kirja_id and Taulu: kirja Perusavain : kirja_id Taulu: lainaus Perusavain: lainaus_id Viiteavaimet: asiakas_id ja kirja_id