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 ja sen osat Kyselyn tulostiedot Kyselyn ehto-osa Kyselyn kohdetaulut Liitokset Tietokantojen perusteet, K2008 2
Tietokannan käsittely- ja ylläpito Relaatiotietokannoissa perustana relaatiomallin mukainen näkemys tietojen rakenteesta ja käsittelystä Käytännössä tietokantojen rakenteen määrittelyssä ja käsittelymahdollisuuksissa on paljon piirteitä, joihin abstrakti relaatiomalli ei ota kantaa Miten tietokantakaavio käytännössä esitetään? Millaista tietoa tietokantaan voi tallettaa? Miten esitetään tietokantaan kohdistuvat kyselyt? Miten tietokantaa ylläpidetään? Miten hallitaan tietokannan käyttöoikeuksia? Miten hallitaan samanaikaisia tietojen käyttöä? Miten kytketään ohjelmat tietokantaan? Tietokantojen perusteet, K2008 3
Tietokannan käsittely- ja ylläpito (2) Relaatioalgebra antaa teoriaperustan tietokantojen käsittelykielille Käsittelyn kannalta tarpeelliset operaatiot Tarvitaan siis käytännön kyselykieli tietokannan käsittelyä ja ylläpitoa varten käyttäjäystävällisyys Relaatiotietokantojen standardoitu käsittely- ja määrittelykieli on SQL-tietokantakieli Viimeisin standardi vuodelta 2003 Murteita, joilla kuitenkin yhteinen ydin Tietokantojen perusteet, K2008 4
SQL-tietokantakieli SQL-tietokantakielellä 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 tehdä päivityksiä tietokantaan (muuttaa dataa) vuorovaikutteisesti sovellusohjelman kautta Tietokantojen perusteet, K2008 5
SQL-tietokantakieli (2) SQL Määrittelykieli (DDL) käyttäjät ja oikeudet tietokannan rakenne tietokantaproseduurit Käsittelykieli (DML) kyselyt ylläpito-operaatiot Tietokantojen perusteet, K2008 6
SQL-tietokantakieli (3) SQL:llä käsiteltävä tietokanta muodostuu yhden tai useamman kaavion (schema) määrittelemistä tauluista (table) Kullakin kaaviolla on omistaja (=käyttäjätili), joka omistaa myös kaavion määrittelemät taulut Taulu muodostuu riveistä (row) Taulu vastaa relaatiomallin relaatiota, mutta sallii etenkin kyselyiden tuloksissa samanlaisen rivin toistumisen (duplikaatit) matemaattisesti monijoukko (multiset) Tietokantojen perusteet, K2008 7
SQL-tietokantakieli (4) SQL-kielessä avainsanat sekä taulu-, käyttäjä- ja sarakenimet voi kirjoittaa joko suur- tai pienaakkosina eli select merkki SELECT MerKKI Tietokannassa olevan datan suhteen kieli on kuitenkin herkkä kirjainmuodolle eli Merkki= Ford on eri asia kuin Merkki= FORD Joissain järjestelmissä tätä käyttäytymistä voidaan säätää asennusparametrein tai jopa kyselykohtaisesti Tietokantojen perusteet, K2008 8
SQL-tiedonmäärittelykieli Tietokannan käyttäjien, kaavioiden ja taulujen sekä niihin liittyvien oikeuksien määritteleminen ja hallinta Tarkasteltavia tietokantaelementtejä on useita: user, role, schema, table, domain, procedure, function, trigger, Tiedonmäärittelykielessä on lauseet eri tietokantaelementtien luontiin, muokkaukseen ja poistoon Create - luo Alter - muokkaa Drop poistaa Grant oikeuksien myöntäminen Revoke oikeuksien peruuttaminen Tietokantojen perusteet, K2008 9
Taulun määrittely SQL:ssä Lauseella create table määritellään taulun rakenne Lauseen yleisrakenne: create table tablename ( column definition 1,., column definition n [, constraint 1, ] ) Sarakkeen määrittely: column_name datatype [not null] [default value] [ column constraint ] Tietokantojen perusteet, K2008 10
Taulun määrittely SQL:ssä (2) create table Ordered ( OrderId integer not null, WhenMade timestamp(0) not null, Customer integer not null, WayIssued varchar(20), PaymentBy varchar(20) not null, TotalPrice decimal(6,2) not null, constraint pk_order primary key (OrderId), constraint fk_ordercustomer foreign key (Customer) references Customer ); Tietokantojen perusteet, K2008 11
Taulun määrittely SQL:ssä (3) create table Ordered ( ); OrderId integer not null, WhenMade timestamp(0) not null, Customer integer not null, WayIssued varchar(20), PaymentBy varchar(20) not null, TotalPrice decimal(6,2) not null, constraint pk_order primary key (OrderId), constraint fk_ordercustomer foreign key (Customer) references Customer kokonaisluku desimaaliluku, kokonaispituus 6, desimaaliosa 2 Tietokantojen perusteet, K2008 12 aikaleima, ei sekunnin osia vaihtuvamittainen merkkijono, maksimipituus 20
Taulun määrittely SQL:ssä (4) create table Ordered ( OrderId integer not null, WhenMade timestamp(0) not null, Customer integer not null, WayIssued varchar(20), PaymentBy varchar(20) not null, TotalPrice decimal(6,2) not null, constraint pk_order primary key (OrderId), constraint fk_ordercustomer foreign key (Customer) references Customer ); avain viiteavain pakollinen tieto Tietokantojen perusteet, K2008 13
Taulun määrittely SQL:ssä (5) Erilaisia aikatyyppejä Date päiväys Time[(x)] kellonaika Timestamp[(x)] päiväys ja kellonaika Interval aikaero Aikoja voidaan verrata ja niillä voi laskea Olkoon this_day date-tyyppinen, nyt this_day + interval 3 day on kolmen päivän päästä this_day:stä Huom: Harjoittelukannassa oleva date-tietotyyppi käyttäytyy kuten timestamp(0) Oraclen vanha tapa Tällöin päiväykseen voi lisätä aikaa desimaalilukuina, joissa kokonaisosa kertoo vuorokausien lukumäärän Esimerkiksi this_day+0.5 on 12 tunnin päästä this_day:stä Tietokantojen perusteet, K2008 14
Taulun määrittely SQL:ssä (6) Viiteavainmäärittelyyn voidaan liittää toimintasääntö: mitä tehdään operaation rikkoessa viite-eheyden foreign key (sarakkeet) references taulu [(sarakkeet2)] [ on delete {restrict cascade nullify} ] [ on update {restrict cascade nullify} ] Kun viitteen kohde katoaa: restrict estää rikkovan operaation (oletusarvo) cascade vyöryttää eli poistaa tai muuttaa viittaavat rivit nullify tyhjentää viittaukset Rajoitteen valinta sen perusteella, mikä on tarkoituksenmukaista Tietokantojen perusteet, K2008 15
SQL-kyselykieli Tietokannan sisältöön kohdistuva tiedonhaku Kyselyn yleisrakenne: select tulostietomäärittely from taulut [where valintaehdot] [group by ryhmitystekijät] [having ryhmärajoitteet] [order by järjestysperusta] Kysely tuottaa nimettömän tulostaulun Tietokantojen perusteet, K2008 16
SQL-kyselykieli (2) Esimerkkikysely Vuoden 1996 mallia olevien punaisten merkiltään Fo -alkuisten autojen merkki ja rekisterinumero merkin ja saman merkin sisällä rekisterinumeron mukaan järjestettynä Tämä kysely SQL:llä select merkki, reknro from auto where vmalli=1996 and vari ='punainen' and merkki like 'Fo%' order by merkki, reknro; Tietokantojen perusteet, K2008 17
SQL-kyselyn tulostiedot Esimerkkikysely Vuoden 1996 mallia olevien punaisten merkiltään Fo -alkuisten autojen merkki ja rekisterinumero merkin ja saman merkin sisällä rekisterinumeron mukaan järjestettynä Tämä kysely SQL:llä select merkki, reknro from auto where vmalli=1996 and vari ='punainen' and merkki like 'Fo%' order by merkki, reknro; melkein projektio valinta Tietokantojen perusteet, K2008 18
SQL-kyselyn tulostiedot (2) Tulostietoihin normaalitapauksessa arvo jokaista valintaehdot täyttävää riviä (riviyhdistelmää) kohden Siksi, jos taulussa auto olisi 100 punaista vuoden 1996 Fordia, kyselyn select merkki from auto where vmalli=1996 and vari ='punainen' and merkki like 'Fo%' order by merkki; tulostauluun tulisi merkki Ford 100 kertaa. Ylläolevan kaltainen SQL-kysely siis toimii toisin kuin relaatioalgebran projektio, joka poistaa tuplat Tietokantojen perusteet, K2008 19
SQL -kyselyn tulostiedot (3) Projektion kaltainen toistuvien arvojen karsinta: liitetään tulostietomäärittelyn alkuun avainsana distinct Kyselyn select distinct merkki from auto where vmalli=1996 and vari ='punainen' and merkki like 'Fo%' order by merkki; tulostauluun Ford tulisi siis vain kerran Tietokantojen perusteet, K2008 20
SQL-kyselyn tulostiedot (4) Tietotyypistä riippuen sarakearvoilla voi tulostietomäärittelyissä ja ehdoissa suorittaa laskentaoperaatioita (+,-,*,/) pituus*paino merkkijonoille katenaatio ( ) eli peräkkäin laittaminen etunimi sukunimi Merkkijonovakiot hipsuihin, numeeriset ilman Päiväykset muodossa date 2005-11-24 Käytettävissä erilaisia yhteenvetofunktioita On mahdollista käyttää myös skalaarifunktioita esim. merkkijonon pituus length(sarake) funktiovalikoima vaihtelee Tietokantojen perusteet, K2008 21
SQL-kyselyn ehto-osa Kyselyn ehto-osassa voidaan verrata saraketta, vakiota, funktion arvoa tai lausekkeen arvoa sarakkeeseen, vakioon, funktion arvoon, lausekkeen arvoon, arvojoukkoon tai maskiin. Ehto-osassa voidaan myös tutkia sarakkeen tyhjyyttä Jos vertailun toisena osapuolena on tyhjäarvo, on tulos tuntematon. Rivi tulee valituksi tulokseen vain, jos ehdon arvo on tosi (true). Tietokantojen perusteet, K2008 22
SQL-kyselyn ehto-osa (2) Totuusarvot tosi (true) ja epätosi (false) käyttäytyvät loogisissa lausekkeissa kuten ohjelmointikielten yhteydessä Kolmas totuusarvo tuntematon käyttäytyy seuraavasti Loogisen operaattorin AND yhteydessä: AND true false unknown true true false unknown false false false false unknown unknown false unknown Tietokantojen perusteet, K2008 23
SQL-kyselyn ehto-osa (3) Kolmas totuusarvo tuntematon käyttäytyy seuraavasti Loogisen operaattorin OR yhteydessä: OR true false unknown true true true true false true false unknown unknown true unknown unknown Loogisen operaattorin NOT yhteydessä: NOT true false unknown false true unknown Tietokantojen perusteet, K2008 24
SQL-kyselyn ehto-osa (4) Tyhjäarvot ehto-osassa tuottavat seuraavanlaisia tuloksia: Sarake is null: tuottaa tuloksen true, jos sarakkeessa on tyhjäarvo muuten false Sarake is not null: tuottaa tuloksen false, jos sarakkeessa on tyhjäarvo muuten true Sarake = null: tuottaa aina tuloksen unknown Tietokantojen perusteet, K2008 25
SQL-kyselyt: esimerkkitietokanta opettaja opetunnus nimi puhelin tyohuone harjoitusryhma kurssikoodi ryhmanro viikonpaiva alkamisaika sali opettaja ilmoittautuminen kurssikoodi ryhmanro opisknro ilm_aika kurssi koodi nimi opintoviikot luennoija opiskelija onumero nimi paa_aine kaupunki aloitusvuosi Tietokantojen perusteet, K2008 26
Opettajien nimet: SQL-kyselyt esimerkkitietokantaan select nimi from opettaja; Opiskelijoiden pääaineet select distinct paa_aine from opiskelija; Tietojenkäsittelytieteen pääaineopiskelijoiden nimet select nimi from opiskelija where paa_aine = TKT ; Espoossa asuvat matematiikan opiskelijat select * from opiskelija where paa_aine= MAT and kaupunki= Espoo ; Tietokantojen perusteet, K2008 27
SQL-kyselyt esimerkkitietokantaan (2) Opiskelijat, joiden sukunimi on Tele select * from opiskelija where nimi like Tele % ; Huom! esimerkkitaulussa nimet ovat muodossa sukunimi+ space +etunimi Opiskelijat, joiden etunimi alkaa L:llä select * from opiskelija where nimi like % L% ; Tietokantojen perusteet, K2008 28
SQL-kyselyn kohdetaulut Kyselyn from-osassa yksi tai useampi taulu (tai alikysely) Jos tauluja on vain yksi, on kyseessä valinta Jos tauluja on monta, on kyseessä ristitulo, ellei ehtoosassa ole liitosehtoa Tulokseksi halutaan hyvin harvoin ristitulo Jos tauluja on monta ja ehto-osassa on liitosehto, on kyseessä liitos Muista siis liitosehto! Tietokantojen perusteet, K2008 29
Liitokset SQL:ssä Kyselyn from-osassa voi olla useita tauluja Kaikki ne taulut, joiden dataa halutaan mukaan tulokseen, on annettava from-osassa Esimerkiksi Arto Wiklan luennoimat kurssit select kurssi.nimi from kurssi, opettaja where opettaja.nimi= Arto Wikla and kurssi.luennoija=opettaja.opetunnus; täytyy täsmentää, koska samanniminen sarake molemmissa taulussa liitosehto Tietokantojen perusteet, K2008 30
Liitokset SQL:ssä (2) Tauluille voidaan from-osassa antaa tilapäinen kyselyn sisäinen nimi (alias, correlation name) SQL-ilmaus: from taulu [AS] alias AS ei käy Oraclessa Liitettävillä tauluilla on usein samannimisiä sarakkeita, joten taulunimeä on käytettävä tarkenteena alias voi olla lyhenne, joka vähentää kirjoitusvaivaa Tietokantojen perusteet, K2008 31
Liitokset SQL:ssä (3) Jos sama taulu esiintyy from-osassa useaan kertaan, on taulun esiintymät erotettava käyttämällä aliasta Esimerkiksi kyselyssä, jolla etsitään kurssiparit, joilla on sama luennoija, eli kyselyssä select A.nimi, B.nimi from kurssi A, kurssi B where A.luennoija=B.luennoija and A.koodi<B.koodi order by A.nimi, B.nimi; ehto A.koodi<B.koodi estää saman parin toistumisen eri järjestyksissä Tietokantojen perusteet, K2008 32
Liitokset SQL:ssä (4) Tyypillinen virhe liitoksissa on jättää jokin liitosehto pois Seuraus: tuloksen rivijoukko tulee huomattavasti suuremmaksi kuin pitäisi Karkea muistisääntö: Jos from-osassa on n kpl liitettäviä tauluja, tarvitaan vähintään n-1 liitosehtoa. Huom! Taulujen liittäminen voi perustua useaan sarakkeeseen, jolloin ehtolausekkeessa tarvittavien alkeisehtojen määrä voi moninkertaistua. Tietokantojen perusteet, K2008 33
Liitokset SQL:ssä (5) Yleensä kyselyt rakentuvat siten, että niissä on jokin keskeinen taulu, johon muita liitetään Voi olla, ettei tuosta keskeisestä taulusta tule mitään dataa tulokseksi liitokset keskeinen taulu Tietokantojen perusteet, K2008 34
Liitokset esimerkkitietokannassa Esimerkki liitoskyselystä kurssitietokannassa: laadi raportti kurssin Java-ohjelmointi harjoitusryhmistä Mitä tietoja halutaan tulokseen: ryhmän numero (taulussa harjoitusryhmä) ohjaajan nimi (taulussa opettaja) kokoontumispäivä (taulussa harjoitusryhmä) alkamisaika (taulussa harjoitusryhmä) opiskelijan nimi (taulussa opiskelija) Tietokantojen perusteet, K2008 35
Liitokset esimerkkitietokannassa (2) Mistä tauluista tarvitaan tietoja? Taulut opettaja, harjoitusryhmä ja opiskelija on välttämättä otettava kyselyn from-osaan Taulu ilmoittautuminen tarvitaan opiskelijoiden kytkemiseksi ryhmiin Taulu kurssi tarvitaan, jotta saataisiin selville Java-ohjelmoinnin kurssikoodi Tietokantojen perusteet, K2008 36
Liitokset esimerkkitietokannassa (3) opettaja opetunnus nimi puhelin tyohuone harjoitusryhma kurssikoodi ryhmanro viikonpaiva alkamisaika sali opettaja ilmoittautuminen kurssikoodi ryhmanro opisknro ilm_aika kurssi koodi nimi opintoviikot luennoija opiskelija onumero nimi paa_aine kaupunki aloitusvuosi Tietokantojen perusteet, K2008 37
Liitokset esimerkkitietokannassa (4) opettaja opetunnus nimi puhelin tyohuone harjoitusryhma kurssikoodi kurssi koodi ryhmanro nimi opetunnus= viikonpaiva opintoviikot opettaja alkamisaika kurssikoodi= luennoija sali koodi opettaja opiskelija ilmoittautuminen onumero kurssikoodi= kurssikoodi nimi kurssikoodi and ryhmanro paa_aine ryhmanro= opisknro ryhmänro kaupunki ilm_aika opisknro= aloitusvuosi onumero Tietokantojen perusteet, K2008 38
Liitokset esimerkkitietokannassa (5) select H.ryhmanro rno, Ope.nimi ope, H.viikonpaiva, H.alkamisaika, O. Nimi opiskelija from harjoitusryhma H, opettaja Ope, opiskelija O, ilmoittautuminen I, kurssi K where H.kurssikoodi=K.koodi and I.kurssikoodi=H.kurssikoodi and I.ryhmanro=H.ryhmanro and Ope.Opetunnus=H.Opettaja and I.Opisknro=O.onumero and K.nimi= Java-ohjelmointi order by H.ryhmanro, O.nimi; Tietokantojen perusteet, K2008 39