Tulostaulun tyhjyyden testaaminen Luettele ne asiakkaat, joilla on sekä talletus että laina -konttorissa. (Leikkaus!) useita mahdollisia toteutustapoja INTERSECT sisäkysely sisäkysely + tulostaulun tyhjyyden testaaminen exists = tulostaulu ei ole tyhjä not exists = tulostaulu on tyhjä Informaatiojärjestelmät, kevät 1997 02/11/97 1 Tulostaulun tyhjyyden testaaminen SELECT AsNimi FROM Asiakas A WHERE EXISTS (SELECT * T tosi, jos sisäkyselyn vastaus ei ole tyhjä! WHERE (T.AsNimi = A.Asnimi) AND (Knimi = '')) AND EXISTS (SELECT * FROM Laina L WHERE (L.AsNimi = A.Asnimi) AND (Knimi = '') ); Informaatiojärjestelmät, kevät 1997 02/11/97 2 Relaation tyhjyyden testaaminen Luettele ne asiakkaat, joilla on talletus mutta ei lainaa -konttorissa. (Erotus!) MINUS sisäkysely sisäkysely + relaation tyhjyyden testaaminen Informaatiojärjestelmät, kevät 1997 02/11/97 3 Tulostaulun tyhjyyden testaaminen SELECT AsNimi FROM Asiakas A WHERE EXISTS (SELECT * T WHERE (T.AsNimi = A.Asnimi) AND (Knimi = '')) tosi, jos AND NOT EXISTS sisäkyselyn (SELECT * vastaus on FROM Laina L tyhjä! WHERE (L.AsNimi = A.Asnimi) AND (Knimi = '') ); tosi, jos sisäkyselyn vastaus ei ole tyhjä! Informaatiojärjestelmät, kevät 1997 02/11/97 4 Tulosrivien järjestäminen Järjestäminen usean attribuutin avulla: ORDER BY Attribuutit ASC/DESC ASC on nouseva järjestys (aakkos-, suuruusjärj.), DESC laskeva järjestys. ASC on oletusarvo. SELECT * FROM Asiakas WHERE Asnro < 6 ORDER BY Nimi; Informaatiojärjestelmät, kevät 1997 02/11/97 5 Esimerkkitaulu AUTO: Reknro Merkki Vmalli ACM-256 Volvo 1988 OSI-228 Mersu ROM-771 Volvo 1989 ALU-444 Volvo 1989 CPU-533 Lada 1982 DOS-999 Volvo 1993 Informaatiojärjestelmät, kevät 1997 02/11/97 6 Tietojenkäsittelytieteen laitos 1/9
Järjestäminen usean attribuutin avulla: SELECT * ORDER BY Merkki ASC, Vmalli DESC; Merkki ensisijainen Vmalli toissijainen Reknro Merkki Vmalli CPU-533 Lada 1982 OSI-228 Mersu DOS-999 Volvo 1993 - ROM-771 Volvo 1989 ALU-444 Volvo 1989 ACM-256 Volvo 1988 Huom! Relaatioalgebrassa ei järjestysoperaatiota LIKE ja jokerimerkit Jos attribuutin arvo on merkkijono, WHERE-ehto voidaan kirjoittaa... WHERE Attribuutti LIKE Maski Maski: tavallinen merkkijono, jossa voi olla % (prosenttimerkki)» täsmää kaikkiin merkkijonoihin _ (alaviiva)» täsmää kaikki yksittäisiin merkkeihin Informaatiojärjestelmät, kevät 1997 02/11/97 7 Informaatiojärjestelmät, kevät 1997 02/11/97 8 SELECT Asnro, Nimi FROM Asiakas WHERE Nimi LIKE 'Nur%'; Esim. Nurmi, Nurminen, Nurmelainen WHERE Nimi LIKE '%mi%'; Esim. Helminen, Nurminen, Nurmi WHERE Nimi LIKE ' '; Esim. Salo, Kari, mutta ei Aho WHERE Nimi LIKE ' %'; Esim. Salo, Salonen, Virtanen jne. Huom! WHERE Nimi LIKE 'Salo'; tai WHERE Nimi= 'Salo'; Informaatiojärjestelmät, kevät 1997 02/11/97 9 Informaatiojärjestelmät, kevät 1997 02/11/97 10 Myös NOT LIKE -määrettä voidaan käyttää: SELECT Nimi FROM Asiakas WHERE Nimi NOT LIKE 'A%'; Informaatiojärjestelmät, kevät 1997 02/11/97 11 Koostefunktiot ja ryhmittely Tietotarpeiden kohteina ovat usein yhteenvedot Koostefunktiot AVG keskiarvo MIN pienin arvo (minimi) MAX suurin arvo (maksimi) SUM summa COUNT lukumäärä Voidaan laskea koko tulostaulun yli tai ryhmäkohtaisina Informaatiojärjestelmät, kevät 1997 02/11/97 12 Tietojenkäsittelytieteen laitos 2/9
Esimerkki. pankkien talletus- ja lainatietokanta: ASIAKAS AsNimi AsOsoite AsKaupunki Ukkonen Kaivotie Vantaa Tienari Koivikko Helsinki Erkiö Länsitie Vantaa Elomaa Itäväylä Helsinki Laine Otakaari Espoo TALLETUS Tilinro AsNimi 22222 Tienari 2000 55555 Ukkonen 5000 33333 Elomaa 3000 KONTTORI Varat KKaupunki 210 000 Espoo 170 000 Tampere PSP6 80 000 Espoo LAINA Tilinro AsNimi 500 Laine 4000 202 Elomaa 2500 PSP6 660 Ukkonen 500 444 Erkiö 1500 Informaatiojärjestelmät, kevät 1997 02/11/97 13 Mikä on asiakkaiden suurin talletus? SELECT MAX() ; MAX() 5000 Laskettaessa koko tulostaulun yli on tuloksena yksi rivi, jossa voi olla vain vakioita ja koostetietoa Informaatiojärjestelmät, kevät 1997 02/11/97 14 Mikä on asiakkaiden suurin talletus? SELECT MAX() ; MAX() 5000 Mikä on keskimääräinen lainan suuruus? SELECT AVG() FROM Laina; AVG() 2125 Montako talletustiliä konttoreilla on yhteensä? SELECT COUNT(*) COUNT(*) ; 3 Informaatiojärjestelmät, kevät 1997 02/11/97 15 Informaatiojärjestelmät, kevät 1997 02/11/97 16 SELECT COUNT(Tilinro) COUNT(Tilinro) ; 3 Laskee sarakkeessa olevien arvojen määrän = rivimäärä SELECT COUNT(DISTINCT ) ; Laskee erilaisten arvojen määrän COUNT(DISTINCT ) 2 Informaatiojärjestelmät, kevät 1997 02/11/97 17 Kenellä on suurin talletus? Kuinka suuri? Ensimmäinen yritys: SELECT AsNimi, MAX() ; Informaatiojärjestelmät, kevät 1997 02/11/97 18 Tietojenkäsittelytieteen laitos 3/9
Kenellä on suurin talletus? Kuinka suuri? Ensimmäinen yritys: SELECT AsNimi, MAX() ; Oracle: " Tämä ei ole yhden ryhmän koostefunktio." Syy: AsNimi on yksittäiseltä riviltä saatava arvo - sellaisia ei voi ottaa mukaan, mikä otettaisiin? Informaatiojärjestelmät, kevät 1997 02/11/97 19 Toinen yritys: SELECT AsNimi, WHERE = (SELECT MAX() ); AsNimi Ukkonen 5000 Informaatiojärjestelmät, kevät 1997 02/11/97 20 Ryhmittely GROUP BY -lauseella muodostetaan riveistä ryhmiä. SELECT ryhmittelyattribuutit, koostefunkiot FROM... WHERE... GROUP BY ryhmittelysarakkeet; Ryhmä = ne rivit, joilla on ryhmittelysarakkeilla sama arvo! Informaatiojärjestelmät, kevät 1997 02/11/97 21 Esimerkki. Pankin tietokanta Luettele kunkin konttorin keskimääräinen lainasumma. SELECT, AVG() FROM Laina GROUP BY ; Ryhmittelysarake Informaatiojärjestelmät, kevät 1997 02/11/97 22 Miten kyselyä evaluoidaan? 1) ryhmiä Knimi:n mukaan: 4000 PSP6 500 2500 1500 Miten kyselyä evaluoidaan? 2) jokaisesta ryhmästä tulostetaan konttorin nimi (joka on aina ryhmän sisällä sama!) ryhmän sisäinen keskiarvo summasta: 4000 PSP6 500 2000 AVG() Informaatiojärjestelmät, kevät 1997 02/11/97 23 Informaatiojärjestelmät, kevät 1997 02/11/97 24 Tietojenkäsittelytieteen laitos 4/9
TOISTUVAT ARVOT? On oleellista, ettei -sarakkeen toistuvia arvoja hävitetä ennen keskiarvon laskemista koska: Toistuvien arvojen poistaminen voi tuottaa virheellisen tuloksen! Esimerkki: Uusi TALLETUS-taulun sisältö: Tilinro AsNimi 44444 Sippu 4000 22222 Tienari 2000 31313 Sippu 3000 55555 Ukkonen 5000 21212 Tienari 7000 33333 Elomaa 3000 Informaatiojärjestelmät, kevät 1997 02/11/97 25 Informaatiojärjestelmät, kevät 1997 02/11/97 26 Toistuvien poistaminen voi tuottaa virheellisen tuloksen! SELECT, AVG(DISTINCT ) GROUP BY ; 1) ryhmät KNimen mukaan: Tilinro AsNimi 44444 55555 22222 31313 21212 33333 Sippu Ukkonen 4000 5000 Tienari 2000 Sippu 3000 Tienari 7000 Elomaa 3000 Informaatiojärjestelmät, kevät 1997 02/11/97 27 Toistuvat pois (summa-sarake): taulu ennen keskiarvon laskemista: Ja lopputulokseksi saataisiin: 4500 4000 4000 5000 2000 7000 3000 VÄÄRIN! KOPin toista 3000:n talletusta ei huomioitu Informaatiojärjestelmät, kevät 1997 02/11/97 28 Säilytetään toistuvat: SELECT, AVG() GROUP BY ; Nyt duplikaatit säilytetään keskiarvon laskentaa varten: Ja keskiarvot lasketaan oikein: 4500 3750 AVG() 4000 5000 3000 2000 7000 3000 Informaatiojärjestelmät, kevät 1997 02/11/97 29 Joskus on tarkoituksenmukaista poistaa toistuvat arvot ennen laskentaa: Kuinka monta tallettajaa kussakin konttorissa on? SELECT, COUNT(AsNimi) AsNimi GROUP BY ; Lopputulos (VÄÄRIN): 2 4 COUNT(Asnimi) Sippu Ukkonen Sippu Tienari Tienari Elomaa Tienari kahteen kertaan! Informaatiojärjestelmät, kevät 1997 02/11/97 30 Tietojenkäsittelytieteen laitos 5/9
Joskus on tarkoituksenmukaista poistaa toistuvat arvot ennen laskentaa: SELECT, COUNT(DISTINCT AsNimi) AsNimi GROUP BY ; Sippu Ukkonen Nyt lopputulos on oikein: Sippu Tienari COUNT(Asnimi) Elomaa 2 3 Informaatiojärjestelmät, kevät 1997 02/11/97 31 Ryhmittelyn vaikutus tulostietolistaan Kun mukana on GROUP BY, niin tulostietoluettelossa voi olla vain 1. koostefunktioita 2. samat attribuuttit kuin GROUP BY osassa. Oracle sallii joidenkin group by -osan attribuuttien jättämisen pois tulostietoluettelosta (silti rivi / ryhmä ) Informaatiojärjestelmät, kevät 1997 02/11/97 32 Ryhmittelyyn liitetty ehto Kyselyyn voidaan liittää HAVING-lause, jonka valintaehtoa sovelletaan ryhmityksen jälkeen: SELECT... FROM... WHERE... GROUP BY ryhmittelysarakkeet HAVING ehto; Esimerkki: pankkitietokanta Luettele kunkin konttorin keskimääräinen talletus niiden konttorien osalta, joissa talletusten keskiarvo on suurempi kuin 4000 mk. SELECT, AVG() GROUP BY HAVING AVG() > 4000; Informaatiojärjestelmät, kevät 1997 02/11/97 33 Informaatiojärjestelmät, kevät 1997 02/11/97 34 Miten kysely evaluoidaan? Ensin ryhmitellään ja lasketaan keskiarvot kuten edellä: AVG() 4500 3750 Sitten valitaan ne rivit, jotka täyttävät ehdon: 4500 AVG() Toinen esimerkki: Niiden konttoreiden talletusten kokonaismäärä, joilla on alle 1000 talletustiliä: SELECT, SUM() GROUP BY HAVING COUNT(*)<1000; Informaatiojärjestelmät, kevät 1997 02/11/97 35 Informaatiojärjestelmät, kevät 1997 02/11/97 36 Tietojenkäsittelytieteen laitos 6/9
Ryhmittely useamman kentän mukaan Esimerkki. Autokaupan yksinkertaistettu ohjehinnasto: AUTO Merkki Vmalli Malli Hinta Escort 60 000 1980 Transit 5 000 Toyota Hiace 65 000 Sierra 110 000 1980 Taunus 7 000 Volvo 1993 340 120 000 Toyota 1988 Corolla 35 000 Informaatiojärjestelmät, kevät 1997 02/11/97 37 Esimerkki Mitkä ovat eri automerkkien keskihinnat vuosimalleittain? SELECT Merkki, Vmalli, AVG(Hinta) GROUP BY Merkki, Vmalli; Informaatiojärjestelmät, kevät 1997 02/11/97 38 Ryhmitellään ensisijaisesti merkin mukaan: Merkki Vmalli Toyota Toyota 1980 1980 1988 Hinta 60 000 5 000 110 000 7 000 65 000 35 000 Volvo 1993 120 000 Sitten toissijaisesti vuosimallin mukaan: Merkki Vmalli Hinta 60 000 110 000 1980 1980 5 000 7 000 Toyota 65 000 Toyota 1988 35 000 Volvo 1993 120 000 Huomaa, että toistuvia ei poisteta! Informaatiojärjestelmät, kevät 1997 02/11/97 39 Informaatiojärjestelmät, kevät 1997 02/11/97 40 Lasketaan keskiarvot jokaisen ryhmän sisällä: tulostetaan merkki, vuosimalli ja ryhmän sisäinen keskiarvo: Merkki Vmalli AVG(Hinta) 85 000 1980 6 000 Toyota 65 000 Toyota 1988 35 000 Volvo 1993 120 000 Tulos järjestetään! Mitkä ovat eri automerkkien keskihinnat vuosimalleittain halvimmasta kalleimpaan? SELECT Merkki, Vmalli, AVG(Hinta) Merkki Vmalli GROUP BY Merkki, Vmalli ORDER BY AVG(Hinta); 1980 6 000 AVG(Hinta) Toyota 1988 35 000 Toyota 65 000 85 000 Volvo 1993 120 000 Informaatiojärjestelmät, kevät 1997 02/11/97 41 Informaatiojärjestelmät, kevät 1997 02/11/97 42 Tietojenkäsittelytieteen laitos 7/9
Esimerkki Luettele kalleimmasta halvimpaan, merkit ja vuosimallit, jotka ovat keskihinnaltaan alle 80 000 mk:n? SELECT Merkki, Vmalli, AVG(Hinta) GROUP BY Merkki, Vmalli HAVING AVG(Hinta) < 80000 ORDER BY AVG(Hinta) DESC; Esimerkki Minkä merkkisen (ja vuosimallisen) auton keskihinta on korkein? SELECT Merkki, Vmalli, MAX(AVG(Hinta)) VÄÄRIN! GROUP BY Merkki, Vmalli; Koostefunktioita ei saa kirjoittaa peräkkäin! Informaatiojärjestelmät, kevät 1997 02/11/97 43 Informaatiojärjestelmät, kevät 1997 02/11/97 44 Kokeillaan sisäkyselyä: SELECT Merkki, Vmalli, AVG(Hinta) GROUP BY Merkki, Vmalli HAVING AVG(Hinta) >= ALL (SELECT AVG(Hinta) GROUP BY Merkki, Vmalli); Toimii Oraclessa - mutta ei välttämättä kaikissa muissa tkhj:ssä Informaatiojärjestelmät, kevät 1997 02/11/97 45 Milloin ehto sijoitetaan WHERE-lauseeseen, milloin HAVING-lauseeseen? HAVING voi olla vain silloin, kun on GROUP BY. Ehto HAVINGiin vain silloin, kun ehto sisältää jonkin koostefunktion. Loput ehdot WHERE-lauseeseen! Informaatiojärjestelmät, kevät 1997 02/11/97 46 Yhteenveto SELECT Attribuutit FROM Taulut [WHERE Ehto] [GROUP BY Attribuutit] [HAVING Ryhmäehto] [ORDER BY Attribuutit]; [] :lla merkityt osat voivat puuttua. Ehto ja ryhmäehto voivat sisältää sisäkkäisen kyselyn. Informaatiojärjestelmät, kevät 1997 02/11/97 47 Jos kysely sisältää WHERE-, GROUP BY - ja HAVING-osan, menetellään seuraavasti: 1. Lasketaan (kuvitteellisesti) taulujen ristitulo. 2. Karsitaan rivejä WHERE-ehdolla. 3. WHERE-ehdot täyttävät rivit ryhmitellään GROUP BY -osan mukaisesti. 4.Jokaiseen ryhmään sovelletaan HAVING-ehtoja. 5.Lasketaan tulostiedot : Ne ryhmät, jotka täyttävät HAVING-osan, ovat kohteena SELECT-osalle. SELECT-osan koostefunktiot siis lasketaan niille. Informaatiojärjestelmät, kevät 1997 02/11/97 48 Tietojenkäsittelytieteen laitos 8/9
Tyhjäarvot NULL = kentän arvo on tuntematon Esimerkki. Erään pikkufirman myynnit ja ostot: MYYNTI Nro Pvm Asiakas 5 03.06.94 1500 Laine 6 03.06.94 500 NULL 7 04.06.94 400 Elomaa OSTO Nro Pvm Asiakas 122 02.06.94 4000 Erkiö 123 04.06.94 3200 Laine 124 07.06.94 2500 NULL Informaatiojärjestelmät, kevät 1997 02/11/97 49 Esimerkki. Ketkä asiakkaat ovat meille sekä ostajia että myyjiä? SELECT Myynti.Asiakas FROM Myynti, Osto WHERE Myynti.Asiakas = Osto.Asiakas; Asiakas Siis myös NULL <> NULL! Laine Informaatiojärjestelmät, kevät 1997 02/11/97 50 Voidaan testata, onko jokin kenttä NULL: Koostefunktioissa NULL-arvot jätetään huomiotta: Ne myyntitapahtumat, joissa ostajana oli satunnainen asiakas (asiakkaan nimeä ei tällöin kirjattu muistiin)? SELECT * FROM Myynti WHERE Asiakas IS NULL; Nro Pvm Asiakas 6 03.06.94 500 NULL Informaatiojärjestelmät, kevät 1997 02/11/97 51 Esimerkkitaulu OPETTAJA: Nro Nimi Kahvikupit 1 Elomaa 50 2 Laine NULL 3 Kujala 125 4 Orponen 312 SELECT SUM(Kahvikupit) FROM Opettaja; SUM(Kahvikupit) 487 Informaatiojärjestelmät, kevät 1997 02/11/97 52 Koostefunktioissa NULL-arvot jätetään huomiotta: AVG(Kahvikupit)? SELECT AVG(Kahvikupit) FROM Opettaja; AVG(Kahvikupit) 162,333333 Koko rivi jää homiotta, eikä jakaja kasva Tyhjäarvojen korvaus oikeilla Oraclessa on tarjolla funktio nvl, jolla tyhjäarvo voidaan korvata jollain oikealla arvolla select avg(nvl(kahvikupit,200)) from opettaja; TULOS: 145,5 standardissa COALESCE(Kahvikupit,200) Informaatiojärjestelmät, kevät 1997 02/11/97 53 Informaatiojärjestelmät, kevät 1997 02/11/97 54 Tietojenkäsittelytieteen laitos 9/9