Yhteenvetofunktiot Näkymät Tietokannan ylläpito Tietokantatapahtumat... 88
|
|
- Yrjö Uotila
- 7 vuotta sitten
- Katselukertoja:
Transkriptio
1 Tietokantojen perusteet, DO NOT PRINT THIS DOCUMENT opetusmoniste osa 4 SQL:N PIIRTEITÄ JA TIETOKANTAOHJELMOINTI Harri Laine Yhteenvetofunktiot Näkymät Tietokannan ylläpito Tietokantatapahtumat Tietokannan käyttö ohjelmasta Sulautettu SQL Tietokannan käyttö liittymäkirjaston avulla Tietokantaohjelmointikielet
2 Yhteenvetofunktiot Tähän asti on käsitelty kyselyjä, joissa tuotetaan yksi tulosrivi jokaista valintaehdot täyttävää kohdetaulujen riviyhdistelmää kohti. Tällaiset kyselyt tuottavat tuloksenaan detaljitietoa. SQL:llä on mahdollista tuottaa myös yhteenvetotietoa (aggregate data). Yhteenvetotietojen muodostukseen ovat käytettävissä funktiot AVG keskiarvo COUNT lukumäärä MAX suurin arvo MIN pienin arvo ja SUM summa. Joissakin järjestelmissä on näiden lisäksi myös muita tilastollisia suureita, esimerkiksi keskihajonnan, laskevia funktioita. Yhteenvetotietoja haluttaessa tuloksen muodostamisperiaate muuttuu. Yhteenveto voidaan tuottaa joko koko vastausaineistosta tai ryhmiin jaotellusta vastausaineistosta. Vastausaineistolla tarkoitetaan tässä valintaehdot täyttäviä riviyhdistelmiä. Tuotettaessa yhteenveto koko vastausaineistosta saadaan kyselyn tulokseksi aina yksi rivi. Jos vastausaineisto on tyhjä tuottavat muut funktiot paitsi COUNT tuloksenaan tyhjäarvon (NULL). COUNT tuottaa tyhjästä vastausaineistosta arvon 0. Esimerkkejä: Ilmoittautumisten lukumäärä: select count(*) from ilmoittautuminen; Kurssien pienin ja suurin opintoviikkomäärä select min(opintoviikot) as pienin, max(opintoviikot) as suurin from kurssi; Helsinkiläisten opiskelijoiden keskimääräinen aloitusvuosi select avg(aloitusvuosi) from opiskelija where kaupunki= Helsinki ; 68
3 Funktioille annetaan argumentiksi lauseke, jonka perusteella funktion arvo lasketaan. Funktiolle COUNT voi antaa argumentiksi myös tähden (*) osoittamaan, että tulokseksi halutaan rivien lukumäärä. Argumenttiin voidaan liittää määre DISTINCT ilmaisemaan sitä, että funktion arvo tulisi laskea sarakkeen erilaisten arvojen perusteella. Funktion arvoa laskettaessa tyhjäarvot jätetään huomiotta eli ne eivät vaikuta tulokseen. Ainoa poikkeus tästä on COUNT(*), joka laskee mukaan kaikki rivit, vaikka jokin rivi sisältäisi pelkkiä tyhjäarvoja. Sensijaan sarakekohtaisesti COUNTfunktiokin ilmoittaa vain todellisten arvojen lukumäärä. Esimerkki: Taulu R(A,B,C) : A B C select count(*) from R = > select count(a) from R => select count(b) from R => 3 3 null 2 select count(distinct B) from R => 2 3 null 2 select count(*) from R where B is null => select (distinct C) from R = 1 DISTINCT määreen käyttö toistuvien arvojen ottamiseksi vain kertaalleen mukaan laskentaan on yleensä järkevää vain COUNT-funktion yhteydessä. Keskiarvon tai summan laskeminen erillisistä arvoista tuottaa harvoin mitään hyödyllistä tulosta. Esimerkki: Monellako eri paikkakunnalla opiskelijat asuvat? select Opiskelijoiden asuinpaikkakuntia:, count(distinct kaupunki) from opiskelija; Yhteenvetofunktioita voi käyttää lausekkeissa ja niiden argumentteina voi käyttää lausekkeita. Toista yhteenvetofunktiota ei kuitenkaan voi käyttää toisen argumenttina eikä lausekkeisiin tai ylipäätään tulokseen saa mukaan samasta vastusaineistosta sekä rivikohtaista deltaljitietoa että yhteenvetotietoa. 69
4 Esimerkkejä: Suurimman ja pienimmän opintoviikkomäärän erotus select MAX(opintoviikot)-MIN(opintoviikot) erotus from kurssi; Kertokoon opiskelijanumeron parillisuus opiskelijan olevan naispuolinen. Naispuolisten opiskelijoiden osuus prosentteina saadaan tällöin selville kyselyllä: select 100*(count(onumero)-sum(mod(onumero,2)))/count(onumero) from opiskelija; Tässä mod(onumero,2) on miespuolisilla opiskelijoilla 1, joten sum(mod(onumero,2)) ilmoittaa miespuolisten opiskelijoiden lukumäärän. Erotuksella saadaan naispuolisten lukumäärä ja jakolaskulla heidän osuutensa. Kysely select nimi, max(opintoviikot) from kurssi; on syntaktisesti virheellinen. Siinä halutaan samasta aineistosta yhteenvetotietoa ja detaljitietoa. Miltä riviltä tuo detaljitieto otettaisiin? Jos kyselyssä haluttaisiin saada selville minkä kurssin opintoviikkomäärä on suurin se pitäisi esittää esimerkiksi seuraavasti select nimi, opintoviikot from kurssi where opintoviikot = (select max(opintoviikot) from kurssi); tai select nimi, maksi from kurssi K, (select max(opintoviikot) maksi from kurssi) M where K.opintoviikot=M.maksi; Kummassakin näistä vaihtoehdoista maksimi lasketaan ainakin loogisesti eri rivijoukosta kuin mistä detaljitieto nimi haetaan. 70
5 Ryhmiin jaottelu Ryhmiin jaottelu saadaan aikaan lisäämällä kyselyyn ryhmittelymääre group by <ryhmitysperusteet>. Ryhmitysperusteina annetaan sarakeluettelo ja ryhmät muodostetaan siten, että ryhmään kuuluvat kaikki sellaiset vastausaineiston rivit, joilla on yhtenevät arvot kussakin sarakeluettelon sarakkeessa (kuvat 20 ja 21) X= taulu T group by A (Muodostuu 3 ryhmää.) A B C D group A= A= A= A= A= A= A= A=3 Kuva 20: Ryhmittely yhden sarakkeen perusteella Y= taulu T group by A,B (Muodostuu 6 ryhmää) A B C D group A=1, B= A=1, B= A=1, B= A=2, B= A=2, B= A=3, B= A=3, B= A=3, B=2 Kuva 21: Ryhmittely 2 sarakkeen perusteella. 71
6 Ryhmitetystä aineistosta yhteenvetofuntioiden arvot lasketaan ryhmäkohtaisesti ja tulokseen tulevien rivien lukumäärä on sama kuin ryhmien lukumäärä. Ylläolevasta ryhmittelystä X tulisi siis 3 tulosriviä ja ryhmittelystä Y 6 tulosriviä. Esimerkkejä: select A, sum (B), count(c) from T; A sum(b) count(c) select A,B, count(c), sum(d) from T; A B count(c ) sum(d) Esimerkki: Kurssien harjoitusryhmiin ilmoittautuneiden opiskelijoiden lukumäärä Kysely select nimi, ryhmanro, count(*) from kurssi, ilmoittautuminen where ilmoittautuminen.kurssikoodi=kurssi.koodi group by nimi, ryhmanro; 72
7 tuottaa oikean halutun tuloksen, jos jokaiseen ryhmään on ilmoittautunut vähintään yksi opiskelija. Tyhjät ryhmät jäävät kuitenkin pois vastauksesta, sillä ne karsiutuvat liitosoperaation johdosta vastausaineistosta jo ennen ryhmitystä (kuva 22). kurssi Pariton putoaa ilmoittautuminen A B C D E F Ryhmät näiden where-ehdon täyttävien perusteella Kuva 22: where- ehto ennen ryhmitystä. Tyhjät ryhmätkin tuottava kysely olisi esimerkiksi: select nimi, ryhmanro, count(*) from kurssi, ilmoittautuminen where ilmoittautuminen.kurssikoodi=kurssi.koodi group by nimi, ryhmanro union (select nimi, ryhmanro, 0 from kurssi, harjoitusryhma H, where koodi=h.kurssikoodi and koodi,h.ryhmanro) not in (select kurssikoodi, ryhmanro from ilmoittautuminen)); Myös ulkoliitosta voisi käyttää: 73
8 select nimi, h.ryhmanro, count(distinct opisknro) from kurssi, harjoitusryhma h left outer join ilmoittautuminen i on h.kurssikoodi= i.kurssikoodi and h.ryhmanro=i.ryhmanro where kurssi.koodi= h.kurssikoodi group by nimi, h.ryhmanro Huomaa, että edellä ei voi käyttää funktiota COUNT(*), sillä tyhjistäkin ryhmistä tulee nyt yksi rivi vastausaineistoon. Ryhmittelyyn perustuvissa kyselyissä voidaan tulokseen ottaa mukaan vain group by osassa lueteltuja ryhmittelyssä käytettyjä sarakkeita sekä yhteenvetofunktioihin perustuvia lausekkeita. Jos esimerkiksi haluttaisiin kursseista tietoina koodi, nimi, luennoijan nimi ja ryhmien lukumäärä, täytyisi kysely esittää muodossa select koodi, kurssi.nimi, opettaja.nimi, count(*) ryhmia from kurssi, opettaja, harjoitusryhma where kurssi.koodi=harjoitusryhma.kurssikoodi and kurssi.luennoija=opettaja.opetunnus group by koodi, kurssi.nimi, opettaja.nimi; Ryhmät muodostuisivat täysin samoiksi vaikka ryhmittelyyn käytettäisiin vain kurssitaulun saraketta koodi. Kurssin nimi ja opettajan nimi on kuitenkin liitettävä group by osaan, jotta ne saataisiin mukaan tulokseen. Niiden poisjättäminen group by osasta johtaisi ylläolevan kyselyn kohdalla käännösaikaiseen virheilmoitukseen. Ryhmitetystä aineistosta tuotetaan vastaukseen yksi rivi jokaista ryhmää kohden. Ryhmien mukaanottamista voidaan kuitenkin säädellä liittämällä kyselyyn ryhmiä koskeva valintaehto. Tämä esitetään määreellä having <valintaehdot> Valintaehdot ovat rakenteeltaan samanlaisia kuin kyselyn where-osassa annettavat valintaehdot. Yleensä ehdot kuitenkin perustuvat yhteenvetofunktioiden arvoihin. 74
9 Esimerkki: Ryhmät, joihin on ilmoittautunut yli 20 opiskelijaa select nimi, ryhmanro, count(*) from kurssi, ilmoittautuminen where ilmoittautuminen.kurssikoodi=kurssi.koodi group by nimi, ryhmanro having count(*) >20; Käytännössä ryhmien muodostaminen tarkoittaa vastausaineiston järjestämistä ryhmityssarakkeiden perusteella. Vastauksen varsinaisen järjestyksen määrittelee kuitenkin order by määre. Esimerkki: Harjoitusryhmät, ilmoittautujalukumäärän mukaan laskevassa järjestyksessä. select nimi, ryhmanro, count(*) from kurssi, ilmoittautuminen where ilmoittautuminen.kurssikoodi=kurssi.koodi group by nimi, ryhmanro order by count(*) desc; Seuraavassa esimerkissä tarkastellaan kohtuullisen monimutkaista ryhmittelyyn perustuvaa kyselyä. Tällaisten kyselyjen yhteydessä kannattaisi jo harkita myöhemmin esiteltävien näkymien käyttöä helpottamaan kyselyn muodostusta. Esimerkki: Millä kurssilla on suurin keskimääräinen ryhmäkoko. Ensimmäinen yritys: select nimi, H.ryhmanro, max(avg(count(*))) from kurssi, harjoitusryhma H, ilmoittautuminen I where koodi=h.kurssikoodi and H.kurssikoodi=I.kurssikoodi and H.ryhmanro=I.ryhmanro group by nimi, H.ryhmanro 75
10 Yritys johtaa virheilmoitukseen, sillä yhteenvetofunktio ei voi olla toisen argumenttina. Lähdetään etsimään oikeaa kyselyä sen osasista. Seuraavassa ei huomioida tyhjiä ryhmiä. Ryhmään ilmoittautuneiden lukumäärät ei-tyhjien ryhmien osalta saadaan kyselyllä: select kurssikoodi,ryhmanro, count(*) lkm from ilmoittautuminen group by kurssikoodi, ryhmanro Oletetaan, että tämän suoritus tuottaa tuloksen KURSSIKOODI RYHMANRO LKM Kysely voidaan ottaa alikyselyksi kyselyyn, joka laskee kullekin kurssille keskimääräisen ryhmäkoon: select koodi, nimi, avg(lkm) from kurssi, (select kurssikoodi,ryhmanro, count(*) lkm from ilmoittautuminen group by kurssikoodi, ryhmanro) A where koodi= A.kurssikoodi group by koodi, nimi; Suoritettuna samassa kannassa kuin edellinen kysely tämä tuottaisi tuloksen 76
11 KOODI NIMI AVG(LKM) 1134 Informaatiojärjestelmät 4, Java ohjelmointi 4, Oliotietokannat Tietorakenteet 5 Maksimi saadaan selville having-ehdolla, jolloin koko kysely olisi: select koodi, nimi, avg(lkm) from kurssi, (select kurssikoodi,ryhmanro,count(*) lkm from ilmoittautuminen group by kurssikoodi, ryhmanro) A where koodi= A.kurssikoodi group by koodi, nimi having avg(lkm)>= ALL (select avg(lkm) from kurssi, (select kurssikoodi,ryhmanro,count(*) lkm from ilmoittautuminen group by kurssikoodi, ryhmanro) A where koodi= A.kurssikoodi group by koodi) Having ehdon kyselyssä on tulokseen otettu vain yheenvetofunktion arvo ilman ryhmittelysaraketta. Alikyselyn tulos tässä tapauksessa on AVG(LKM) 4, ,
12 Käytettäessä yhteenvetofunktioita yhdeksi merkittäväksi ongelmaksi muodostuu tuloksen oikeellisuuden todentaminen. Tulokseksi saadaan vain yksi rivi tai joukko ryhmäkohtaisia rivejä, jotka sisältävät yhteenvedon tuloksen. Miten voimme tietää onko tuo tulos oikein? Onko se laskettu oikean rivijoukon yli? Ovatko kyselyyn liittyvät ehdot oikein?. Tyypillinen valintaehdon puuttuminen johtaa siihen, että jokin luku tulee laskentaan mukaan moneen kertaan. Tällöin summa moninkertaistuu ja keskiarvo lasketaan painottuneesta joukosta. Etenkin, jos yritämme saada tietokannasta selville jotain uutta informaatiota tunnusluvulla, jonka oikeasta suuruusluokastakaan ei ole varmaa etukäteistietoa tilanne on ongelmallinen. Tunnuslukuun uskotaan ja sitä käytetään päätöksenteossa. Jonkin puuttuvan tai virheellisen valintaehdon perusteella voimme tuottaa merkittävästi virheellisen tunnusluvun. Tällä voi olla sitten päätöksenteossa suurikin merkitys. Tunnuslukuja tuottavien kyselyiden testaukseen tulisikin kiinnittää erityishuomiota. Testaamisessa pitää tuottaa apu- ja välituloksia, joilla varmistutaan kokonaistuloksen oikeellisuudesta. Suuren tietokannan kohdalla tällaiset apu- ja välitulokset voivat olla suuria, mutta niiden kohdalla virhe voi ilman aputuloksia jäädä kokonaan huomaamatta. Esimerkiksi vastausjoukon koko voi joissain tilanteissa olla riittävä aputulos. Joissain toisissa se ei riitä vaan lisäksi tarvitaan muita kyselyjä selvittämään millainen vastausjoukon tulisi olla Näkymät Näkymällä (view) tarkoitetaan kyselyn avulla määriteltyä johdettua taulua (derived table). Tällaista taulua voidaan käyttää kyselyissä kuten perustaulujakin. Myös näkymiin kohdistuvat ylläpito-operaatiot voivat olla rajoitetusti mahdollisia. Näkymä määritellään create view lauseella, joka on muotoa: create view <taulunimi> [(<sarakke1>, )] as <kysely>; Taulunimi nimeää näkymään liitetyn kyselyn tulostaulun. Määrittelyyn liittyvässä sarakeluettelossa sarakkeille voidaan antaa nimet. Jos sarakeluettelo puuttuu, käytetään sarakkeista kyselyn tuottamia nimiä. Kysely määrittelee taulun sisällön. 78
13 Esimerkki: Tyhjät harjoitusryhmät Create view tyhja_ryhma (kurssikoodi, nimi, ryhmanro) as select kurssikoodi, nimi, ryhmanro from kurssi, harjoitusryhma where koodi= kurssikoodi and (kurssikoodi, ryhmanro) not in (select kurssikoodi, ryhmanro from ilmoittautuminen) Näkymätaulun rivejä ei tallenneta minnekään. 1 Kyselyn kohdistuessa näkymätauluun kyselyn käsittelijä limittää kyselyn ja näkymämäärittelyssä olevan kyselyn ja suorittaa näin aikaansaadun yhdistetyn kyselyn. Esimerkiksi kysely select * from tyhja_ryhma; aiheuttaisi näkymän määrittelevän kyselyn suorituksen Näkymien käyttöön on kolme perussyytä: tietoriippumattomuuden aikaansaaminen, täsmäsuojauksen mahdollistaminen ja kyselyjen helpottaminen. Tietoriippumattomuudella tarkoitetaan sitä, että ohjelmaa ei tarvitse muuttaa, jos tietokantaa muutetaan. Hyvin laaditut kyselyt (ei select * muotoisia ) takaavat jo jonkin verran tietoriippumattomuutta. Jos ohjelma käsittelee kantaa näkymien kautta voidaan tietoriippumattomuutta yhä lisätä. Tietokantaan voidaan tehdä laajojakin muutoksia, esimerkiksi pilkkoa taulu useaksi tauluksi ja silti tarjota käyttäjälle samanlainen näkymä. Muutokset edellyttävät vain näkymän määrittelevän kyselyn muuttamista tuottamaan samanlainen taulu muuttuneen kannan pohjalta. Oletetaan, että tauluun ilmoittautuminen liittyisi näkymä ilmo, joka olisi määritelty seuraavasti: 1 Joissakin järjestelmissä on tarjolla näkymän kaltaisesti määriteltävä vedos (snapshot), joka muodostetaan kyselyllä mutta jonka rivit tallennetaan kantaan. Toisin kuin näkymä vedos ei muutu perustaulujen muuttuessa. 79
14 create view ilmo as select kurssikoodi, ryhmanro, opisknro, ilm_aika from ilmoittautuminen; Tämä on rakenteeltaan ja sisällöltään identtinen taulun ilmoittautuminen kanssa. Kun tauluun ilmoittautuminen on kertynyt ilmoittautumisia pitkältä ajanjaksolta runsaasti taulun käyttö alkaa hidastua. Tällöin voidaan päätyä ratkaisuun, jossa passiiviset vanhat ilmoittautumiset siirrettäisiin historiatauluun vanhat_ilmoittautumiset. Erilaiset tilastot edellyttävät kuitenkin sekä nykyisiä että vanhoja ilmoittautumisia. Jos tilastointi olisi perustettu näkymään ilmo, toimisivat tilastot edelleen kun näkymän määrittely muutettaisiin muotoon create view ilmo as select kurssikoodi, ryhmanro, opisknro, ilm_aika from ilmoittautuminen union (select kurssikoodi, ryhmanro, opisknro, ilm_aika from vanhat_ilmoittautumiset); Näkymien käyttö suojauksessa perustuu siihen, että käyttäjille annetaan käyttöoikeuksia näkymiin. Näin voidaan rajata käyttöoikeus vain joihinkin taulun riveihin tai vain yhteenvetotietoihin. Esimerkiksi kuka tahansa voisi saada tiedon kurssien opiskelijamääristä, mutta ei tietoa kurssien yksittäisistä opiskelijoista. Roolille javaopettaja voitaisiin antaa kaikki oikeudet näkymään create view javailmoittautuminen as select kurssikoodi, ryhmanro, opisknro, ilm_aika from ilmoittautuminen where kurssikoodi in (select koodi from kurssi 80
15 where nimi= Java ohjelmointi ) 2 Seuraava näkymämäärittely perustuu oletukseen, että opettaja-taulussa käytetään opettajatunnuksena (opetunnus) opettajan tietokantakäyttäjätunnusta. Funktio user antaa kyselyn suorittajan tietokantakäyttäjätunnuksen. create view oma_kurssi as select * from kurssi where luennoija=user; Näkymän käyttöoikeus voitaisiin tehdä julkiseksi. Luennoijille taulussa näkyvät hänen luennoimiensa kurssien rivit. Muille käyttäjille taulu on tyhjä. Vaikka käyttöoikeus on julkinen eivät muut kuin kurssin luennoija pääse tämän näkymän kautta kurssitietoihin. Näkymää voidaan käyttää myös kyselyjen yksinkertaistamiseen. Monimutkainen kysely upotetaan näkymämäärittelyyn ja käyttäjä muodostaa omat kyselynsä yksinkertaisina näkymätauluihin perustuvina kyselyinä. Edellä määriteltyä näkymää tyhjä_ryhma voisi käyttää näkymän ryhmakoko määrittelyssä: create view ryhmäkoko (koodi, nimi, ryhma, lkm) as select nimi, ryhmanro, count(*) from kurssi, ilmoittautuminen where ilmoittautuminen.kurssikoodi=kurssi.koodi group by nimi, ryhmanro union (select kurssikoodi, nimi, ryhmanro, 0 from tyhja_ryhma); Tätä käyttämällä sen kurssin selvittäminen, jonka keskimääräinen ryhmäkoko on suurin sujuisi seuraavasti: select koodi, nimi, avg(lkm) from ryhmakoko 2 Jos näkymää käytetään usin saattaisi olla parempi määritellä se kurssikoodin eikä kurssin nimeen perustuvana. 81
16 group by koodi, nimi having avg(lkm)>= ALL (select avg(lkm) from ryhmakoko group by koodi) Tietokannan ylläpito SQL sisältää myös tiedon muokkausvälineet tietokannan ylläpitoa varten. Välineistö muodostuu lauseista: insert rivien lisäys, update rivien muutos ja delete rivien poisto. Lisäykset Insert-lauseella on kaksi muotoa. Toisella lisätään yksittäisiä vakioarvoista koostuvia rivejä, toisella usean rivin joukko. Yksittäisen rivin lisäävän insert-lauseen rakenne on insert into <taulu> [(<sarakenimet>)] values (<arvot>) Sarakenimet on luettelo sarakenimiä. Se on valinnainen ja sitä tarvitaan tilanteissa, joissa annetaan arvot vain osalle lisättävän rivin sarakkeista. Arvot osassa annetaan lisättävän rivin sarakkeiden arvot pilkulla eroteltuina. Ellei lauseeseen sisälly sarakenimiosaa, on sarakkeiden arvot annettava siinä järjestyksessä, missä sarakkeet esiintyvät taulussa. Jos lauseeseen sisältyy sarakenimiosa, se määrää annettavien arvojen järjestyksen. Esimerkki: Tarkastellaan taulua kurssi, joka on määritelty seuraavasti: CREATE TABLE kurssi ( koodi numeric(8) NOT NULL, nimi varchar(40) NOT NULL, opintoviikot numeric(5,1), luennoija varchar(12), PRIMARY KEY (koodi ), FOREIGN KEY (luennoija) REFERENCES opettaja); 82
17 Lause insert into kurssi values (1234, Tietokantojen perusteet,2, HLAINE ); lisää rivin tauluun kurssi. Rivin kaikille sarakkeille on annettu arvot. Jos kurssia lisättäessä ei vielä olisi tiedossa kurssin luennoijaa, voitaisiin lisäys tehdä lauseella insert into kurssi values (1234, Tietokantojen perusteet,2,null); tai käyttämällä sarakeluetteloa insert into kurssi (koodi, nimi, opintoviikot) (1234, Tietokantojen perusteet,2); Niille sarakkeille, joille ei anneta arvoa lisäyslauseessa, tulee arvoksi oletusarvo. Ellei tätä ole sarakkeelle määritelty create table lauseen default-määreellä, käytetään oletusarvona tyhjäarvoa. Edellisen esimerkin kaksi viimeistä insert-lausetta lisäävät siis samanlaisen rivin. Jos oletusarvoa ei ole määritelty ja puuttuvaan sarakkeeseen on liitetty taulumäärittelyssä määre NOT NULL, lisäys epäonnistuu. Samoin käy jos lisäys rikkoo muita eheysehtoja, esimerkiksi avaimen yksikäsitteisyyttä tai viiteeheyttä. Lisäyslauseen toisen vaihtoehdon avulla voidaan tauluun lisätä kyselyn tulosrivit. Lauseen muoto on seuraava: insert into <taulu> [(<sarakenimet>)] <kysely>. Tällä lauseella voidaan samoin kuin yksittäistenkin rivien tapauksessa lisätä sekä täydellisiä rivejä että rivejä joista puuttuu joitain sarakkeita. Kyselyn tulosrivit lisäävä lisäysoperaatio on hyödyllinen esimerkiksi kopioitaessa taulu, siirrettäessä tietoja aktiivisesta taulusta historiatauluihin, perustettaessa testiaineistoja ja suoritettaessa tietokannan uudelleenorganisointia. Esimerkki: Kurssin lisääminen kun ei tiedetä luennoijan tunnusta, mutta tiedetään nimi. 83
18 insert into kurssi select 1234, Tietokantojen perusteet, 2, opetunnus from opettaja where nimi = Laine Harri ; Tässä kyselyssä vain opetunnus tulee taulusta opettaja. Muut vastausrivin tiedot ovat vakioita. Esimerkki: Kurssin Ohjelmoinnin perusteet opiskelijoiden siirto kurssille Java ohjelmointi. Insert into ilmoittautuminen select java.kurssikoodi, ryhmanro, opisknro, sysdate 3 from kurssi java, kurssi ohpe, ilmoittautuminen where java.nimi= Java-ohjelmointi and ohpe.nimi= Ohjelmoinnin perusteet and ohpe.koodi=ilmoittautuminen.kurssikoodi; Rivien muutokset Rivien sisältöä muutetaan update-lauseella. Update lauseen rakenne on update <taulu> set <sijoitus>[, <sijoitus> ] [where <valintaehdot>] missä sijoitus on muotoa <sarake>=<lauseke> Lauseessa oleva valintaehto määrittelee muutoksen kohteena olevat rivi. Muutos tehdään kaikkiin niihin riveihin, joiden kohdalla valintaehto on tosi. Jos ehto puuttuu tehdään muutos kaikkiin taulun riveihin. Muutosta ei hyväksytä, jos se aiheuttaa eheysehdon rikkoutumisen. Esimerkki: Kurssin Java-ohjelmointi opintoviikkomäärä kasvatetaan yhdellä. 3 sysdate on Oraclen mukainen nykyhetken antava funktio. 84
19 update kurssi set opintoviikot= opintoviikot+1 where nimi= Java-ohjelmointi ; Esimerkki: Kaikki 4 opintoviikon kurssit jaetaan kahdeksi 2 opintoviikon kurssiksi (osa 1 ja osa 2). Kurssikoodiin ja nimeen lisätään osan tunnus. Tehdään aluksi uusi puolikaskurssi insert into kurssi select kurssikoodi*10+1, nimi, osa 1,2, luennoija) from kurssi where opintoviikot=4; ja muutetaan sitten vanha kurssi toiseksi puolikkaaksi update kurssi set kurssikoodi=kurssikoodi*10+2, nimi= nimi, osa 2 opintoviikot=2 where opintoviikot=4; Rivien poisto Poistolauseella delete from <taulu> [where <valintaehto>] poistetaan taulusta kaikki valintaehdon täyttävät rivit. Jos valintaehto puuttuu poistetaan kaikki taulun rivit. Poistot, jotka rikkovat eheysehtoja epäonnistuvat. Esimerkki Poistetaan harjoitusryhmät, joihin ei ole ilmoittautunut ketään. delete from harjoitusryhma where (kurssikoodi, ryhmanro) not in (select kurssikoodi, ryhmanro from ilmoittautuminen); 85
20 Jos ylläpito-operaatioita suoritetaan sarjassa useita on pidettävä huolta siitä, että ne suoritetaan oikeassa järjestyksessä tai niissä olevat valintaehdot ovat sellaiset, ettei synny odottamattomia sivuvaikutuksia sen takia, että sarjassa aiemmin ollut operaatio muuttaa sarjassa myöhemmin olevan operaation kohdejoukkoa joksikin muuksi kuin on ajateltu.. Esimerkki: Tarkastellaan taulua bonustili(asiakasnimi,..., saldo,...) Olkoon siellä rivit asiakasnimi saldo Roope Ankka 3100 Aku Ankka 2000 Ines Ankka 2700 Hannu Hanhi 2900 Tilille pitäisi antaa bonus siten, että saldoa korotetaan 10% jos saldo on 3000 tai alle ja 15% jos saldo on yli Jos bonuksen maksu hoidetaan seuraavasti update bonustili set saldo=1.1*saldo where saldo<=3000; update bonustili set saldo=1.15*saldo where saldo>3000; olisi tulos asiakasnimi saldo Roope Ankka 3565 Aku Ankka
21 Ines Ankka 2970 Hannu Hanhi 3668 ja Hannu Hanhella olisi taas käynyt tuuri. Ongelma suoritusjärjestyksessä on se, että ensimmäinen päivitys voi muuttaa rivejä siten, että toisen päivityksen kohdejoukko muuttuu. Suoritettaessa muutokset oikeassa järjestyksessä update bonustili set saldo=1.15*saldo where saldo>3000; update bonustili set saldo=1.1*saldo where saldo<=3000; olisi tulos asiakasnimi saldo Roope Ankka 3565 Aku Ankka 2200 Ines Ankka 2970 Hannu Hanhi 3190 Rivien siirto ja kopiointi Joissakin tietokannanhallintajärjestelmissä on tarjolla mahdollisuus tallentaa kyselyn tulostaulu suoraan oikeaksi tauluksi create table tai create snapshot -komennoilla Esimerkiksi Oraclessa taulu voitaisiin luoda seuraavasti: create table ilmotilanne_09_20 as select * from ilmoittautuminen; Jos tämä suoritettaisiin se vastaisi nimeään ja sisältäisi kaikki luontihetkellään taulussa ilmoittautuminen olleet ilmoittautumiset. Ellei tietokannanhallintajärjestelmä tarjoa tällaisia mahdollisuuksia, on kopioinnit suoritettava insert-lauseiden avulla. 87
22 Rivien siirtäminen taulusta toiseen edellyttää sekä insert- että delete-lauseiden käyttöä. Esimerkki: Vanhojen ilmoittautumisten siirto historiatauluun. insert into ilmohistoria select * from ilmoittautumiset where ilm_aika< ; delete from ilmoittautumiset where ilm_aika< ; Näkymiin perustuva ylläpito Joissakin järjestelmissä on mahdollista kohdistaa ylläpito-operaatio myös näkymään. Kaikki näkymät eivät kuitenkaan tule kyseeseen ylläpidon kohteina. Ylläpito on mahdollista vain, jos jokaiselle näkymän riville löytyy yksikäsitteinen vastinrivi näkymän perustaulusta ja muutos näkymäriviin on yksikäsitteisesti muunnettavaksi muutokseksi sen vastinriviin. Yhteenvetotietoja tarjoavat näkymät eivät ole tällaisia. Eivät myöskään näkymät joiden sarakkeet on määritelty lausekkeiden avulla. Yleensä edellytetään, että kaikki ylläpidettävän näkymän rivit kuuluvat samaan tauluun ja taulun pääavain on mukana näkymässä. Lisäksi voidaan vaaditaan, että näkymän määrittely sisältää pelkästään valintarajoituksia. Aiemmin esilläolleista näkymistä oma_kurssi täyttää nämä vaatimukset samoin ilman union-operaatiota määritelty ilmo Tietokantatapahtumat Usein joudutaan jonkin tietokantamuutoksen aikaansaamiseksi suorittamaan useita tietokantaoperaatioita. Esimerkiksi haluttaessa suorittaa tilisiirto halutaan ottaa rahaa yhdeltä tililtä ja siirtää ne toiselle. On oleellista että kumpikin operaatio suoritetaan. 88
23 Esimerkki: Tarkastellaan taulua: tili(tilinumero,,saldo, ) update tili set saldo=saldo-500 where tilinumero=123456; update tili set saldo=saldo+500 where tilinumero=654321; siirtää 500 markkaa tililtä tilille On oleellista, että ei tehdä vain tililtäottoa tai tilillepanoa, vaan molemmat. On myös oleellista, että mikään ei ulkopuolinen operaatio, vaikka pankin vastuiden laskentaohjelma, ei pääse näkemään tilien saldoja siirto-operaation ollessa kesken. Tietokantatransaktiolla (tapahtumalla) tarkoitetaan yhtenä jakamattomana kokonaisuutena pidettävää tietokantaoperaatioiden joukkoa. Edellä mainittu tilisiirto on tällainen. Tietokannanhallintajärjestelmän tulisi taata, että transaktio suoritetaan joko kokonaan tai sitä ei suoriteta lainkaan, ulkopuoliset näkevät vain kokonaisuudessaan suoritettujen transaktioiden lopputulokset. Tietokantatransaktion tietokantaan tekemät muutokset ovat peruttavissa siihen asti kunnes järjestelmä sitoutuu transaktioon. Käyttäjä voi luottaa siihen, että tietokantamuutokset, joita on tehty sellaisen transaktion kuluessa, johon järjestelmä on sitoutunut, eivät peruunnu. Käyttäjän kannalta järjestelmän sitoutuminen transaktioon tarkoittaa sen onnistunutta loppuunvientiä. SQL:ssä transaktion päättyminen ilmaistaan commit-komennolla, jonka muoto on commit [work]. Commit-komento ilmoittaa että transaktio päättyy ja esittää järjestelmälle pyynnön sitoutua viemään transaktio päätökseen. Samalla se on ilmoitus siitä, että mahdolliset jatkossa tulevat operaatiot kuuluvat eri transaktioon. Transaktioon kuuluvat siis kahden commit-komennon välissä annetut operaatiot (kuva 23). Käyttäjä voi lopettaa transaktion myös antamalla perumispyynnön rollback [work] Perumispyyntö aikaansaa kaikkien edellisen commit:in jälkeen tehtyjen muutosten perumisen. 89
24 COMMIT Operaatio 1 Operaatio n transaktio COMMIT Kuva 23: Transaktio Esimerkki: Yritetään poistaa tyhjät harjoitusryhmät, oletetaan, että ilmoittautumisten viiteavaimeen liittyy on delete cascade -määre commit; select count(*) from harjoitusryhma; >> 150 << select count(*) from ilmoittautuminen; >> 3500 << delete from harjoitusryhma where ryhmanro is not null; select count(*) from ilmoittautuminen; >>0<< (:-?) select count(*) from harjoitusryhma; >>0<< =(:-o) OHO! rollback; select count(*) from ilmoittautuminen; >>3500<< Tietokantatransaktiot pitäisi tehdä lyhytkestoisiksi ja vähän resursseja varaaviksi. Esimerkiksi varautuminen peruutukseen vie resursseja koska muutosta edeltänyttä tilaa on säilytettävä commit-operaation asti. 90
25 4.3.5 Tietokannan käyttö ohjelmasta SQL-pohjaiset relaatiotietokannat tarjoavat käyttäjille yleensä jonkinlaisen suorakäyttöliittymän, jonka kautta käyttäjä voi antaa SQL operaatioita. Suorakäyttö soveltuu hyvin satunnaisiin kyselyihin, erilaisiin ennakoimattomiin nopeaa ratkaisua vaativiin tilanteisiin, yksinkertaisiin ylläpito tehtäviin, kannanhallintatehtäviin ja yksinkertaiseen raportointiin. SQL on kielenä varsin suppea ja sen toiminnallisuus keskittyy tietokantaoperaatioihin. Se ei sisällä raporttien muotoiluun tarvittavia käskyjä. Se ei sisällä tavanomaisten ohjelmointikielten kontrollirakenteita. Vaikka sen eräänä tavoitteena on ollut helppokäyttöisyys, se on kuitenkin suhteellisen vaikea käyttää muihin kuin aivan yksinkertaisiin kyselyihin. Lisäksi se edellyttää käyttäjältä perehtymistä tietokannan teknisiin rakenteisiin kuten taulu- ja sarakenimiin. Tästä syystä sitä ei voi pitää loppukäyttäjän vaan pikemminkin atk-ammattilaisen työvälineenä. Markkinoilla on tarjolla SQL:ää helppokäyttöisempiä nimenomaan loppukäyttäjille suunnattuja välineitä kyselyjen laadintaan. Useimmat näistä perustuvat Query-by- Example -malliin. Qyery-by-Example (QBE) kehitettiin myös IBM:n tutkimuslaboratoriossa 70-luvun lopulla. 4 Perusideana kielessä on laatia kysely käyttäen hyväksi graafisia taulupohjia, Näihin kirjataan maskien avulla tulostusvalinnat, valintaehdot ja taulujen väliset kytkennät. Tämä kyselymalli on pohjana mm. Paradox:issa, Delphissä, ja Microsoft Access:issa. Kuvassa 24 on pieni esimerkki QBE-tyylisestä kyselystä.. QBE on SQL:ää helppokäyttöisempi satunnaisiin yksinkertaisiin raportointitarpeisiin. Monimutkaiset yhteenvetokyselyt ovat silläkin hankalia eikä QBE-tyyppisten kielten ilmaisuvoima näissä usein edes yllä SQL:n tasolle. 4 Zloof: Query by Example, National Computinc Conference, AFIPS,44,
26 Kurssi Koodi Nimi Opintoviikot Luennoija Java-ohjelmointi _kuka Opettaja Opetunnus Nimi Puhelin Tyohuone _kuka <Print> Kuva 24: QBE- kysely : Java-ohjelmointi kurssin luennoijan nimi. Pääasiallisesti tietokantaa käytetään kuitenkin sovellusohjelmien kautta. Nämä tarjoavat käyttäjilleen paremman käyttöliittymän, paremmin muotoillut raportit, tarpeiden mukaan kehitetyt palvelut, jotka eivät edellytä käyttäjiltä tietokannan rakenteen yksityiskohtaista tuntemista. Sovellusohjelmat laaditaan jollakin ohjelmointikielellä. Yleiskäyttöiset ohjelmointikielet kuten Ada, C, C++, Cobol, Pascal, jne. eivät kuitenkaan peruskokoonpanossaan tarjoa mitään välineistöä tietokannan käsittelyyn. Sovellusten toteutusvälinevaihtoehdoiksi muodostuvat tällöin joko erityisen tietokantaohjelmointikielen käyttö tai yleisohjelmointikielen täydentäminen tietokantakäytön mahdollistavilla lisämoduuleilla. Yleisohjelmointikielten laajentamiseen on tarjolla kaksi tekniikkaa sulautettu SQL ja tietokantaliittymäkirjaston käyttö (database application programming interface, database API) Sulautettu SQL Sulautetussa SQL:ssä SQL-lauseita voidaan kirjoittaa ohjelmointikielen lauseiden lomaan, esimerkiksi C-kielen lauseiden joukkoon. Jotta SQL-lauseet kyettäisiin erottamaan varsinaisista ohjelmointikielen lauseista (isäntäkielen lauseista), ne merkitään kuuluviksi SQL:ään. Standardin mukaan tämä tapahtuu siten, että SQL- 92
27 osuutta edeltää aina EXEC SQL alkumerkki. SQL-osuuden loppumerkki on kielikohtainen. Ohjelmointikielen normaali kääntäjä, esimerkiksi C-kääntäjä ei osaa käsitellä ohjelmaan upotettuja SQL-lauseita. Niiden käsittelyyn tarvitaan esikääntäjä. Esikääntäjä prosessoi ohjelman ja muokkaa sen sellaiseen muotoon, että se voidaan edelleen kääntää konekielelle ohjelmointikielen normaalikääntäjällä. Käytännössä tämä tarkoittaa sitä, että kieleen upotetut SQL-lauseet korvataan tietokantaliittymän toteuttavan ohjelmakirjaston funktioiden kutsuilla. Näissä kutsuissa kyselyt ja muut tietokantaoperaatiopyynnöt on muunnettu funktioiden parametreiksi. Liittymäkirjastojen funktiot ovat tietokannanhallintajärjestelmäkohtaisia samoin kuin esikääntäjätkin. Esimerkiksi Oraclen C-esikääntäjä ProC tuottaa tuloksenaan C-kielisen ohjelman, joka käyttää Oracle Call Level Interface kirjastoa. Tapa, jolla SQL-lauseet upotetaan isäntäkieleen on kuitenkin standardoitu. Joten periaatteessa on mahdollista vaihtaa tietokannanhallintajärjestelmää kääntämällä ohjelma uudelleen uuden järjestelmän esikääntäjällä. Alla on esimerkki Pascal funktiosta, johon on upotettu SQL-lauseita. function keskipalkka(dept:integer):real; var integer n; integer psumma; #include SQLCA.INC /* sql:n käyttämiä tietorakenteita*/ EXEC SQL BEGIN DECLARE SECTION var palkka: integer; os: integer; EXEC SQL END DECLARE SECTION begin EXEC SQL DECLARE pal CURSOR FOR SELECT salary from employee where department= :os; n:=0; psumma:=0; os:= dept; EXEC SQL open pal; EXEC SQL fetch pal into :palkka; while sqlcode = 0 do begin psumma := psumma + palkka; n := n + 1; EXEC SQL fetch pal into :palkka; end; EXEC SQL close pal; if n > 0 then keskipalkka := psumma/n else keskipalkka := 0; end; 93
28 Tietokannan käyttö liittymäkirjaston avulla Tietokannanhallintajärjestelmän liittymäkirjasto muodostuu joukosta funktioita. Näitä käyttämällä ohjelmoija voi kohdistaa operaatioita tietokantaan. Liittymäkirjasto on sama kirjasto, jonka tuntijoiden kutsuiksi esikääntäjä kääntää ohjelmaan upotetut SQL-lauseet. Kuten edellä jo todettiin jokaisella tietokannanhallintajärjestelmällä on oma liittymäkirjastonsa. Järjestelmäkohtaisten kirjastojen lisäksi on olemassa myös korkeamman tason abstraktioon perustuvia liittymäkirjastoja. Tällaisia ovat esimerkiksi ODBC (Microsoft Open Database Connection) ja JDBC (for Java) kirjastot. Nämä kirjastot tarjoavat tietokannanhallintajärjestelmästä riippumattoman ohjelmointirajapinnan tietokantapalvelujen käyttöön. Tietyn tietokannanhallintajärjestelmän käyttö ODBC tai JDBC rajapinnan kautta edellyttää kuitenkin tietonnanhallintajärjestelmäkohtaisen ajurin (driver) hankintaa. Esimerkiksi Oracle-kannan käyttäminen edellyttää Oracleajuria. Ajurin tehtävänä on muuntaa abstraktin kirjastorajapinnan kautta tapahtuvat kutsut tietokannanhallintajärjestelmän käyttämään muotoon. Esimerkkinä liittymäkirjastoihin perustuvasta tietokantaohjelmoinnista tarkastellaan seuraavassa tietokantasovelluksen toteutusta JDBC-kirjaston avulla. JDBC on Java ohjelmointikieleen liittyvä tietokantaohjelmointirajapinta. Käytöltään se on samankaltainen ODBC-rajapinnan kanssa. Kun ODBC muodostuu joukosta C-tyyppisiä funktioita, muodostuu JDBC Java-luokista ja niiden tarjoamista palveluista. Luokkarakenteen ansiosta rajapinta vaikuttaa ODBC:tä selkeämmältä ja jäsentyneemmältä. 94
29 JDBC:n perusteet 5 JDBC on Java luokkakirjasto tietokannan käsittelyyn. Kirjaston keskeiset perusluokat ovat: DriverManager, Connection, Statement, PreparedStatement ja ResultSet. DriverManager Pystyäkseen käyttämään hyväksi tietyn tietokannanhallintajärjestelmän palveluita on ohjelman käytettävä järjestelmäkohtaista ajuria. Ajuri, jos sellainen on olemassa, on saatavissa tietokannanhallintajärjestelmän toimittajalta. Ilman ajuria tietokantaa ei pysty käyttämään. Myös ODBC:ssä täytyy kiinnittää käytettävä ajuri, mutta tämä tehdään yleensä ohjelman ulkopuolisen hallintatyökalun avulla. Tämä hoidetaan DriverManager luokan avulla Luokkapalvelulla registerdriver ohjelma kytketään käyttämään tiettyä tietokanta-ajuria. Ajurin käyttö tapahtuu JDBC-kirjaston sisäisesti eikä ohjelmoijan tarvitse kytkemisen jälkeen olla sen kanssa missään tekemisissä. Ajurin kytkemiseen käytetään DriverManager luokan luokkapalvelua registerdriver. Myös ODBC:ssä täytyy kiinnittää käytettävä ajuri, mutta tämä tehdään yleensä ohjelman ulkopuolisen hallintatyökalun avulla. 5 Hyvä esitys JDBC:stä löytyy lähteestä: Hamilton G., Cattell R, Fisher M.: JDBC Database Access with Java -A tutorial and Annodated Reference, Addison-Wesley,
30 Esimerkki: Otetaan käyttöön Oracle-ajuri DriverManager.registerDriver((Driver)Class.forName ("oracle.jdbc.driver.oracledriver").newinstance()); Connection DriverManager tarjoaa myös palvelun yhteyden luomiseksi tietokantaan. Tietokantayhteydellä (database connection) hallitaan ohjelman ja tietokannan välistä vuorovaikutusta. Yhteyden olemassaolo on edellytys kaikkien tietokantaan kohdistuvien operaatioiden suoritukselle. Tietokannan suorakäytössä yhteys vastaa tietokantaistuntoa, joka alkaa käyttäjän sisäänkirjoittautumisesta ja päättyy istunnon lopetukseen. Samoin tietokantayhteys alkaa yhteyden perustamisella. JDBC:ssä yhteyden perustaminen tarkoittaa Connection-luokan olion luomista. Yhteys tulisi lopettaa kun sitä ei enää tarvita. Yhteyden lopettaminen vapauttaa siihen kytkettyjä resursseja sekä ohjelman itsensä että tietokantapalvelimen puolelta. JDBC:ssä yhteys suljetaan Connection-olion close-palvelulla. Yhteyden perustaminen vie jonkin verran aikaa ja haluttaessa nopeaa palvelua voidaan joskus jättää yhteyksiä roikkumaan, jotta niitä voitaisiin nopeasti ottaa uudelleen käyttöön. Ohjelmalla voi olla käytössään useita tietokantayhteyksiä jopa eri tietokantoihin. Samaan tietokantaan tarvitaan yleensä vain yksi yhteys. Esimerkki: Yhteyden perustaminen Oracle-kantaan. Connection con = DriverManager.getConnection( "jdbc:oracle:thin:@dbserver.helsinki.fi:1521:kanta1, "info", "expert"); Tässä luodaan Oraclen thin-ajuriin perustuva yhteys koneessa dbserver.helsinki.fi olevaan porttiin 1521 kytkettyyn tietokantaan, jonka tunnus on kanta1. 6 Yhteys perustuu käyttäjätunnukseen info, jonka salasana on expert. 6 dbserver.helsinki.fi nimistä tietokonetta ei ole oikeasti olemassa. 96
31 Statement Tietokantaan kohdistuvat operaatiot suoritetaan JDBC:ssä Statement-olioiden avulla. Statement-olio tarjoaa suoritusympäristön operaatioille. Se tarjoaa mm. palvelut executequery kyselyiden suoritukseen ja executeupdate tulostaulua tuottamattomien operaatioiden suoritukseen Tietokantaoperaatio suoritetaan jonkin tietokantayhteyden puitteissa. Tämä kytkentä on JDBC:ssä hoidettu siten, että Statement-olio luodaan käyttäen Connection-olion palvelua createstatement. Nimestään huolimatta Statement-olio ei sisällä suoritettavaa tietokantaoperaatiota vaan tämä annetaan operaation executequery tai executeupdate parametrina. Täten jokaista operaatiota varten ei tarvitse välttämättä luoda omaa Statement-oliota. Yhden Statement-olion puitteissa voi kuitenkin olla vain yksi aktiivinen operaatio kerrallaan. Operaatiota suoritettaessa havaitusta virhetilanteesta, esimerkiksi kyselyssä olevasta syntaksivirheestä, ilmoitetaan aiheuttamalla SQLException-tyyppinen poikkeus. Poikkeus pitää sisällään tilaindikaattorin SQLState, jonka arvo ilmaisee minkä tyyppisestä virheestä on kyse. Samoin poikkeuksen kautta saadaan tietoon tietokantaohjelmiston generoima virhekoodi ja virheilmoitus. Tietokantaoperaation yhteydessä pitää aina varautua SQLException poikkeukseen. ResultSet JDBC:ssä kyselyn vastausta käsitellään ResultSet olion palveluilla. Nämä mahdollistavat vastausjoukon rivien käsittelyn rivi kerrallaan. ResultSet tarjoaa myös palveluita metatiedon saamiseksi vastauksesta. Metatietoa ovat esimerkiksi vastauksen sarakkeiden lukumäärä, sarakkeiden nimet ja tietotyypit. ResultSet toteuttaa toimintoja, jotka sulautetussa SQL:ssä liittyvät käsitteeseen kursori (cursor). Vastausjoukko (ResultSet-olio) syntyy tuloksena Statement-olion palvelun executequery suorituksesta, siis kyselyn suorittamisesta. Suoritettava kysely annetaan palvelun parametrina. 97
32 Esimerkki Statement stmt= con.createstatement(); ResultSet rs= stmt.executequery( "select nimi, puhelin from opettaja"); Tässä esimerkissä luodaan yhteyden con avulla kyselyn suoritusympäristöksi Statement-olio stmt. Sitä käyttäen suoritetaan kysely, joka tulos on käsiteltävissä Resultset olion rs palvelujen avulla. Vastausta käsitellään rivi kerrallaan. Keskeinen palvelu on Boolen funktio next(). Se ottaa aktiiviseksi vastausriviksi vastausjoukossa seuraavana olevan rivin. Jos tällainen rivi on olemassa eli vastausjoukoa ei ole käsitelty loppuun next() palauttaa arvon true, muuten se palauttaa arvon false. Ensimmäisellä kutsukerralla se aktivoi vastausjoukon ensimmäisen rivin. Sulautetun SQL:n fetch-lause toimii samalla tavoin kursorin käsittelyssä. JDBC:n versiossa 1.0 ei ole mitään tapaa siirtyä vastausjoukossa taaksepäin, joten vastaus voidaan ohjelmassa käydä läpi vain kertaalleen alusta loppuun.. Versio 2.0 sisältää palveluita myös taaksepäin, sekä vastausjoukon alkuun ja loppuun siirtymiseksi. Aktiivisen rivin käsittelyyn ResultSet-oliot tarjoavat tietotyyppikohtaisia get-funktioita sarakkeen arvon saamiseksi ohjelman käyttöön. Vastausriviin sisältyvän merkkijonon sisältö saadaan selville funktiolla getstring, kokonaisluvun funktiolla getint, päiväyksen funktiolla getdate, jne. Näistä funktioista on käytettävissä kaksi muotoa, joista toinen hakee arvon sarakenimen perusteella ja toinen vastaussarakkeen järjestysnumeron perusteella. Esimerkki: String nimi = rs.getstring("nimi"); // sarakkeen nimi arvo String puh = rs.getstring(2); // toisen sarakkeen arvo get-funktiot osaavat jossakin määrin tehdä tietotyyppikonversioita. Esimerkiksi getstring-funktiolla voi hakea kaiken tyyppisiä tietoja. 98
33 SQL-kyselyt voivat tuottaa tyhjäarvoja sisältäviä vastauksia. get-funktiot käsittelevät näitä eri tavoin. Olioarvoiset funktiot kuten getstring palauttavat Javan nullosoittimen Tietotyyppiarvoiset funktiot sensijaan palauttavat, jonkin todellisen arvon. Esimerkiksi getint palauttaa arvon 0. ResultSet-oliolla on palvelu wasnull, jolla voi tarvittaessa tutkia oliko palautettu arvo tyhjäarvo. Kyselyn vastaus käsitellään vastaussilmukassa, jossa funktiolla next() haetaan vuoroon seuraava vastausrivi kunnes kaikki on käsitelty. Esimerkki: Puhelinluettelo (ei kovin tyylikäs layout) try { Statement stmt= con.createstatement(); ResultSet rs= stmt.executequery( "select nimi, puhelin from henkilo"+ " order by nimi"); while (rs.next()) { System.out.println(getString(1)+", " getstring(2)); } } catch (SQLException ex) { do something}; Operaatiot, jotka eivät tuota tulosrivejä suoritetaan funktiolla executeupdate; Esimerkki: stmt.executeupdate( update opettaja + set palkka= palkka where opetunnus=\ HLAINE\ ); korjaa hieman opettajan palkkaa. PreparedStatement Tietokannan käsittelyssä tarvitaan usein kyselyitä, joissa rakenteeltaan samanlainen kysely suoritetaan toistuvasti, mutta esimerkiksi hakuehdossa vaihtuu vakioarvo. 99
34 Tällainen kysely voidaan parametroida niin, että tuo muuttuva vakio annetaan kyselyn parametrina. Parametroidut kyselyt valmistellaan käyttöä varten. Valmistelussa ne käännetään valmiiksi odottamaan suoritusta vaihtuvin parametriarvoin. JDBC tarjoaa parametroitujen kyselyjen käsittelyyn luokan PreparedStatement, joka on luokan Statement aliluokka. Parametroitu SQL-operaatio annetaan parametrina PreparedStatement-olion luontifunktiolle Connection.prepareStatement. Operaatiossa parametri ilmaistaan kysymysmerkillä (?) Esimerkki: PreparedStatement pst = con.preparestatement( "select nimi, puhelin "+ "from opettaja"+ "where nimi like?" ); Tällainen kysely voisi sisältyä vaikkapa puhelinnumeroiden hakujärjestelmään, jossa käyttäjä voi antaa toistuvasti hakukriteerejä, joiden perusteella puhelinnumeroa haetaan. Parametrina tässä on nimeen liittyvä maski. Ennen parametroidun kyselyn suoritusta on parametreille kiinnitettävä arvot. PreparedStatement tarjoaa tietotyyppikohtaiset set-funktiot parametriarvojen kiinnittämiseksi, esimerkiksi setint, setstring, setdate, jne. Set-funktioilla on kaksi parametria: parametrin järjestysnumero ja arvo joka parametrille annetaan. Esimerkiksi pst.setstring(1,"möttö%"); kiinnittää arvon 'Möttö%' parameroidun kyselyn pst ensimmäiselle parametrille, joten kysely suoritettaessa vastaa kyselyä select nimi, puhelin from opettaja where nimi like Möttö% Parametroitu operaatio suoritetaan käyttäen palvelua executequery tai executeupdate. Nyt vain näiden yhteydessä ei anneta mitään parametria. 100
35 Esimerkkiohjelma: // Esimerkkiohjelma Tietokantojen perusteet // CLASSPATH polkumäärittelyssä täytyy olla polku hakemistoon // josta tietokanta ajuri löytyy import java.sql.*; import java.io.*; public class Esimerkki { public static void main(string args[]) throws Exception { String url = jdbc:oracle:thin:@dbserver.helsinki.fi:1521:kanta1"; Connection con; String query = "select KOODI, KURSSI.NIMI AS KNI, OPINTOVIIKOT, "+ "OPETTAJA.NIMI AS OPNI " + "from KURSSI, OPETTAJA " + "where KURSSI.LUENNOIJA= OPETTAJA.OPETUNNUS " + "order by OPETTAJA.NIMI, KURSSI.NIMI"; Statement stmt; try { DriverManager.registerDriver((Driver)Class.forName ("oracle.jdbc.driver.oracledriver").newinstance()); } catch(java.lang.classnotfoundexception e) { // Ilmoitetaan siitä, ettei yhteyttä saada aikaan. System.err.print("ClassNotFoundException: "); System.err.println(e.getMessage()); } try { // Luodaan yhteys kurssin käyttäjätunnuksella con = DriverManager.getConnection( url, "info", "expert"); // Luodaan tietokantaoperaation suoritusympäristö stmt = con.createstatement(); // Muuttujaa ope käytetään pitämään kirjaa edellisestä // opettajasta. Tällä kontrolloidaan opettajan nimen // tulostusta. String ope =" "; // Tulostetaan otsake System.out.println("OPETUSTEHTÄVÄT:"); System.out.println(); // Suoritetaan kysely ResultSet rs = stmt.executequery(query); // Käydään läpi vastausrivit while (rs.next()) { // Eristetään opettajan nimi, huom. alias-nimen // käyttö String opn = rs.getstring("opni"); // Jos opettaja vaihtuu tulostetaan tyhjä rivi ja // opettajan nimi, muuten vain kurssin tiedot if (ope.equals(opn)) { System.out.println(" " + rs.getstring("kni")+" ("+rs.getint("koodi")+")"); } else { 101
36 } } System.out.println(); ope= opn; System.out.println(ope); System.out.println(" " + rs.getstring("kni")+" ("+rs.getint("koodi")+")"); } } //end-while // Suljetaan 'kursori' - vapautetan vastausjoukon // käsittelyyn kiinnitetyt resurssit. Tälle // vastausjoukolle ei enää voi tehdä mitään, vaikka //sitä suljettaisikaan. rs.close(); stmt.close(); // Suljetaan tietokantayhteys. Yhteys suljetaan vasta // siinä vaiheessa kun ohjelmassa ei enää käsitellä // kantaa. con.close(); } catch(sqlexception ex) { // Imoitetaan virheestä System.err.print("SQLException: "); System.err.println(ex.getMessage()); } Tietokantaohjelmointikielet Tietokantaohjelmointikielissä tietokanta ja sen käsittelyyn tarvittavat rakenteet ovat peruskäsitteenä mukana kielessä. Nämä kielet tarjoavat normaalin ohjelmointikielen kontrollirakenteet ja lisäksi tietokantaliittymän sulautettua SQL:ää miellyttävämmin. Kielten pohjana on jokin yleisohjelmointikieli. Esimerkiksi tietokantaproseduurien laadintaan tarkoitetun standardikielen pohjana on Ada-ohjelmointikieli. Tietokantaohjelmointikieli esiintyy usein osana sovelluskehitintä. (application generator). Esimerkkinä tietokantaohjelmointikielestä voidaan tarkastella Oraclen PL/SQL kieltä. Se pohjautuu Ada ohjelmointikieleen, mutta on toiminnallisuudeltaan hieman Adaa suppeampi. Kieltä voi käyttää Oraclen SQL-forms ja Developer kehitinten yhteydessä sekä tietokantaproseduurien laadinnassa. Tietokannan käsittelyyn PL/SQL tarjoaa sulautetun SQL:n käsitteet sisäänrakennettuina SQL:n tietotyyppit ohjelmointikielen tietotyyppeinä 102
37 Oraclen SQL:n funktiot ohjelmointikielen funktioina Tietokannan kaavion hyväksikäytön ohjelman tietorakenteiden määrittelyssä helpot vastauksen käsittelysilmukat for rivi in kysely loop... end loop tietokantavirheet esimääriteltyinä poikkeuksina. Perustietorakenteiltaan kieli on kuitenkin Adaa köyhempi. Kieli ei myöskään käy yleisohjelmointikieleksi koska siitä puuttuvat kokonaan esimerkiksi näytön- ja tiedostojen käsittelyyn liittyvät operaatiot. 103
Tietokantojen perusteet, syksy 1999 SQL- osa Harri Laine 1. SQL-yhteenvetofunktiot. SQL-yhteenvetofunktiot
DO NOT PRINT THIS DOCUMENT SQL:ssä joukko yhteenvetofunktioita (aggregate function, koostefunktio) AVG keskiarvo MIN pienin arvo (minimi) MAX suurin arvo (maksimi) SUM summa COUNT lukumäärä Yhteenvetofunktioita
LisätiedotHelsingin yliopisto, tktl DO Tietokantojen perusteet, kevät 2000 SQL- osa Harri Laine 1. SQL-yhteenvetofunktiot. SQL-yhteenvetofunktiot
DO NOT PRINT THIS DOCUMENT SQL:ssä joukko yhteenvetofunktioita (aggregate function, koostefunktio) AVG keskiarvo MIN pienin arvo (minimi) MAX suurin arvo (maksimi) SUM summa COUNT lukumäärä Yhteenvetofunktioita
LisätiedotHelsingin yliopisto, tktl DO Tietokantojen perusteet, kevät 2000 SQL- osa Harri Laine 1. SQL-yhteenvetofunktiot. SQL-yhteenvetofunktiot
DO NOT PRINT THIS DOCUMENT SQL:ssä joukko yhteenvetofunktioita (aggregate function, koostefunktio) AVG keskiarvo MIN pienin arvo (minimi) MAX suurin arvo (maksimi) SUM summa COUNT lukumäärä Yhteenvetofunktioita
LisätiedotHelsingin yliopisto, TKTL Tietokantojen perusteet, k 2000 Tietokantaohjelmointi 23.2.2000. Harri Laine 1. SQL:n käyttö ohjelmissa
SQL:n käyttö ohjelmissa Tietokannan käyttö ohjelmasta Miksi vuorovaikutteinen käyttö ei riitä? kielen hallinta: maallikot? yhdistetään yleiskielen ja tietokantakielen edut, mm.» monimutkaisempi laskenta»
LisätiedotInsert lauseella on kaksi muotoa: insert into taulu [(sarakenimet)] values (arvot)
SQL sisältää operaatiot tietokannan sisällön muodostamiseen ja ylläpitoon: insert - uusien rivien vienti tauluun delete - rivien poisto update - rivien muutos 1 Insert lauseella on kaksi muotoa: insert
LisätiedotSQL - Tietokannan ylläpito. SQL - Tietokannan ylläpito. SQL - Tietokannan ylläpito. SQL - Tietokannan ylläpito. SQL - Tietokannan ylläpito
SQL sisältää operaatiot tietokannan sisällön muodostamiseen ja ylläpitoon: insert - uusien rivien vienti tauluun delete - rivien poisto update - rivien muutos Insert lauseella on kaksi muotoa: insert into
LisätiedotKyselyn yleisrakenne:
SQL kysely Kyselyn yleisrakenne: select tulostietomäärittely from taulukkeet [where valintaehdot] [group by ryhmitystekijät] [having ryhmärajoitteet] [order by järjestysperusta] Kysely tuottaa nimettömän
LisätiedotEXEC SQL BEGIN DECLARE SECTION
Tietokantaohjelmointi Tietokantaa käytetään harvoin suoraan kyselyliittymän kautta Tyypillisesti käyttö tapahtuu sovellusohjelman kautta Sovellusohjelmaa laadittaessa vaihtoehtoja tietokantakäsitettelyn
Lisätiedotselect tulostietomäärittely from taulukkeet [where valintaehdot] [group by ryhmitystekijät] [having ryhmärajoitteet] [order by järjestysperusta]
SQL kysely Kyselyn yleisrakenne: select tulostietomäärittely from taulukkeet [where valintaehdot] [group by ryhmitystekijät] [having ryhmärajoitteet] [order by järjestysperusta] Kysely tuottaa nimettömän
LisätiedotHarjoitustehtävä 1. Harjoitustehtävä 2. Harjoitustehtävä 2. Harjoitustehtävä 2. Harjoitustehtävä 2. SQL kysely
Harjoitustehtävä 1 Puutarha Puutarhatunnus omistaja sijainti Vastuualue puutarhatunnus aluenumero maaperä, kosteus valaistus sijainti vastuutonttu Tonttu Tonttutunnus Istutus istutuspäivä paikka_alueella
LisätiedotJohdanto Javaan ja tietokantojen käsittelyyn Java Database Connectivity (JDBC)
HAAGA-HELIA ICT1TA006: Ohjelmointi 1 /5 Johdanto Javaan ja tietokantojen käsittelyyn Java Database Connectivity (JDBC) (Lähteet: Oracle java jdbc Tutorial, Arvo Lipitsäinen: Tietokannan käsittely JDBC:n
LisätiedotRDBMS - Yhteyskäytännöt
HAAGA-HELIA Heti-09 1 (11) RDBMS - Yhteyskäytännöt Johdanto... 2 Upotettu SQL... 3 ESQL esimerkki... 4 ODBC... 5 Visual Basic ja ADO... 6 JAVA ja JDBC... 7 JDBC esimerkki... 8 Oracle ja JDBC... 9 Connection
LisätiedotTietokantojen perusteet, syksy 1999 SQL- osa Harri Laine 1. SQL-valintaehto. SQL-valintaehto. Opettajien nimet: Opiskelijoiden pääaineet
DO NOT PRINT THIS DOCUMENT SQL -valintaehto CREATE TABLE opettaja ( opetunnus varchar(12) NOT NULL, nimi varchar(40) NOT NULL, puhelin varchar(12), tyohuone varchar(12), PRIMARY KEY (opetunnus) ) ; CREATE
LisätiedotHelsingin yliopisto, TKTL Tietokantojen perusteet, k 2000 SQL- osa Harri Laine 1. SQL-valintaehto. SQL-valintaehto.
DO NOT PRINTTHIS DOCUMENT SQL -valintaehto SQL-valintaehto CREATE TABLE opettaja ( opetunnus varchar(12) NOT NULL, nimi varchar(40) NOT NULL, puhelin varchar(12), tyohuone varchar(12), PRIMARY KEY (opetunnus)
LisätiedotJava ja tietokannan käsittely (JDBC)
Java ja tietokannan käsittely (JDBC) Javan tietokannan käsittely luokat (java.sql.*) Yhteys tietokantaan Tietokannan yhteyden sulkeminen Tiedon haku tietokannasta Tiedon päivitys tietokantaan Transaktio
LisätiedotTietokannat II -kurssin harjoitustyö
Tietokannat II -kurssin harjoitustyö Jyri Lehtonen (72039), jkoleh@utu.fi Azad Hajipour (72187), azhaji@utu.fi 10.6.2007 Sisältö 1. Tietokannan kuvaus... 1 1.1 Tietokannan rakenne... 1 1.2 Relaatiokaava
LisätiedotSELECT-lauseen perusmuoto
SQL: Tiedonhaku SELECT-lauseen perusmuoto SELECT FROM WHERE ; määrittää ne sarakkeet, joiden halutaan näkyvän kyselyn vastauksessa sisältää
LisätiedotSQL-perusteet, SELECT-, INSERT-, CREATE-lauseet
SQL-perusteet, SELECT-, INSERT-, CREATE-lauseet A271117, Tietokannat Teemu Saarelainen teemu.saarelainen@kyamk.fi Lähteet: Leon Atkinson: core MySQL Ari Hovi: SQL-opas TTY:n tietokantojen perusteet-kurssin
LisätiedotSQL - STRUCTURED QUERY LANGUAGE
SQL Peruskomentoja SQL - STRUCTURED QUERY LANGUAGE SQL on tietokantojen käsittelyyn kehitetty kieli Esimerkkejä kielellä hoidettavistaa toiminnoista: Tietokannan rakenteen määrittely ja muuttaminen Kyselyt
LisätiedotHSMT Tietokannoista. Ville Leppänen. HSMT, c Ville Leppänen, IT, Turun yliopisto, 2008 p.1/32
HSMT Tietokannoista Ville Leppänen HSMT, c Ville Leppänen, IT, Turun yliopisto, 2008 p.1/32 Missä mennään... 1. Johdanto (1h) 2. Säikeet (2h) 3. Samanaikaisuudesta (2h) 4. Hajautetuista sovelluksista (1h)
Lisätiedot6 WWW-tietokantasovellukset 103. 7 Relaatiotietokannan suunnittelusta 134
5.5 Tietokannan käyttö ohjelmasta 91 5.5.1 Sulautettu SQL 92 5.5.2 Tietokannan käyttö liittymäkirjaston avulla 94 5.5.3 JDBC:n perusteet 95 5.5.4 Tietokantaohjelmointikielet 102 6 WWW-tietokantasovellukset
LisätiedotTIEDONHALLINTA - SYKSY Luento 11. Hannu Markkanen /10/12 Helsinki Metropolia University of Applied Sciences
TIEDONHALLINTA - SYKSY 2011 Kurssikoodi: Saapumisryhmä: Luento 11 TU00AA48-2002 TU10S1E Hannu Markkanen 22.11.2011 9/10/12 Helsinki Metropolia University of Applied Sciences 1 Indeksit Indeksit Taulun
LisätiedotOhjelmoinnin perusteet Y Python
Ohjelmoinnin perusteet Y Python T-106.1208 2.3.2009 T-106.1208 Ohjelmoinnin perusteet Y 2.3.2009 1 / 28 Puhelinluettelo, koodi def lue_puhelinnumerot(): print "Anna lisattavat nimet ja numerot." print
LisätiedotTietokantojen perusteet k2004helsingin yliopisto/tktl Tietokantojen perusteet, s 2005 SQL-perusteet. Harri Laine 1. SQL tietokantakieli
tietokantakieli :llä voidaan... määritellä ja muokata tietokantaa ja sen käyttöoikeuksia virittää tietokannan talletusrakenteita hakea tietoa tietokannasta näytölle tai tiedostoon sovellusohjelman käyttöön
Lisätiedotmääritellä ja muokata tietokantaa ja sen käyttöoikeuksia virittää tietokannan talletusrakenteita hakea tietoa tietokannasta
SQL tietokantakieli SQL:llä voidaan... määritellä ja muokata tietokantaa ja sen käyttöoikeuksia virittää tietokannan talletusrakenteita hakea tietoa tietokannasta näytölle tai tiedostoon sovellusohjelman
Lisätiedotmääritellä ja muokata tietokantaa ja sen käyttöoikeuksia virittää tietokannan talletusrakenteita hakea tietoa tietokannasta
SQL tietokantakieli SQL:llä voidaan... määritellä ja muokata tietokantaa ja sen käyttöoikeuksia virittää tietokannan talletusrakenteita hakea tietoa tietokannasta näytölle tai tiedostoon sovellusohjelman
Lisätiedotkäännös käännösvaiheessa tarkasettaan linkitys
Upotettu SQL Ohjelmoitaessa 3GL kielillä, käytetään relaatiotietokantaa yleensä esikääntäjien avulla. Tietokannan valmistaja toimittaa funktiokirjaston, jota esikääntäjän avulla hyödynnetään. Ongelmaksi
LisätiedotSQL-kielen perusteet. Tietokantojen perusteet 4.4.2008
SQL-kielen perusteet Tietokantojen perusteet 4.4.2008 Sisällys Tietokannan käsittely ja ylläpito SQL tiedonmäärittelykielenä Tietokantataulun ja sen osien määrittely SQL tiedonkäsittelykielenä SQL-kysely
LisätiedotHAAGA-HELIA Heti-09 1 (12) ICT05 Tiedonhallinta ja Tietokannat O.Virkki Näkymät
HAAGA-HELIA Heti-09 1 (12) Näkymät Näkymät... 2 Eri tyyppisiä relaatioita... 2 Taulu - Tallennettu relaatio... 2 Tulosrelaatio - Kyselyn tulos... 2 Näkymä - Virtuaalirelaatio... 2 Näkymien määrittely...
LisätiedotHelsingin yliopisto/tktl Tietokantojen perusteet, s 2007 SQL:n perusteet. Harri Laine 1. SQL tietokantakieli. SQL tietokantakieli
SQL tietokantakieli Relaatiomalliin pohjautuvat tietokannat Perustana relaatiomallin mukainen näkemys tietojen rakenteesta ja käsittelystä Tietokantojen rakenteen määrittelyssä ja käsittelymahdollisuuksissa
LisätiedotProseduurit, funktiot ja herättimet - esimerkkeinä Oracle, SQL Server, MySQL ja OCELOT. Jouni Huotari S2008
Proseduurit, funktiot ja herättimet - esimerkkeinä Oracle, SQL Server, MySQL ja OCELOT Jouni Huotari S2008 2 Proseduurit Ohjelmamoduuleita, jotka voidaan tallettaa tietokantaan (DBMS:n tietohakemistoon)
LisätiedotPROSEDUURIT, FUNKTIOT JA HERÄTTIMET - ESIMERKKEINÄ ORACLE, SQL SERVER, MYSQL JA OCELOT JOUNI HUOTARI K2009
PROSEDUURIT, FUNKTIOT JA HERÄTTIMET - ESIMERKKEINÄ ORACLE, SQL SERVER, MYSQL JA OCELOT JOUNI HUOTARI K2009 PROSEDUURIT Ohjelmamoduuleita, jotka voidaan tallettaa tietokantaan (DBMS:n tietohakemistoon)
Lisätiedot4.3.4 SQL kyselyt... 45
TIETOKANTOJEN PERUSTEET, OPETUSMONISTE OSA 3 SQL- KYSELYT Harri Laine 4.3.4 SQL kyselyt... 45 4.3.4.1 Tulostietomäärittely... 46 4.3.4.2 Viittaukset tauluihin ja sarakkeisiin... 49 4.3.4.3 Toistuvat tulosrivit...
LisätiedotTIEDONHALLINTA - SYKSY Luento 8. Saapumisryhmä: Pasi Ranne /9/13 Helsinki Metropolia University of Applied Sciences
TIEDONHALLINTA - SYKSY 2011 Kurssikoodi: Saapumisryhmä: Luento 8 XX00AA79-3013 TU12S2 Pasi Ranne 25.9.2013 25/9/13 Helsinki Metropolia University of Applied Sciences 1 Harjoitustyö Harjoitustöiden tilanne
LisätiedotTIEDONHALLINTA - SYKSY Luento 10. Hannu Markkanen /10/12 Helsinki Metropolia University of Applied Sciences
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
LisätiedotTIETOKANTOJEN PERUSTEET MARKKU SUNI
TIETOKANTOJEN PERUSTEET MARKKU SUNI SQL - KIELI TIETOJEN MUOKKAUS MARKKU SUNI Tarkastellaan tauluissa olevien tietojen muokkausta muokkauskäskyjä: INSERT UPDATE DELETE Kysymys kuuluu: Voiko tietoja muokata
LisätiedotTehtävä 1. Tietojen lisääminen, poistaminen, päivittäminen ja tulostaminen
Esimerkki: Tehtävä 1. Tietojen lisääminen, poistaminen, päivittäminen ja tulostaminen Luo tietokanta Koulu. Tietokantaan lisätään 3 taulua. Kurssit-taulu: kurssiid not null primary key INTEGER aineid not
LisätiedotTietokanta (database)
Tietokanta Tietokanta (database) jotakin käyttötarkoitusta varten laadittu kokoelma toisiinsa liittyviä säilytettäviä tietoja 1 Tiedosto Ohjelmointikielissä apumuistiin tallennettuja tietoja käsitellään
LisätiedotHELIA 1 (14) Outi Virkki Tiedonhallinta
HELIA 1 (14) Luento Näkymät... 2 Relaatiotyypit... 2 Taulu - Tallennettu relaatio... 3 Näkymä - Virtuaalirelaatio... 3 Tulosrelaatio - Kyselyn tulos... 3 Otetaulut - Tauluun tallennettu kyselyn tulos...
LisätiedotKirjasto Relaatiotietokannat Kevät 2001. Auvinen Annemari Niemi Anu Passoja Jonna Pulli Jari Tersa Tiina
Kirjasto Kevät 2001 Auvinen Annemari Niemi Anu Harjoitustyö 7.4.2001 Sisällysluettelo 1. Yleiskuvaus... 3 2. Vaatimukset... 3 2.1. Toiminnalliset... 3 2.1.1. Sisäänkirjautuminen... 3 2.1.2. Nimikkeiden
LisätiedotHELIA 1 (11) Outi Virkki Tiedonhallinta 4.11.2000
HELIA 1 (11) Access 1 ACCESS...2 Yleistä...2 Access-tietokanta...3 Perusobjektit...3 Taulu...5 Kysely...7 Lomake...9 Raportti...10 Makro...11 Moduli...11 HELIA 2 (11) ACCESS Yleistä Relaatiotietokantatyyppinen
LisätiedotHELIA 1 (15) Outi Virkki Tietokantasuunnittelu 13.11.2000
HELIA 1 (15) Luento 2.7 Toiminnallisuutta tietokantaan... 2 Deklaratiivinen eheysvalvonta... 2 Proseduraalinen eheysvalvonta... 3 Eheysvalvonnan suunnittelusta... 4 Sääntöjen määrittely... 4 Toteutusvaihtoehdot...
LisätiedotHelsingin yliopisto Tietojenkäsittelytieteen laitos (H.Laine) Tietokantojen perusteet. Liitteenä: Tiivistelmä SQL-syntaksista
Helsingin yliopisto Tietojenkäsittelytieteen laitos 26.2.2014 (H.Laine) Tietokantojen perusteet Liitteenä: Tiivistelmä SQL-syntaksista Kirjoita jokaiseen erilliseen vastausarkkiin kurssin nimi, tenttipäivä,
LisätiedotOhjelmistojen mallintamisen ja tietokantojen perusteiden yhteys
Ohjelmistojen mallintamisen ja tietokantojen perusteiden yhteys Tällä kurssilla on tutustuttu ohjelmistojen mallintamiseen oliomenetelmiä ja UML:ää käyttäen Samaan aikaan järjestetyllä kurssilla on käsitelty
LisätiedotHelsingin yliopisto/tktl DO Tietokantojen perusteet, s 2000 Johdanto & yleistä Harri Laine 1. Tietokanta. Tiedosto
Tietokanta Tiedosto Tietokanta (database) jotakin käyttötarkoitusta varten laadittu kokoelma toisiinsa liittyviä säilytettäviä tietoja Ohjelmointikielissä apumuistiin tallennettuja tietoja käsitellään
LisätiedotOhjelmoinnin perusteet, syksy 2006
Ohjelmoinnin perusteet, syksy 2006 Esimerkkivastaukset 1. harjoituksiin. Alkuperäiset esimerkkivastaukset laati Jari Suominen. Vastauksia muokkasi Jukka Stenlund. 1. Esitä seuraavan algoritmin tila jokaisen
LisätiedotHELIA TIKO-05 1 (17) ICT03D Tieto ja tiedon varastointi Räty, Virkki
HELIA TIKO-05 1 (17) SQL / DML 4 Alikyselyt...2 Joukko-operaatiot...7 Yhdiste, unioni...8 Leikkaus...9 Erotus... 10 Tietokannan datan muokkaus... 11 Lisäys... 11 Yhden rivin lisääminen... 12 Useamman rivin
LisätiedotIDL - proseduurit. ATK tähtitieteessä. IDL - proseduurit
IDL - proseduurit 25. huhtikuuta 2017 Viimeksi käsiteltiin IDL:n interaktiivista käyttöä, mutta tämä on hyvin kömpelöä monimutkaisempia asioita tehtäessä. IDL:llä on mahdollista tehdä ns. proseduuri-tiedostoja,
LisätiedotHELIA 1 (14) Outi Virkki Tiedonhallinta
HELIA 1 (14) Luento SQL... 2 Historiaa... 2 Standardit... 3 Käyttö... 4 DDL... 5 Tietokantaobjektien määrittely... 5 SQL:n tietotyypit... 6 Eheyssääntöjen määrittely... 9 Indeksin määrittely... 11 Syntaksikuvaukset...
LisätiedotATK tähtitieteessä. Osa 3 - IDL proseduurit ja rakenteet. 18. syyskuuta 2014
18. syyskuuta 2014 IDL - proseduurit Viimeksi käsiteltiin IDL:n interaktiivista käyttöä, mutta tämä on hyvin kömpelöä monimutkaisempia asioita tehtäessä. IDL:llä on mahdollista tehdä ns. proseduuri-tiedostoja,
LisätiedotJava-kielen perusteet
Java-kielen perusteet Tunnus, varattu sana, kommentti Muuttuja, alkeistietotyyppi, merkkijono, literaalivakio, nimetty vakio Tiedon merkkipohjainen tulostaminen 1 Tunnus Java tunnus Java-kirjain Java-numero
Lisätiedotjotakin käyttötarkoitusta varten laadittu kokoelma toisiinsa liittyviä säilytettäviä tietoja
Tietokanta Tietokanta (database) jotakin käyttötarkoitusta varten laadittu kokoelma toisiinsa liittyviä säilytettäviä tietoja mikä tahansa tietokokoelma? --> erityispiirteitä Tietokanta vs. tiedosto 1
LisätiedotHelsingin yliopisto, Tietojenkäsittelytieteen laitos Tietokantojen perusteet, , H.Laine
Helsingin yliopisto, Tietojenkäsittelytieteen laitos Tietokantojen perusteet, 3.5.2007, H.Laine Kirjoita kuhunkin erilliseen vastauspaperiin kurssin nimi, oma nimesi, syntymäaikasi ja nimikirjoituksesi
LisätiedotTIETOKANTOJEN PERUSTEET OSIO 14 MARKKU SUNI
TIETOKANTOJEN PERUSTEET OSIO 14 MARKKU SUNI Tavoite: Suunnitella käyttäjien tarvitsemat turvallisuusmekanismit ja säännöt. Toisin sanoen: tehdä tietokannasta turvallinen ja luotettava. Muistutus: Tietokanta
Lisätiedot5. HelloWorld-ohjelma 5.1
5. HelloWorld-ohjelma 5.1 Sisällys Lähdekoodi. Lähdekoodin (osittainen) analyysi. Lähdekoodi tekstitiedostoon. Lähdekoodin kääntäminen tavukoodiksi. Tavukoodin suorittaminen. Virheiden korjaaminen 5.2
LisätiedotOhjelmoinnin perusteet Y Python
Ohjelmoinnin perusteet Y Python T-106.1208 28.2.2011 T-106.1208 Ohjelmoinnin perusteet Y 28.2.2011 1 / 46 Ohjelmointiprojektin vaiheet 1. Määrittely 2. Ohjelman suunnittelu (ohjelman rakenne ja ohjelman
LisätiedotOhjelmoinnin perusteet Y Python
Ohjelmoinnin perusteet Y Python T-106.1208 2.3.2011 T-106.1208 Ohjelmoinnin perusteet Y 2.3.2011 1 / 39 Kertausta: tiedoston avaaminen Kun ohjelma haluaa lukea tai kirjoittaa tekstitiedostoon, on ohjelmalle
LisätiedotSQL. ! nykystandardi SQL3 eli SQL'99. ! CREATE TABLE, ALTER TABLE ja DROP TABLE. ! CREATE VIEW ja DROP VIEW. ! CREATE INDEX ja DROP INDEX
SQL - perusteet SQL - yleistä Esa Salmikangas InMics SE Oy versio 16.6.2003 SQL - perusteet 1 SQL - perusteet 2 SQL Structured Query Language SQL on tietokantojen käsittelyyn kehitetty kieli yleisimmät
Lisätiedot5 SQL TIETOKANTAKIELI...33
5 SQL TIETOKANTAKIELI...33 5.1 SQL TIETOKANTA...34 5.2 SQL:N KIRJOITUSASU...36 5.3 SQL MÄÄRITTELYKIELENÄ...36 5.3.1 Käyttäjät...36 5.3.2 Oikeudet...37 5.3.3 Kaaviot ja taulut...38 5.3.4 Taulujen rakenteen
LisätiedotRelaation tyhjyyden testaaminen
Tulostaulun tyhjyyden testaaminen Luettele ne asiakkaat, joilla on sekä talletus että laina -konttorissa. (Leikkaus!) useita mahdollisia toteutustapoja INTERSECT sisäkysely sisäkysely + tulostaulun tyhjyyden
Lisätiedot11. Javan toistorakenteet 11.1
11. Javan toistorakenteet 11.1 Sisällys Laskuri- ja lippumuuttujat. Sisäkkäiset silmukat. Tyypillisiä ohjelmointivirheitä: Silmukan rajat asetettu kierroksen verran väärin. Ikuinen silmukka. Silmukoinnin
Lisätiedot12. Javan toistorakenteet 12.1
12. Javan toistorakenteet 12.1 Sisällys Yleistä toistorakenteista. Laskurimuuttujat. While-, do-while- ja for-lauseet. Laskuri- ja lippumuuttujat. Tyypillisiä ohjelmointivirheitä. Silmukan rajat asetettu
LisätiedotKirjoita jokaiseen erilliseen vastauspaperiin kurssin nimi, tenttipäivä, oma nimesi (selkeästi), opiskelijanumerosi ja nimikirjoituksesi
Helsingin yliopisto, Tietojenkäsittelytieteen laitos Tietokantojen perusteet, kurssikoe 29.2.2012 (vastauksia) Liitteenä on tiivistelmä SQL-syntaksista Kirjoita jokaiseen erilliseen vastauspaperiin kurssin
LisätiedotSQL:N PERUSTEET MARKKU SUNI
SQL:N PERUSTEET MARKKU SUNI Relaatiomallisen tietokannan käsittely Tietojen saanti, talletus ja päivitys tapahtuu SQL-kielellä Yhtä operaatiota sanotaan kyselyksi (query) Kyselyjä voidaan laittaa peräkkäin
LisätiedotRelaatioalgebra. Kyselyt:
Relaatioalgebra Relaatiomalliin liittyy malli tietokannan käsittelystä Tietokannasta pitää pystyä hakemaan tietoa ja toisaalta tietokantaa on ylläpidettävä Tietokannan käsittelyn malli relaatioalgebra
LisätiedotTietokannat II -kurssin harjoitustyö
Tietokannat II -kurssin harjoitustyö Olli Opiskelija (123), olli.opiskelija@foo.fi Maija Mallioppilas (321), maija.mallioppilas@foo.fi 13.3. 2007 1 Sisältö 1 Tietokannan kuvaus 3 1.1 Tietokannan rakenne..................................
LisätiedotCSE-A1200 Tietokannat
CSE-A1200 Tietokannat 29.3.2016 CSE-A1200 Tietokannat 29.3.2016 1 / 40 Oppimistavoitteet: tämän luennon jälkeen Tiedät, miten tietokannan relaatioiden (taulujen) määrittelyt kirjoitetaan SQL:llä. Osaat
LisätiedotAlkuarvot ja tyyppimuunnokset (1/5) Alkuarvot ja tyyppimuunnokset (2/5) Alkuarvot ja tyyppimuunnokset (3/5)
Alkuarvot ja tyyppimuunnokset (1/5) Aiemmin olemme jo antaneet muuttujille alkuarvoja, esimerkiksi: int luku = 123; Alkuarvon on oltava muuttujan tietotyypin mukainen, esimerkiksi int-muuttujilla kokonaisluku,
Lisätiedot1. Omat operaatiot 1.1
1. Omat operaatiot 1.1 Sisällys Yleistä operaatioista. Mihin operaatioita tarvitaan? Oman operaation määrittely. Yleisesti, nimeäminen ja hyvä ohjelmointitapa, määreet, parametrit ja näkyvyys. HelloWorld-ohjelma
LisätiedotOpettajana Mika Sorsa, mika.sorsa@koudata.fi, HAMK:n ammatillisen opettajakoulutuksen opetusharjoittelija
Opettajana Mika Sorsa, mika.sorsa@koudata.fi, HAMK:n ammatillisen opettajakoulutuksen opetusharjoittelija Opintojaksolla: keskitytään relaatiotietokantojen teoriaan ja toimintaan SQL-kieli kyselykielenä
LisätiedotTutoriaaliläsnäoloista
Tutoriaaliläsnäoloista Tutoriaaliläsnäolokierroksella voi nyt täyttää anomuksen läsnäolon merkitsemisestä Esim. tagi ei toiminut, korvavaltimon leikkaus, yms. Hyväksyn näitä omaa harkintaa käyttäen Tarkoitus
Lisätiedot12. Javan toistorakenteet 12.1
12. Javan toistorakenteet 12.1 Sisällys Yleistä toistorakenteista. Laskurimuuttujat. While-, do-while- ja for-lauseet. Laskuri- ja lippumuuttujat. Tyypillisiä ohjelmointivirheitä. Silmukan rajat asetettu
LisätiedotOhjelmoinnin jatkokurssi, kurssikoe 28.4.2014
Ohjelmoinnin jatkokurssi, kurssikoe 28.4.2014 Kirjoita jokaiseen palauttamaasi konseptiin kurssin nimi, kokeen päivämäärä, oma nimi ja opiskelijanumero. Vastaa kaikkiin tehtäviin omille konsepteilleen.
LisätiedotSisällys. 12. Näppäimistöltä lukeminen. Yleistä. Yleistä 12.1 12.2 12.3 12.4
Sisällys 12. Näppäimistöltä lukeminen Arvojen lukeminen näppäimistöltä yleisesti. Arvojen lukeminen näppäimistöltä Java-kielessä.. Luetun arvon tarkistaminen. Tietovirrat ja ohjausmerkit. Scanner-luokka.
LisätiedotKyselyt: Lähtökohtana joukko lukuja Laskukaava kertoo miten luvuista lasketaan tulos soveltamalla laskentaoperaatioita
Relaatioalgebra Relaatiomalliin liittyy malli tietokannan käsittelystä Tietokannasta pitää pystyä hakemaan tietoa ja toisaalta tietokantaa on ylläpidettävä Tietokannan käsittelyn malli relaatioalgebra
LisätiedotSisällys. 1. Omat operaatiot. Yleistä operaatioista. Yleistä operaatioista
Sisällys 1. Omat operaatiot Yleistä operaatioista. Mihin operaatioita tarvitaan? Oman operaation määrittely. Yleisesti, nimeäminen ja hyvä ohjelmointitapa, määreet, parametrit ja näkyvyys. HelloWorld-ohjelma
LisätiedotRelaatioalgebra. Relaatioalgebra. Relaatioalgebra. Relaatioalgebra - erotus (set difference) Kyselyt:
Relaatiomalliin liittyy malli tietokannan käsittelystä Tietokannasta pitää pystyä hakemaan tietoa ja toisaalta tietokantaa on ylläpidettävä Tietokannan käsittelyn malli relaatioalgebra määrittelee operaatiot,
LisätiedotTietokannat. CREATE TABLE table(col1,col2,... ); Luo uuden taulun. CREATE TABLE opiskelijat(opnumero,etunimi,sukunimi);
Tietokannat SQL-peruskomentojen pikaopas CREATE TABLE table(col1,col2,... ); Luo uuden taulun. CREATE TABLE opiskelijat(opnumero,etunimi,sukunimi); INSERT INTO table VALUES(val1,val2,... ); Lisää tauluun
LisätiedotOhjelmoinnin perusteet Y Python
Ohjelmoinnin perusteet Y Python T-106.1208 1.3.2010 T-106.1208 Ohjelmoinnin perusteet Y 1.3.2010 1 / 36 Monikko Monikko (engl. tuple) muistuttaa listaa, mutta monikon sisältöä ei voi muuttaa sen jälkeen,
LisätiedotKirjoita kuhunkin erilliseen vastauspaperiin kurssin nimi, tentin päiväys, oma nimesi, syntymäaikasi ja nimikirjoituksesi.
Helsingin yliopisto, Tietojenkäsittelytieteen laitos Tietokantojen perusteet, kurssikoe 4.3.2015, H. Laine Tehtävien mukana jaetaan sql-syntaksin tiivistelmä. Kirjoita kuhunkin erilliseen vastauspaperiin
LisätiedotTällä viikolla. Kotitehtävien läpikäynti Aloitetaan Pelifirman tietovaraston suunnittelu Jatketaan SQL-harjoituksia
Tällä viikolla Kotitehtävien läpikäynti Aloitetaan Pelifirman tietovaraston suunnittelu Jatketaan SQL-harjoituksia 1.) Mainitse tietokonepelistä (kuvitteellisesta tai todellisesta) esimerkkitilanteita,
LisätiedotHELIA TIKO-05 1 (22) ICT03D Tieto ja tiedon varastointi E.Räty, O.Virkki 9.3.2010
HELIA TIKO-05 1 (22) SQL SQL... 2 Historiaa... 2 Standardit... 3 Käyttö... 4 Sql-komentojen kirjoittaminen... 5 DDL... 7 Tietokantaobjektien määrittely... 7 SQL:n tietotyypit... 8 Eheyssääntöjen määrittely...
LisätiedotFROM-lausekkeessa voidaan määritellä useampi kuin yksi taulu, josta tietoja haetaan: Tuloksena on taululistassa lueteltujen taulujen rivien
Monen taulun kyselyt FROM-lausekkeessa voidaan määritellä useampi kuin yksi taulu, josta tietoja haetaan: SELECT FROM Tuloksena on taululistassa lueteltujen taulujen rivien karteesinen
LisätiedotKoostefunktiot. Viisi standardifunktiota: Esim. montako henkilöä on henkilo-taulussa:
Funktiot Koostefunktiot Viisi standardifunktiota: AVG -- keskiarvo MIN -- pienin arvo MAX -- suurin arvo SUM -- summa COUNT-- lukumäärä Esim. montako henkilöä on henkilo-taulussa: SELECT Count(*) AS Lkm
LisätiedotOhjelmoinnin perusteet Y Python
Ohjelmoinnin perusteet Y Python T-106.1208 25.2.2009 T-106.1208 Ohjelmoinnin perusteet Y 25.2.2009 1 / 34 Syötteessä useita lukuja samalla rivillä Seuraavassa esimerkissä käyttäjä antaa useita lukuja samalla
LisätiedotTIEDONHALLINNAN PERUSTEET - SYKSY 2013
TIEDONHALLINNAN PERUSTEET - SYKSY 2013 Kurssikoodi: Saapumisryhmä: Luento 5 XX00AA79-3013 TU12S2 Pasi Ranne 11.9.2013 11/9/13 Helsinki Metropolia University of Applied Sciences 1 Tietokannan normalisoinnin
LisätiedotHakukyselyt: SELECT * FROM taulu WHERE sarake1 = Malli Nimi [WHERE sarake1 LIKE M% ] [WHERE BETWEEN ehto1 AND ehto2] [WHERE sarake1 IN/= (alikysely)]
Tällä viikolla Kertaus SQL-asioista jatketaan SQL-tekstifuntio-harjoituksia tehdään pelifirman tietokannasta ER-malli MySQL:llä, tarkastellaan mallin toimivuutta ja korjataan, jos korjattavaa löytyy, tehdään
LisätiedotTiedonhallinnan perusteet. Viikko 1 Jukka Lähetkangas
Tiedonhallinnan perusteet Viikko 1 Jukka Lähetkangas Kurssilla käytävät asiat Tietokantojen toimintafilosofian ja -tekniikan perusteet Tiedonsäilönnän vaihtoehdot Tietokantojen suunnitteleminen internetiä
Lisätiedot815338A Ohjelmointikielten periaatteet Harjoitus 3 vastaukset
815338A Ohjelmointikielten periaatteet 2015-2016. Harjoitus 3 vastaukset Harjoituksen aiheena ovat imperatiivisten kielten muuttujiin liittyvät kysymykset. Tehtävä 1. Määritä muuttujien max_num, lista,
LisätiedotTIETOKANNAT: MYSQL & POSTGRESQL Seminaarityö
TIETOKANNAT: MYSQL & POSTGRESQL Seminaarityö Tekijät: Eemeli Honkonen Joni Metsälä Työ palautettu: SISÄLLYSLUETTELO: 1 SEMINAARITYÖN KUVAUS... 3 2 TIETOKANTA... 3 2.1 MITÄ TIETOKANNAT SITTEN OVAT?... 3
Lisätiedot811120P Diskreetit rakenteet
811120P Diskreetit rakenteet 2018-2019 1. Algoritmeista 1.1 Algoritmin käsite Algoritmi keskeinen laskennassa Määrittelee prosessin, joka suorittaa annetun tehtävän Esimerkiksi Nimien järjestäminen aakkosjärjestykseen
Lisätiedot8. Näppäimistöltä lukeminen 8.1
8. Näppäimistöltä lukeminen 8.1 Sisällys Arvojen lukeminen näppäimistöltä Java-kielessä. In-luokka. In-luokka, käännös ja tulkinta Scanner-luokka. 8.2 Yleistä Näppäimistöltä annettujen arvojen (syötteiden)
Lisätiedot4.3.1 SQL tietokanta SQL:n kirjoitusasu SQL määrittelykielenä... 36
TIETOKANTOJEN PERUSTEET, OPETUSMONISTE OSA 2 SQL- TIETOKANNAN RAKENNE JA MÄÄRITTELYT Harri Laine 4.3 SQL TIETOKANTAKIELI... 33 4.3.1 SQL tietokanta... 34 4.3.2 SQL:n kirjoitusasu... 36 4.3.3 SQL määrittelykielenä...
Lisätiedot12. Näppäimistöltä lukeminen 12.1
12. Näppäimistöltä lukeminen 12.1 Sisällys Arvojen lukeminen näppäimistöltä yleisesti. Arvojen lukeminen näppäimistöltä Java-kielessä. In-luokka. Luetun arvon tarkistaminen. Tietovirrat ja ohjausmerkit.
Lisätiedot1.3Lohkorakenne muodostetaan käyttämällä a) puolipistettä b) aaltosulkeita c) BEGIN ja END lausekkeita d) sisennystä
OULUN YLIOPISTO Tietojenkäsittelytieteiden laitos Johdatus ohjelmointiin 81122P (4 ov.) 30.5.2005 Ohjelmointikieli on Java. Tentissä saa olla materiaali mukana. Tenttitulokset julkaistaan aikaisintaan
LisätiedotPedacode Pikaopas. Tietokantaa hyödyntävän sovelluksen luominen
Pedacode Pikaopas Tietokantaa hyödyntävän sovelluksen luominen Pikaoppaan sisältö Pikaoppaassa kuvataan, Netbeans-työkalulla luodaan uusi yksinkertainen Java DB -tietokantaa hyödyntävä sovellus. Opas kattaa
LisätiedotJava-kielen perusteet
Java-kielen perusteet Tunnus, varattu sana, kommentti Muuttuja, alkeistietotyyppi, merkkijono, Vakio Tiedon merkkipohjainen tulostaminen Ohjelmointi (ict1tx006) Tunnus (5.3) Javan tunnus Java-kirjain Java-numero
LisätiedotHOJ Haja-aiheita. Ville Leppänen. HOJ, c Ville Leppänen, IT, Turun yliopisto, 2012 p.1/10
HOJ Haja-aiheita Ville Leppänen HOJ, c Ville Leppänen, IT, Turun yliopisto, 2012 p.1/10 Missä mennään... 1. Johdanto (1h) 2. Säikeet (2h) 3. Samanaikaisuudesta (2h) 4. Hajautetuista sovelluksista (1h)
LisätiedotOhjelmoinnin perusteet Y Python
Ohjelmoinnin perusteet Y Python T-106.1208 15.3.2010 T-106.1208 Ohjelmoinnin perusteet Y 15.3.2010 1 / 56 Tiedostoista: tietojen tallentaminen ohjelman suorituskertojen välillä Monissa sovelluksissa ohjelman
Lisätiedot15. Ohjelmoinnin tekniikkaa 15.1
15. Ohjelmoinnin tekniikkaa 15.1 Sisällys For-each-rakenne. Lueteltu tyyppi enum. Override-annotaatio. Geneerinen ohjelmointi. 15.2 For-each-rakenne For-rakenteen variaatio taulukoiden ja muiden kokoelmien
Lisätiedot