TIEDONHALLINTA - SYKSY 2011 Kurssikoodi: Saapumisryhmä: Luento 10 TU00AA48-2002 TU10S1E Hannu Markkanen 14.-15.11.2011 9/10/12 Helsinki Metropolia University of Applied Sciences 1
SQL: Monen taulun kyselyt ulkoliitos, yhdiste
Ulkoliitos: OUTER JOIN Sisäliitoksen tulostaulussa on mukana vain ne rivit joilla valintaehdossa käytettyjen sarakkeiden arvot ovat samat Jos tuloksiin halutaan mukaan myös rivit, joilla ei ole vastinparia toisessa taulussa, käytetään ulkoliitosta Ulkoliitoksen tuottamassa taulussa on sisäisen liitoksen tuloksen lisäksi jokaista paritonta riviä vastaava alku- tai loppuosaltaan NULL-arvoilla täydennetty rivi Ulkoliitos voi olla vasemman-puoleinen (LEFT OUTER JOIN), oikeanpuoleinen (RIGHT OUTER JOIN) tai molemminpuolinen (FULL OUTER JOIN) Hannu Markkanen Metropolia Ammattikorkeakoulu 3
ostun osnimi 1 Tietohallinto 2 Talous toim. 3 Tuotanto os. 4 Markkinointi htun enimi snimi ostun 2134 Jukka Virta 3 2234 Mikko Metsä 1 2245 Raili Joki 4 2345 Leo Meri 3 2884 Jukka Järvi NULL 3546 Laura Ranta 1 SELECT * FROM henkilo, osasto htun enimi snimi ostun ostun osnimi 2134 Jukka Virta 3 1 Tietohallinto 2134 Jukka Virta 3 2 Talous toim. 2134 Jukka Virta 3 3 Tuotanto os. 2134 Jukka Virta 3 4 Markkinointi 2234 Mikko Metsä 1 1 Tietohallinto 2234 Mikko Metsä 1 2 Talous toim. 2245 Raili Joki 4 4 Markkinointi 2345 Leo Meri 3 3 Tuotanto os. 2884 Jukka Järvi NULL 1 Tietohallinto 2884 Jukka Järvi NULL 2 Talous toim. 2884 Jukka Järvi NULL 3 Tuotanto os. 2884 Jukka Järvi NULL 4 Markkinoint 3547 Lyly Jokinen 3 htun enimi snimi ostun ostun osnimi 2234 Mikko Metsä 1 1 Tietohallinto SELECT * FROM henkilo INNER JOIN osasto ON henkilo.ostun = osasto.ostun 3546 Laura Ranta 1 1 Tietohallinto 2134 Jukka Virta 3 3 Tuotanto os. 2345 Leo Meri 3 3 Tuotanto os. 3547 Lyly Jokinen 3 3 Tuotanto os. 2245 Raili Joki 4 4 Markkinointi Hannu Markkanen Metropolia Ammattikorkeakoulu 4
LEFT OUTER JOIN Relaatiot: osasto (ostun, osnimi) henkilo (htun, enimi, snimi, ostun) Haetaan työntekijöiden nimet osastoittain s.e. myös henkilöt joille ei ole (vielä) määritelty osastoa otetaan mukaan tulostauluun. INNER JOIN SELECT osnimi, snimi, enimi FROM henkilo INNER JOIN osasto ON henkilo.ostun = osasto.ostun osnimi snimi enimi Tietohallinto Metsä Mikko Tietohallinto Ranta Laura Tuotanto os. Virta Jukka Tuotanto os. Meri Leo Tuotanto os. Jokinen Lyly Markkinointi Joki Raili LEFT OUTER JOIN SELECT osnimi, snimi, enimi FROM henkilo LEFT OUTER JOIN osasto ON henkilo.ostun = osasto.ostun osnimi snimi enimi Tuotanto os. Virta Jukka Tietohallinto Metsä Mikko Markkinointi Joki Raili Tuotanto os. Meri Leo NULL Järvi Jukka Tietohallinto Ranta Laura Tuotanto os. Jokinen Lyly Hannu Markkanen Metropolia Ammattikorkeakoulu 5
RIGHT OUTER JOIN Relaatiot: osasto (ostun, osnimi) henkilo (htun, enimi, snimi, ostun) Haetaan työntekijöiden nimet osastoittain s.e. myös osastot joilla ei ole (vielä) työntekijöitä otetaan mukaan tulostauluun. INNER JOIN SELECT osnimi, snimi, enimi FROM henkilo INNER JOIN osasto ON henkilo.ostun = osasto.ostun osnimi snimi enimi Tietohallinto Metsä Mikko Tietohallinto Ranta Laura Tuotanto os. Virta Jukka Tuotanto os. Meri Leo Tuotanto os. Jokinen Lyly Markkinointi Joki Raili RIGHT OUTER JOIN SELECT osnimi, snimi, enimi FROM henkilo RIGHT OUTER JOIN osasto ON henkilo.ostun = osasto.ostun osnimi snimi enimi Tietohallinto Metsä Mikko Tietohallinto Ranta Laura Talous toim. NULL NULL Tuotanto os. Virta Jukka Tuotanto os. Meri Leo Tuotanto os. Jokinen Lyly Markkinointi Joki Raili Hannu Markkanen Metropolia Ammattikorkeakoulu 6
FULL OUTER JOIN MySQL ei tue molemminpuolista ulkoliitosta Sama tulos saavutetaan yhdistämällä LEFT OUTER JOIN ja RIGHT OUTER JOIN kyselyjen tulokset käyttäen UNION-operaatiota UNION on yksi SQL-standardin joukko-operaatioista Muita joukko-operaatioita (tuki eri TKHJ-tuotteissa vaihtelevaa) ovat EXCEPT erotus INTERSECT - leikkaus Hannu Markkanen Metropolia Ammattikorkeakoulu 7
Yhdiste (UNION) UNION-operaattorilla voidaan yhdistää rakenteeltaan samanlaisia tauluja Sama määrä sarakkeita Vastaavien sarakkeiden tietotyypit oltava samoja Yhdistetaulussa on riveinä kaikkien yhdistettävien taulujen rivit Yhdiste saadaan aikaan sijoittamalla taulut määrittelevien SELECT-lauseiden väliin avainsana UNION (ei tuplia) tai UNION ALL (kaikki rivit) Hannu Markkanen Metropolia Ammattikorkeakoulu 8
LEFT OUTER JOIN SELECT osnimi, snimi, enimi FROM henkilo LEFT OUTER JOIN osasto ON henkilo.ostun = osasto.ostun osnimi snimi enimi Tuotanto os. Virta Jukka Tietohallinto Metsä Mikko Markkinointi Joki Raili Tuotanto os. Meri Leo NULL Järvi Jukka Tietohallinto Ranta Laura Tuotanto os. Jokinen Lyly RIGHT OUTER JOIN SELECT osnimi, snimi, enimi FROM henkilo RIGHT OUTER JOIN osasto ON henkilo.ostun = osasto.ostun osnimi snimi enimi Tietohallinto Metsä Mikko Tietohallinto Ranta Laura Talous toim. NULL NULL Tuotanto os. Virta Jukka Tuotanto os. Meri Leo Tuotanto os. Jokinen Lyly Markkinointi Joki Raili FULL OUTER JOIN UNION-operaation avulla RIGHT OUTER JOIN SELECT osnimi, snimi, enimi FROM henkilo LEFT OUTER JOIN osasto ON henkilo.ostun = osasto.ostun UNION SELECT osnimi, snimi, enimi FROM henkilo RIGHT OUTER JOIN osasto ON henkilo.ostun = osasto.ostun osnimi snimi enimi Tuotanto os. Virta Jukka Tietohallinto Metsä Mikko Markkinointi Joki Raili Tuotanto os. Meri Leo NULL Järvi Jukka Tietohallinto Ranta Laura Tuotanto os. Jokinen Lyly Talous toim. NULL NULL Hannu Markkanen 9
UNION esimerkki Jatkuva-arvoisen attribuutin luokittelu Relaatio: henkilo (htun, enimi, snimi, palkka) SELECT 1 AS palkkaluokka, snimi, enimi, palkka FROM henkilo WHERE palkka BETWEEN 0 AND 2700 UNION SELECT 2, snimi, enimi, palkka FROM henkilo WHERE palkka BETWEEN 2700 AND 3000 UNION SELECT 3, snimi, enimi, palkka FROM henkilo WHERE palkka > 3000 ORDER BY palkkaluokka, snimi Huomioi lauseesta myös seuraavat asiat: SELECT <vakio> tuottaa jokaiselle tulostaulun riville ko. vakion arvon Tulostaulun rivien otsikoiksi tulee ensimmäisen SELECT-lauseen mukaiset otsikot (huomaa yllä AS määreen käyttö luokkasarakkeen otsikkona) Yhdisteellä luodun taulun sarakkeita voidaan järjestää normaaliin tapaan ORDER BY lausekkeen avulla. Hannu Markkanen Metropolia Ammattikorkeakoulu 10
Alikyselyt Alikyselyä voidaan käyttää kyselyssä monella tapaa, esimerkiksi 1. WHERE-osan valintaehdossa 2. Väliaikaisena tauluna missä tahansa hakulauseen osassa, jossa voi olla taulu (FROM, JOIN) 3. SELECT-osassa tuottamassa riville arvo alikyselyn pitää palauttaa tässä tapauksessa yksi arvo Alikysely sijoitetaan pääkyselyn sisään Alikysely kirjoitetaan sulkeiden sisään ja siten se suoritetaan ennen pääkyselyä Alikyselyjä voi olla useita sisäkkäin Hannu Markkanen Metropolia Ammattikorkeakoulu 11
Alikysely WHERE-ehdossa Relaatio: henkilo (htun, enimi, snimi, ostun) Haetaan henkilöt jotka työskentelevät samalla osastolla kuin Jukka Virta SELECT snimi, enimi FROM henkilo WHERE ostun = (SELECT ostun FROM henkilo WHERE enimi = "Jukka" AND snimi = "Virta") Koska pääkyselyn WHERE-ehdossa käytettään =-operaattoria, alikysely voi palauttaa vain yhden rivin (jos tulostaulussa on useampia rivejä, saadaan virheilmoitus) Sama haku voidaan tehdä liitoksen avulla (taululle voi tehdä liitoksen itsensä kanssa): SELECT h1.snimi, h1.enimi FROM henkilo AS h1 INNER JOIN henkilo AS h2 WHERE h1.ostun = h2.ostun AND h2.enimi = "Jukka" AND h2. snimi = "Virta Hannu Markkanen Metropolia Ammattikorkeakoulu 12
Alikysely WHERE-ehdossa Relaatiot: henkilo (htun, enimi, snimi, kunta, ostun) Haetaan henkilöt jotka työskentelevät sellaisilla osastoilla joilla on töissä joku turkulainen. SELECT snimi, enimi FROM henkilo WHERE ostun IN (SELECT DISTINCT ostun FROM henkilo WHERE kunta = "TURKU") Alikysely palauttaa useamman osastotunnuksen ja siksi on käytettävä IN operaattoria pääkyselyn WHERE-ehdossa Ja sama liitosta käyttäen: SELECT DISTINCT h1.snimi, h1.enimi FROM henkilo h1 INNER JOIN henkilo h2 WHERE h1.ostun = h2.ostun AND h2.kunta = "TURKU HUOM! AS-määreen voi jättää pois alias-määrittelystä Hannu Markkanen Metropolia Ammattikorkeakoulu 13
Alikysely WHERE-ehdossa koostefunktion käyttö Relaatio: henkilo (htun, enimi, snimi, palkka, ostun) Kuka on yrityksen parhaiten palkittu henkilö? SELECT snimi, enimi FROM henkilo WHERE palkka = (SELECT max(palkka) FROM henkilo) Alikysely tarvitaan koska WHERE-ehdossa ei voi käyttää koostefunktiota. Hannu Markkanen Metropolia Ammattikorkeakoulu 14
Alikysely väliaikaisena tauluna Tehdään edellisen esimerkin haku käyttämällä alikyselyä liitoksessa väliaikaisena tauluna Relaatio: henkilo (htun, enimi, snimi, palkka, ostun) SELECT snimi, enimi, palkka FROM henkilo INNER JOIN (SELECT MAX(palkka) AS maxpalkka FROM henkilo) AS maxpalkanhaku ON palkka = maxpalkka Huom! Myös välikaiset taulut on aina nimettävä (yllä maxpalkanhaku ), vaikka nimeä ei käytettäisikään missään nimen pois jättäminen aiheuttaa virheilmoituksen Hannu Markkanen Metropolia Ammattikorkeakoulu 15
Top n ja Bottom n SELECT... FROM... ORDER BY <sarake> [ DESC ] LIMIT <numero> <numero> määrää listattavien rivien määrän DESC määreen käytöllä voidaan valita joko top tai bottom Esimerkki: henkilo (htun, enimi, snimi, palkka, ostun) Ketkä ovat viisi parhaiten palkattua henkilöä? SELECT snimi, enimi, palkka FROM henkilo ORDER BY palkka DESC LIMIT 5 Hannu Markkanen Metropolia Ammattikorkeakoulu 16
Yhteenvetoa relaatiooperaatioista
Relaatiomallin matemaattinen tausta Tauluja käsitellään relaatio-operaatioilla, joiden tuloksena on (uusia, mahdollisesti tilapäisiä) tauluja Relaatiomalli perustuu matemaattisen logiikan ja joukko-opin käsitteisiin Relaatiot ovat (matemaattisessa mielessä) joukkoja, joihin voidaan soveltaa tavanomaisia joukko-opin operaatioita Käsittelyn kannalta on tärkeää, että tulosjoukkokin on relaatio eli kaikki operaatiot johtavat tulokseen, jota voidaan edelleen käsitellä samoilla operaatioilla Toisaalta voidaan saada vain sellaisia kyselytuloksia, jotka voidaan muodostaa relaatio-operaatioiden avulla Hannu Markkanen Metropolia Ammattikorkeakoulu 18
Relaatio-operaatiot Relaatioiden käsittelyssä erityisen hyödyllisiä operaatiota ovat (SELECT-lauseella toteutettavat) valinta (rivien valinta) projektio (sarakkeiden valinta) relaatioiden (taulujen) liitokset Koska relaatiot ovat joukkoja joukko-opin mielessä, niihin voidaan soveltaa myös joukko-opin operaatioita unioni leikkaus erotus Hannu Markkanen Metropolia Ammattikorkeakoulu 19
Valintaoperaatiot Rivien valinta: valinta Projektio (sarakkeiden valinta): projektio Hannu Markkanen Metropolia Ammattikorkeakoulu 20
Liitosoperaatiot liitos Hannu Markkanen Metropolia Ammattikorkeakoulu 21
Joukko-operaatiot A B Unioni A B: Leikkaus A B: Erotus A \ B: Hannu Markkanen Metropolia Ammattikorkeakoulu 22