Tällä viikolla Kotitehtävien tarkistus Upotettu SQL Indeksi-harjoitus täydennetään pelifirman tietokantamallia SQL-tehtäviä
Seuraavissa harjoituksissa käytetään tukkukauppa-kantaa. 1. Hae kaikki toimittajat joiden yhteyshenkilö on myyntiedustaja (tehtava-kenttä). SELECT * FROM toimittajat WHERE tehtava='myyntiedustaja' 2. Hae tilaukset, joiden rahti ylittää 2,5 miljoonaa. WHERE rahti>2500000 3. Hae tilaukset, joiden asiakastunnus on 'VINET' ja tilaus on vuodelle 2007. WHERE asiakastunnus='vinet' AND tilauspaiva>'2006-12-31' 4. Hae kaikki toimittajat, joissa yrityksen nimi on lyhyempi kuin 20 merkkiä. SELECT * FROM toimittajat WHERE LENGTH(yritys)<20 5. Hae kaikki toimittajat, joissa yrityksen nimi alkaa "L"-kirjaimella. SELECT * FROM toimittajat WHERE LEFT(yritys,1)='L
6. Hae kaikki tilaukset jotka on tehty ennen 20.7.2006. WHERE tilauspaiva<'2006-07-20' 7. Hae kaikki tilaukset jotka on tehty 20.7.2006 jälkeen. WHERE tilauspaiva>'2006-07-20' 8. Hae kaikki tilaukset jotka on tehty välillä 15.7. - 24.7.2006. WHERE tilauspaiva BETWEEN '2006-07-15' AND '2006-07-24' 9. Hae jokaisesta tilauksesta tilausnro, vastaanottajan nimi sekä toimitusosoitteen postinumero ja postitoimipaikka. SELECT tilausnro,vastaanottaja,postinumero,postitoimipaikka FROM tilaukset 10. Hae jokaisesta tuotteesta tuotteen nimi, yksikköhinta, varastosaldo sekä laske näistä kentistä tuotteelle varastoarvo. SELECT tuotenimi, yksikkohinta,varastossa, yksikkohinta*varastossa AS varastoarvo FROM tuotteet
Upotettu SQL SQL-käskyjä voi sisällyttää eli upottaa ohjelmointikieleen Yleisesti käytetään hyväksi API-rajapintoja ODBC, JDBC, ADO.Net Kolmikanta-arkkitehtuuri: 1) web-käyttöliittymä toimii työasemassa 2) sovellus web-palvelimessa 3) tietokanta omassa palvelimessaan
Upotettu SQL, C#-esimerkki
Upotettu SQL tietokannassa SQL-koodi kirjoitetaan tietokannan StoredProseduuriin tai Funktioon StoredProceduuria tai Funktiota voi kutsua sovellusohjelmasta: EXEC(sp_tietoja_kantaan) Tehokkuusnäkökulma: Tietojen suodatus on aina nopeampaa tietokannan päässä kuin sovellusohjelmassa Esimerkki
1) World-tietokantaan on tehty taulu index_test. Selvitä SELECT-lauseella ja kyselyajan avulla minkä kentän indeksiä kysely hyödyntää. 2) Selvitä samalla tavalla mikä on Sakilatietokannan film-taulun indeksoitu avain. Vaihtele ja yhdistele tämän jälkeen SELECT * FROM film kyselyyn WHERE-ehtoja release_year=2006 language_id=1 film_id=50 Mitä huomaat?
Pelit: lisää kenttä FK kokemus_id Kokemus: kytke Kokemus_Linkki tauluun Henkilo: kytke Koulutus_Linkki tauluun Henkilo: kytke Osastot-tauluun Myynti: lisää FK pvm_id Koulutus: kytke Koulutus_Linkki tauluun Koulutus: kytke Kalenteri-tauluun Lisätään taulu Hankinta, mallia Myynti-taulusta Osastot: kytke pvm_id Kalenteriin Yritys: irroitetaan kenttiä uudeksi tauluksi Tilinpaatos
11. Hae kaikki ruotsalaiset toimittajat joiden yhteyshenkilö on myyntiedustaja. SELECT * FROM toimittajat WHERE tehtava='myyntiedustaja' AND maa='ruotsi' 12. Hae tilaukset, joiden rahti ylittää 2,5 miljoonaa tai asiakastunnus on 'WILMK'. Lajittele tulos rahdin mukaan kalleimmat ensin. WHERE rahti>2500000 OR asiakastunnus='wilmk' ORDER BY rahti DESC 13. Hae tilaukset, joiden asiakastunnus on 'VINET' ja tilaus on vuodelle 2007. WHERE asiakastunnus='vinet' AND tilauspaiva>'2006-12-31' AND tilauspaiva<'2008-01-01 Tai BETWEEN tai YEAR()
14. Hae kaikki yritykset (vain yritys-kenttä), joissa yrityksen nimi on lyhyempi kuin 20 merkkiä sekä kaikista muista yrityksistä yritysnimestä 15 ensimmäistä merkkiä, ":"-merkki ja 4 viimeistä merkkiä (UNION-kysely). SELECT yritys FROM toimittajat WHERE LENGTH(yritys)<20 UNION SELECT CONCAT(LEFT(yritys,15),':',RIGHT(yritys,4)) FROM toimittajat WHERE LENGTH(yritys)>=20 15. Luetteloi tuotenimet, joita L-kirjaimella alkavat toimittajat toimittavat. (huomaa että taulun alias-nimi ei saa olla varattu sana kuten TO) SELECT tu.tuotenimi FROM tuotteet tu INNER JOIN toimittajat s ON tu.toimittajanro=s.toimittajanro WHERE LEFT(s.yritys,1)='L' 16. Hae alikyselyä apuna käyttäen (ei JOINia) kaikki tilaukset jotka on tehty ennen 20.7.2006 ja joiden rahtaajan nimi on 'Federal Shipping'. WHERE tilauspaiva<'2006-07-20' AND rahtaajanro IN ( SELECT rahtaajanro FROM rahtaajat WHERE nimi='federal Shipping')
17. Hae JOIN-kyselyllä kaikki tilausnumerot ja rahtaajan nimet tilauksista, jotka on tehty 20.7.2006 jälkeen. SELECT t.tilausnro, r.nimi FROM tilaukset t INNER JOIN rahtaajat r ON r.rahtaajanro=t.rahtaajanro WHERE t.tilauspaiva>'2006-07-20' 18. Hae kaikki tilaukset jotka on tehty välillä 15.7. - 24.7.2006 ja jotka sisältävät tuotetta 'Chang'. SELECT t.* FROM tilaukset t INNER JOIN tilaustiedot tt ON t.tilausnro=tt.tilausnro INNER JOIN tuotteet tu ON tt.tuotenro=tu.tuotenro WHERE t.tilauspaiva BETWEEN '2006-07-15' AND '2006-07-24' AND tu.tuotenimi='chang' 19. Hae tilauksista vastaanottajan nimien mukaan summattu rahtimaksu. SELECT vastaanottaja, SUM(rahti) FROM tilaukset GROUP BY vastaanottaja 20. Hae tuoteryhmittäin summattu varastoarvo. Kyselyn tuloksessa kentät tuoteryhma ja varastoarvo. SELECT tr.tuoteryhma, SUM(t.yksikkohinta*t.varastossa) AS varastoarvo FROM tuotteet t INNER JOIN tuoteryhmat tr ON tr.tuoteryhmanro=t.tuoteryhmanro GROUP BY tr.tuoteryhma
Käytetään tietokantaa "tukkukauppa 1) Hae työntekijän etunimi ja sukunimi sekä tämän esimiehen etunimi ja sukunimi (taulun JOIN itseensä) 2) Muokkaa rahtaajien puhelinnumeroa siten että suluissa oleva osa jää pois 3) Jatka puhelinnumeron muokkausta niin että väliviivan paikalle tulee välilyönti 4) Laske tilaustiedoista tilauksen rivihinta. Vastauksessa kentät tilausnro, tuotenro ja hinta. Käytä tavallisia laskuoperaattoreita +,-,*,/ 5) Yhdistä edelliseen tehtävään tuotteet-taulusta kenttä tuotenimi 6) Summaa edellisen tehtävän kysely tilausnro:ittain 7) Summaa edellisen tehtävän kysely tuotteittain (tuotenimi ja tuotenumero mukaan) 8) Summaa edellisen tehtävän kysely ilman GROUPpausta ja muunna tulos kokonaisluvuksi
Käytetään tietokantaa "tukkukauppa" 1) Hae työntekijän etunimi ja sukunimi sekä tämän esimiehen etunimi ja sukunimi (taulun JOIN itseensä) SELECT t1.etunimi, t1.sukunimi, t2.etunimi AS EM_etunimi, t2.sukunimi AS EM_sukunimi FROM tyontekijat t1 LEFT OUTER JOIN tyontekijat t2 ON t2.tyontekijanro=t1.esimies 2) Muokkaa rahtaajien puhelinnumeroa siten että suluissa oleva osa jää pois SELECT SUBSTRING(puhelin,7,8) FROM rahtaajat 3) Jatka puhelinnumeron muokkausta niin että väliviivan paikalle tulee välilyönti SELECT CONCAT(LEFT(SUBSTRING(puhelin,7,8),3)," ",RIGHT(SUBSTRING(puhelin,7,8),4)) FROM rahtaajat 4) Laske tilaustiedoista tilauksen rivihinta. Vastauksessa kentät tilausnro, tuotenro ja hinta. Käytä tavallisia laskuoperaattoreita +,-,*,/ SELECT tilausnro, tuotenro, ((yksikkohinta*maara)-(alennus*maara)) AS hinta FROM tilaustiedot 5) Yhdistä edelliseen tehtävään tuotteet-taulusta kenttä tuotenimi SELECT ti.tilausnro, tu.tuotenimi, ti.tuotenro, ((ti.yksikkohinta*ti.maara)-(ti.alennus*ti.maara)) AS summa FROM tilaustiedot ti INNER JOIN tuotteet tu ON tu.tuotenro=ti.tuotenro 6) Summaa edellisen tehtävän kysely tilausnro:ittain SELECT ti.tilausnro, SUM(((ti.yksikkohinta*ti.maara)-(ti.alennus*ti.maara))) AS summa FROM tilaustiedot ti INNER JOIN tuotteet tu ON tu.tuotenro=ti.tuotenro GROUP BY ti.tilausnro 7) Summaa edellisen tehtävän kysely tuotteittain (tuotenimi ja tuotenumero mukaan) SELECT tu.tuotenimi, ti.tuotenro, SUM(((ti.yksikkohinta*ti.maara)-(ti.alennus*ti.maara))) AS summa FROM tilaustiedot ti INNER JOIN tuotteet tu ON tu.tuotenro=ti.tuotenro GROUP BY tu.tuotenimi, ti.tuotenro 8) Summaa edellisen tehtävän kysely ilman GROUPpausta ja muunna tulos kokonaisluvuksi SELECT CAST(SUM(((ti.yksikkohinta*ti.maara)-(ti.alennus*ti.maara))) AS DECIMAL(9,0)) AS summa FROM tilaustiedot ti INNER JOIN tuotteet tu ON tu.tuotenro=ti.tuotenro
Ensi viikon aamun tunneilla vielä kertaillaan kurssilla läpikäytyjä asioita ja viimeisellä tunnilla on teoriakoe. Kokeeseen voi valmistautua kertaamalla Koudatasta aiempien tuntien materiaalit ja harjoittelemalla SQL-kyselyjä. Netistä voi myös poimia täydennystä relaatiotietokantojen perusteista ja SQLkielestä. Valmistelkaa myös oma SQL-oppaanne siihen kuntoon, että voitte sen ensi kerralla printata ja palauttaa. Oppaan ei tarvitse olla pitkä. Tärkeintä on, että SQL-kielestä on poimittu mielestänne keskeisiä kyselyesimerkkejä ja kommentoitu ne muutamalla sanalla. Muuta läksyä ei ole.