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 uuden tietueen. INSERT INTO opiskelijat VALUES(968625, Iina, Koillinen ); SELECT col1,col2,... FROM tablename WHERE... ; Hakee annetut ehdot täyttäviä tietueita. SELECT etunimi,sukunimi FROM opiskelijat WHERE opnumero=968625; DELETE FROM table WHERE... ; Kuten SELECT, poistaa haetut tietueet. DELETE FROM opiskelijat WHERE opnumero=968625; DROP TABLE table; Poistaa annetun taulun ja kaikki siinä olevat tietueet! DROP TABLE opiskelijat; Hyödyllinen resurssi SQL-komentojen opetteluun: http://www.w3schools.com/sql/sql_quickref.asp 1
Tietokanta Tietokanta on tietorakenne, johon varastoidaan tietoa järjestettyinä tietueina. Tietokannat ovat tärkeä osa esimerkiksi liiketoiminnan, Internet-palvelujen ja monien jäsenrekisterien hallinnointia. Tietokanta on usein tehokkain tapa varastoida ja käsitellä automaattisesti suuria määriä keskenään samankaltaisista alkioista koostuvaa dataa. Tällä kurssilla käsitellyt tietokannat ovat SQL-relaatiotietokantoja. Tällainen tietokanta koostuu tauluista ja tietueista. Taululla on sarakkeita, jotka vastaavat jotakin tietotyyppiä, kuten opiskelijan etunimeä tai opiskelijanumeroa. Tietue on taulun rivi: se kuvaa kokonaisuutta, kuten opiskelijaa, jolla on omat arvot kussakin sarakkeessa. Taulut siis määrittelevät tietokannan rakenteen, tietueet sisällön. Tietokannan tauluja voi usein tulkita samalla tavalla kuin hyvin järjestettyä Excel-taulukkoa. Ilmeisin ero on, että Excelin kaltaisessa taulukkolaskentaohjelmassa tietojen järjestys on käyttäjän varassa - oikeassa tietokannassa esimerkiksi taulukon ulkopuolelta ei voi valita summittaisesti tyhjää ruutua ja kirjoittaa muistiinpanoja. Tietokanta on Exceliä tehokkaampi ja soveltuu paremmin tietokoneohjelmien ja palveluiden käyttöön. Excel lienee kätevämpi ihmiskäyttäjän toimistotyössä. opnumero etunimi sukunimi koulutusohjelma 801811 Tatu Haavisto TIK 719193 Konstantin Pieninkeroinen ARK 341704 Heli Rautjärvi EST Taulukko 1: Opiskelijatietokannan taulu opiskelijat 2
SQLite Browser -ohje Tällä kurssilla tietokantoja ohjataan SQLite Database Browser 2.2 a -ohjelmalla (SQLite Browser). Ohjelma on pakattu harjoitustehtäväkansioon, alikansioon sqlitebrowser. Sitä ei tarvitse asentaa, vaan ohjelman saa käyntiin suoraan ajamalla tiedoston sqlitestudio2-win.exe. Ohjelman voi myös ladata Internetistä osoitteesta http://sourceforge.net/projects/sqlitedbrowser/ Kun käynnistät SQLite Browserin, avaa ensimmäiseksi käsiteltävä tietokantatiedosto työkaluriviltä (Open an existing database file). SQLite Browserilla voi myös luoda uusia tietokantoja (Create a new database file). 3
Kun avaat tietokannan, ohjelma näyttää oletuksena ensimmäistä välilehteä, Database Structure. Tässä tilassa voit selata tietokantarakennetta, eli tietokannan tauluja: Minkä nimisiä tauluja tietokannassa on ja mitä sarakkeita tauluissa on. Tämä siis kertoo missä muodossa tiedot on esitetty. Kuvan tietokannassa on kaksi taulua: opiskelijat ja tapahtumat. 4
Toisella välilehdellä, Browse Data, voit katsella tietokannan sisältöä, eli kussakin taulussa olevia tietueita. Voit vaihtaa katseltavaa taulua välilehden yläosassa Table-valikosta. Tässä näkymässä voit myös lisätä, muokata ja poistaa tietueita. Tällä kurssilla tietokantamuutokset tehdään kuitenkin pääasiassa manuaalisesti kolmannessa välilehdessä. 5
Kolmannen välilehden, Execute SQL, kautta pääset syöttämään komentoja SQL-kielellä. SQL eli Structured Query Language on tietokantojen käsittelyyn tarkoitettu ohjelmointikieli, josta kerrotaan enemmän seuraavassa luvussa. Kirjoita haluamasi komento SQL string -kenttään ja paina Execute query. Data returned -kenttä näyttää tiedot, jotka komennolla löydettiin (jos teit hakukomennon). Jos komennossa on virheitä, virheilmoitukset tulevat Error message -kenttään. 6
SQL SQL, Structured Query Language, on ohjelmointikieli, jota käytetään hallinnoimaan tietokantoja. SQL:llä ei ole käytännöllistä, tai edes mahdollista, ratkaista yleisiä ohjelmointiongelmia. Peruskomentoja SQL:ssä ovat taulujen ja tietueiden lisääminen, haku ja poisto. Taulu Uuden taulun luominen tapahtuu komennolla CREATE TABLE table(col1 type1,col2 type2,... );. Luodaan esimerkkinä uusi taulu henkilökunta : >> CREATE TABLE henkilökunta >> (id INTEGER PRIMARY KEY, >> etunimi TEXT, >> sukunimi TEXT, >> työnimike TEXT, >> ikä INTEGER, >> huomautukset TEXT >> ); id etunimi sukunimi työnimike ikä huomautukset - - - - - - - - - - - - - - - - - - - - - - - - Taulukko 2: Uusi henkilökuntataulu Kokonaisen taulun voi poistaa komennolla DROP TABLE table;. Ole varovainen, sillä taulun poistaminen tuhoaa kaikki tauluun säilötyt tietueet. Mitään varmistuskysymyksiä SQL:ssä ei ole - kun komento on annettu, se suoritetaan. Tietue Tauluun lisätään uusi tietue komennolla INSERT INTO table VALUES(value1, value2,... );. Lisätään henkilökuntatauluun esimerkillinen luennoitsija: >> INSERT INTO henkilökunta >> VALUES(1,"Anna","Malli","Luennoitsija",35,"Esimerkillinen"); 7
Jos halutaan antaa arvo vain osaan kentistä, täytyy komennossa erikseen luetella, mihin sarakkeisiin tietoa ollaan laittamassa: >> INSERT INTO henkilökunta (etunimi,sukunimi,työnimike,ikä) >> VALUES("Vistor","Aalto","Tutkimusapulainen",20); id etunimi sukunimi työnimike ikä huomautukset 1 Anna Malli Luennoitsija 35 Esimerkillinen 2 Vistor Aalto Tutkimusapulainen 20 NULL - - - - - - - - - - - - Taulukko 3: Lisäysten jälkeen taulu näyttää tältä Tyhjäksi jätetyn kentän arvoksi tulee NULL eli tyhjä. Poikkeuksena on primääriavainkenttä, esimerkissämme id. Se on kenttä, johon tietokanta valitsee itse uniikin arvon, ellei sitä erikseen ole annettu. Avaimista kerrotaan myöhemmässä luvussa enemmän. Haku Tietokannasta hakeminen tehdään komennolla SELECT col1,col2,... FROM table WHERE conditions... ; Esimerkiksi seuraava komento hakisi kaikki tiedot henkilökuntataulusta: >> SELECT * FROM henkilökunta; 1 Anna Malli Luennoitsija 35 Esimerkillinen 2 Vistor Aalto Tutkimusapulainen 20 NULL SELECT FROM -lauseen ehdollisuuteen käyvät useimmat tavalliset operaattorit kuten =,< ja >. Luonnollisesti ehtoja voi myös yhdistellä AND ja OR -rakenteilla. Muista, että tekstivertailussa täytyy käyttää lainausmerkkejä. >> SELECT sukunimi,etunimi FROM henkilökunta WHERE ikä<25; Aalto Vistor >> SELECT sukunimi,etunimi FROM henkilökunta WHERE etunimi="anna"; Malli Anna >> SELECT * FROM henkilökunta WHERE sukunimi=työnimike; 8
Tekstin osaa voi hakea LIKE-rakenteella: >> SELECT * FROM henkilökunta WHERE sukunimi LIKE "v%"; 2 Vistor Aalto Tutkimusapulainen 20 NULL Haku toimii niin, että prosenttimerkin kohdalle voi korvata mitä vain. Annettu esimerkki siis hakee kaikki sukunimet, jotka alkavat v-kirjaimella. Hakukomennon perään voi liittää myös ORDER BY column käskyn, jolloin rivit palautuvat tietyn sarakkeen mukaan järjestettyinä. Poistokomento on hyvin samankaltainen kuin haku: DELETE FROM table WHERE conditions... ;. Muista aina olla varovainen poistoja kirjoittaessasi! Avain Tietokantataulussa primääriavain on tietotyyppi, joka on varmasti uniikki kaikilla taulun tietueilla. Esimerkiksi opiskelijanumero voisi toimia opiskelijataulun primääriavaimena. Usein tietokantataululla on kuitenkin primääriavaimena oma sisäinen id, joka ei tarkoita tietokannan ulkopuolella mitään. Avaimien avulla voidaan toteuttaa relaatioita tietueiden välillä. Taulun sarake voidaan määrätä niin, että sen arvot vastaavat saman tai toisen taulun saraketta, yleensä primääriavainta. id etunimi sukunimi työnimike esimies 1 Tuuli Metso 10 NULL 2 Anna Malli 11 1 3 Vistor Aalto 12 2 4 Tiina Niminen 12 2 - - - - - id nimi selvennys 10 Rehtori Johtaa ja suunnittelee 11 Luennoitsija Luennoi, opettaa, selittää 12 Tutkimusapulainen Tekee mitä käsketään Taulukko 4: Henkilökuntataulun työnimike on vierasavain, joka viittaa työnimike-tauluun Esimerkissämme Vistor ja Tiina ovat molemmat tutkimusapulaisia. Voisimme kirjoittaa työnimikkeen ja selvennyksen suoraan henkilökunta-taulun 9
alkioihin, mutta silloin joutuisimme kirjoittamaan työnimikkeen tiedot jokaiseen alkioon erikseen. Tehdään sen sijaan työnimike-sarakkeesta vierasavain: sarakkeeseen taltioidaan nyt numero, joka vastaa toisessa taulussa olevaa idsaraketta. Kun halutaan selvittää Vistorin työnimike, haetaan henkilökunta-taulusta Vistorin tietue ja luetaan työnimike = 10. Sitten haetaan työnimike-taulusta sellaista alkioita, jonka id = 10. Todetaan, että löydetyn tietueen nimi on tutkimusapulainen. Vastaavasti vierasavain voi viitata samaankin tauluun: esimies-sarakkeessa on luku, joka viittaa id-sarakkeeseen. Nähdään esimerkiksi, että Annan esimies = 1. Tietue, jossa id = 1, on Tuuli Metso. Tuuli on siis Annan esimies. Haku vierasavaimella Hakurakenteeseen voidaan lisätä lause JOIN. Sen avulla hakukoneelle kerrotaan, mitkä kentät vastaavat toisiaan. Koska nyt käsitellään eri taulujen sarakkeita, on paras kirjoittaa jokaisen sarakkeen nimen eteen myös taulun nimi: table.column. Näin hakukone varmasti tietää, minkä taulun sarakkeesta puhutaan. >> SELECT henkilökunta.etunimi,henkilökunta.sukunimi >> FROM henkilökunta >> JOIN työnimike ON työnimike.id = henkilökunta.työnimike >> WHERE työnimike.nimi="tutkimusapulainen"; Vistor Aalto Tiina Niminen Samaan tauluun viitatessa tarvitaan alias JOIN table alias, jotta viittauksen alku- ja loppupää erottuvat toisistaan. >> SELECT * FROM henkilökunta >> JOIN henkilökunta pomo ON pomo.id = henkilökunta.esimies >> WHERE pomo.etunimi = "Tuuli"; 2 Anna Malli 11 1 1 Tuuli Metso 10 Koska moni tietue voi viitata samaan kohteeseen, haku voi palauttaa joskus saman tietueen monta kertaa. Haetaan esimerkiksi kaikki henkilöt, joilla on alaisia. >> SELECT pomo.etunimi,pomo.sukunimi FROM henkilökunta >> JOIN henkilökunta pomo ON pomo.id = henkilökunta.esimies; Tuuli Metso Anna Malli Anna Malli 10
Jos haluat, että kukin alkio voi esiintyä vain kerran, kirjoita SELECT DIS- TINCT. JOIN-lauseita voi olla samassa käskyssä useita. Osaatko sanoa, mitä tämä komento hakee? >> SELECT DISTINCT etunimi,sukunimi >> FROM opiskelijat >> JOIN koulutusohjelmat >> ON opiskelijat.koulutusohjelma=koulutusohjelmat.id >> JOIN tapahtumailmo >> ON opiskelijat.opnro=tapahtumailmo.opnro >> JOIN tapahtumat >> ON tapahtumailmo.tapahtuma=tapahtumat.id >> WHERE koulutusohjelmat.tunnus="tik" AND tapahtumat.nimi="sitsit"; Matematiikka SQL-haussa SQL-hakukomennot ovat näppärä tapa laskea yksinkertaista matematiikkaa tietokannan tiedoilla. nimi hinta varastossa kpl myyty kpl polkupyörä 200 3 2 jakoavain 15 4 30 vatupassi 8 19 12 porakone 90 2 6 Taulukko 5: Hinnasto-taulu kaupan tietokannassa Sarakkeen arvojen summan saa haettua funktiolla SUM(): >> SELECT SUM(myyty_kpl) FROM hinnasto; 50 Vastaavalla tavalla voidaan hakea keskiarvo AVG(), rivien määrä COUNT(), minimiarvo MIN() tai maksimiarvo MAX(). Funktiovalintaan voi tietenkin lisätä myös ehtoja tutulla WHERE-lauseella: >> SELECT COUNT(*) FROM hinnasto where hinta<100; 3 Eri kenttien tiedoilla voi myös tehdä laskutoimituksia: 11
>> SELECT nimi,varastossa_kpl+myyty_kpl FROM hinnasto; polkupyörä 5 jakoavain 34 vatupassi 31 porakone 8 Jos on tarpeen tehdä jotakin monimutkaisempaa, SQL-käskyjä voi kirjoittaa useamman sisäkkäin: >> SELECT nimi FROM hinnasto >> WHERE myyty_kpl>(select avg(myyty_kpl) FROM hinnasto); jakoavain SQL-kutsut Python-ohjelmassa Tietokantojen sisältöä käsitellään usein hyvin suurissa määrissä, tai muusta syystä manuaalinen komentojen kirjoittelu ei ole mahdollista. Esimerkiksi Internetin palveluissa halutaan usein muuttaa käyttäjän tietueeseen viimeisin kirjautumisaika joka kerta kun tämä kirjoittaa salasanansa. Tietokantakutsuja täytyy siis voida automatisoida. Tällä kurssilla käytetään tietokantayhteyttä Pythonin ja SQLite-tietokannan välillä. Käytämme tietokantayhteyteen Python-kirjastoa sqlite3. Luodaan aluksi tietokantayhteys komennolla sqlite3.connect(filename). Yhteyden voi muodostaa oman koneen lisäksi myös Internetin yli toisessa koneessa olevaan tietokantaan. import sqlite3 conn = sqlite3.connect("tietokanta.db") Lisäksi tarvitaan tietokantakursori. Kursori tarkoittaa tässä yhteydessä sitä osaa ohjelmastasi, joka antaa tietokannalle käskyjä ja vastaanottaa siltä tietoa. c = conn.cursor() Tehdään SQL-komentoja c.execute()-metodilla: c.execute("select * FROM myyntitapahtumat") c.execute( INSERT INTO myyntitapahtumat VALUES(1.45,"14:40","Energiapatukka") ) 12
Kuten on helppo huomata, SQL-käskyt ovat aivan samanlaisia kuin suoraan tietokantaan annettuna. Jos halutaan kirjoittaa komentoja, jotka eivät ole vakiomuotoisia (eli halutaan käyttää Python-muuttujia komennoissa), kannattaa käyttää kysymysmerkkikorvausta: arvo = 5.00 aika = "16:07" nimi = "Lautanen" c.execute( INSERT INTO myyntitapahtumat VALUES(?,?,?),[arvo,aika,nimi]) Toisena argumenttina annetussa listassa olevat arvot korvaavat kysymysmerkit siinä järjestyksessä kuin ne on listassa annettu. SQL-komento on ennen suoritusta tavallista Python-tekstiä, joten muuttujat voisi korvata Pythonin tutulla.format()-metodilla. Tähän liittyy kuitenkin tietoturvariskejä, joten on parasta opetella käyttämään yllä kuvattua rakennetta. Jotta tehdyt muutokset tallentuisivat lopuksi, on ohjelman lopuksi vielä tallennettava muutokset ja suljettava yhteys (siinä järjestyksessä!): conn.commit() conn.close() Kun esimerkkiohjelma ajetaan, tietokantaan tulee kaksi uutta myyntitapahtumaa: >> SELECT * FROM myyntitapahtumat; 1.45 14:40 Energiapatukka 5.0 16:07 Lautanen 13