Helsingin yliopisto, tktl DO Tietokantojen perusteet, kevät 2000 SQL- osa Harri Laine 1. SQL-yhteenvetofunktiot. SQL-yhteenvetofunktiot

Samankaltaiset tiedostot
Helsingin yliopisto, tktl DO Tietokantojen perusteet, kevät 2000 SQL- osa Harri Laine 1. SQL-yhteenvetofunktiot. SQL-yhteenvetofunktiot

Tietokantojen perusteet, syksy 1999 SQL- osa Harri Laine 1. SQL-yhteenvetofunktiot. SQL-yhteenvetofunktiot

Insert lauseella on kaksi muotoa: insert into taulu [(sarakenimet)] values (arvot)

Kyselyn yleisrakenne:

select tulostietomäärittely from taulukkeet [where valintaehdot] [group by ryhmitystekijät] [having ryhmärajoitteet] [order by järjestysperusta]

Harjoitustehtävä 1. Harjoitustehtävä 2. Harjoitustehtävä 2. Harjoitustehtävä 2. Harjoitustehtävä 2. SQL kysely

SQL - Tietokannan ylläpito. SQL - Tietokannan ylläpito. SQL - Tietokannan ylläpito. SQL - Tietokannan ylläpito. SQL - Tietokannan ylläpito

Tietokantojen perusteet, syksy 1999 SQL- osa Harri Laine 1. SQL-valintaehto. SQL-valintaehto. Opettajien nimet: Opiskelijoiden pääaineet

Helsingin yliopisto, TKTL Tietokantojen perusteet, k 2000 SQL- osa Harri Laine 1. SQL-valintaehto. SQL-valintaehto.

SQL-perusteet, SELECT-, INSERT-, CREATE-lauseet

SQL - STRUCTURED QUERY LANGUAGE

SELECT-lauseen perusmuoto

TIEDONHALLINTA - SYKSY Luento 11. Hannu Markkanen /10/12 Helsinki Metropolia University of Applied Sciences

TIEDONHALLINTA - SYKSY Luento 10. Hannu Markkanen /10/12 Helsinki Metropolia University of Applied Sciences

määritellä ja muokata tietokantaa ja sen käyttöoikeuksia virittää tietokannan talletusrakenteita hakea tietoa tietokannasta

määritellä ja muokata tietokantaa ja sen käyttöoikeuksia virittää tietokannan talletusrakenteita hakea tietoa tietokannasta

4.3.4 SQL kyselyt... 45

Helsingin yliopisto/tktl Tietokantojen perusteet, s 2007 SQL:n perusteet. Harri Laine 1. SQL tietokantakieli. SQL tietokantakieli

HAAGA-HELIA Heti-09 1 (12) ICT05 Tiedonhallinta ja Tietokannat O.Virkki Näkymät

HELIA TIKO-05 1 (17) ICT03D Tieto ja tiedon varastointi Räty, Virkki

Tietokantojen perusteet k2004helsingin yliopisto/tktl Tietokantojen perusteet, s 2005 SQL-perusteet. Harri Laine 1. SQL tietokantakieli

TIEDONHALLINTA - SYKSY Luento 8. Saapumisryhmä: Pasi Ranne /9/13 Helsinki Metropolia University of Applied Sciences

SQL-kielen perusteet. Tietokantojen perusteet

HELIA 1 (14) Outi Virkki Tiedonhallinta

Helsingin yliopisto Tietojenkäsittelytieteen laitos (H.Laine) Tietokantojen perusteet. Liitteenä: Tiivistelmä SQL-syntaksista

HELIA 1 (14) Outi Virkki Tiedonhallinta

Relaation tyhjyyden testaaminen

Kirjasto Relaatiotietokannat Kevät Auvinen Annemari Niemi Anu Passoja Jonna Pulli Jari Tersa Tiina

Tällä viikolla. Kotitehtävien läpikäynti Aloitetaan Pelifirman tietovaraston suunnittelu Jatketaan SQL-harjoituksia

Yhteenvetofunktiot Näkymät Tietokannan ylläpito Tietokantatapahtumat... 88

TIETOKANTOJEN PERUSTEET MARKKU SUNI

FROM-lausekkeessa voidaan määritellä useampi kuin yksi taulu, josta tietoja haetaan: Tuloksena on taululistassa lueteltujen taulujen rivien

5 SQL TIETOKANTAKIELI...33

SQL. ! nykystandardi SQL3 eli SQL'99. ! CREATE TABLE, ALTER TABLE ja DROP TABLE. ! CREATE VIEW ja DROP VIEW. ! CREATE INDEX ja DROP INDEX

Hakukyselyt: SELECT * FROM taulu WHERE sarake1 = Malli Nimi [WHERE sarake1 LIKE M% ] [WHERE BETWEEN ehto1 AND ehto2] [WHERE sarake1 IN/= (alikysely)]

CSE-A1200 Tietokannat

Koostefunktiot. Viisi standardifunktiota: Esim. montako henkilöä on henkilo-taulussa:

Tietokantojen perusteet, s 1999 SQL- osa Harri Laine 1. SQL -ohjelmistojen markkinaosuuksia SQL. SQL - historiaa. SQL - standardointi

Helsingin yliopisto, Tietojenkäsittelytieteen laitos Tietokantojen perusteet, , H.Laine

HELIA TIKO-05 1 (22) ICT03D Tieto ja tiedon varastointi E.Räty, O.Virkki

Liitokset - haut useaan tauluun

CSE-A1200 Tietokannat

HELIA 1 (15) Outi Virkki Tietokantasuunnittelu

Kirjoita kuhunkin erilliseen vastauspaperiin kurssin nimi, tentin päiväys, oma nimesi, syntymäaikasi ja nimikirjoituksesi.

HELIA 1 (11) Outi Virkki Tiedonhallinta

Kirjoita jokaiseen erilliseen vastauspaperiin kurssin nimi, tenttipäivä, oma nimesi (selkeästi), opiskelijanumerosi ja nimikirjoituksesi

TIETOKANTOJEN PERUSTEET OSIO 11 MARKKU SUNI

Näkymät ja tiedon suojaus

CS-A1150 Tietokannat CS-A1150 Tietokannat / 43

Tietokannat II -kurssin harjoitustyö

Tietokannat. CREATE TABLE table(col1,col2,... ); Luo uuden taulun. CREATE TABLE opiskelijat(opnumero,etunimi,sukunimi);

SQL:N PERUSTEET MARKKU SUNI

Tietokantakurssit / TKTL

Tietokannat II -kurssin harjoitustyö

CS-A1150 Tietokannat CS-A1150 Tietokannat / 44

HELIA 1 (15) Outi Virkki Tietokantasuunnittelu

Muita tietokantaobjekteja. Näkymät, synonyymit, indeksointi, valtuudet ja systeemihakemisto

MUITA TIETOKANTAOBJEKTEJA NÄKYMÄT, SYNONYYMIT, INDEKSOINTI, VALTUUDET JA SYSTEEMIHAKEMISTO

Tiedonhallinnan perusteet. H11 Ovien ja kulun valvontajärjestelmän tietokanta

Tietokannat. CREATE TABLE table(col1,col2,... ); Luo uuden taulun. CREATE TABLE opiskelijat(opnumero,etunimi,sukunimi);

TIETOKANTOJEN PERUSTEET OSIO 14 MARKKU SUNI

3. Taulujen määrittely ja muuttaminen

Opiskeluoikeuksien maaran tiedonkeruu

Opettajana Mika Sorsa, HAMK:n ammatillisen opettajakoulutuksen opetusharjoittelija

4.3.1 SQL tietokanta SQL:n kirjoitusasu SQL määrittelykielenä... 36

KOOSTEFUNKTIOT. Viisi standardifunktiota: Esim. montako henkilöä on henkilo-taulussa:

3. TAULUJEN MÄÄRITTELY JA MUUTTAMINEN

Proseduurit, 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 K2009

Tiedonhallinnan perusteet. Viikko 1 Jukka Lähetkangas

Harjoitustehtävä 1. Harjoitustehtävän 1 ratkaisu. Harjoitustehtävä 1. Relaatioalgebra -liitokset (join) Liitos

Relaatioalgebra. Kyselyt:

HELIA 1 (13) Outi Virkki Tietokantasuunnittelu

OUTER JOIN se vanha kunnon kaveri

TIEDONHALLINNAN PERUSTEET - SYKSY 2013

1 YLEISTÄ (KS) SQL-TRAINER - KUVAUS NYKYISESTÄ JÄRJESTELMÄSTÄ (HL,KS) JATKOKEHITYKSEN VAATIMUKSET (HL,KS)...7

4.1 Yleistä SQL:stä 4.2 SQL-lauseet 4.3 DML: datan hallinta 4.4 DDL: rakenteen määrittäminen 4.5 DCL: valtuuttaminen 4.6 TxCL: tapahtumanhallinta

Tehtävä 1. Tietojen lisääminen, poistaminen, päivittäminen ja tulostaminen

HELIA TIKO-05 1 (15) ICT03D Tieto ja tiedon varastointi Räty, Virkki

Tietokannat. CREATE TABLE table(col1,col2,... ); Luo uuden taulun. CREATE TABLE opiskelijat(opnumero,etunimi,sukunimi);

2. Haet työntekijöiden tiedot etunimen mukaan nousevasti järjestettyinä. (ORDER BY) SELECT * FROM employees ORDER BY firstname ASC;

Relaatioalgebra. Relaatioalgebra. Relaatioalgebra. Relaatioalgebra - erotus (set difference) Kyselyt:

TIETOKANNAT: MYSQL & POSTGRESQL Seminaarityö

Java ja tietokannan käsittely (JDBC)

Makrojen mystinen maailma lyhyt oppimäärä

Opintopiiritehtävä 3: Verkkohuutokauppa

Helsingin yliopisto/tktl Kyselykielet, s 2006 Optimointi Harri Laine 1. Kyselyn optimointi. Kyselyn optimointi

Tietokantojen suunnittelu, relaatiokantojen perusteita

Denormalisointia turvallisesti. Ougf syysseminaari Pörssitalo Helsinki Timo Raitalaakso

Ohjelmistojen mallintamisen ja tietokantojen perusteiden yhteys

Kyselyt: Lähtökohtana joukko lukuja Laskukaava kertoo miten luvuista lasketaan tulos soveltamalla laskentaoperaatioita

Tuotteiden tiedot: Lisää uuden tuotteen tiedot. Muuta tai poista tuotteen tiedot. Selaa kaikkien tuotteiden tietoja.

Harjoituksen aiheena on tietokantapalvelimen asentaminen ja testaaminen. Asennetaan MySQL-tietokanta. Hieman linkkejä:

Treenitietokannan suunnitteludokumentti

HSMT Tietokannoista. Ville Leppänen. HSMT, c Ville Leppänen, IT, Turun yliopisto, 2008 p.1/32

Yleinen SQL. Yleinen SQL. SQL:n kehitys

INSERT INTO koulutus VALUES ( Helsinki, 22.6, 4);

Joko tunnet nämän Oracle10g SQL:n piirteet? Kari Aalto Saariston IT

Samanaikaisuuden hallinta. Optiot transaktionaalisissa työnkuluissa

17 BUDJETOINTI. Asiakaskohtainen Budjetti Ylläpito-ohjelma. Dafo Versio 10 BUDJETOINTI. Käyttöohje. BudgCust Yleistä

Transkriptio:

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 käytettäessä tulosriviä ei muodostetakaan jokaisesta valintaehdon täyttävästä riviyhdistelmästä vaan ellei ryhmittelyä ole määritelty muodostetaan yksi tulosrivi koko aineistosta Opiskelijoiden lukumäärä: select count(*) from opiskelija; Count:n parametrina voisi käyttää myös mitä tahansa vakiota, tulos olisi sama eli rivien lukumäärä select count(1) from opiskelija; Jos parametrina annetaan sarake saadaan siinä olevien ei-tyhjien arvojen määrä select count(onumero) from opiskelija; Milloin opiskeluajaltaan vanhin Helsinkiläinen opiskelija on aloittanut opintonsa? select min(aloitusvuosi) from opiskelija where kaupunki= Helsinki ; Keskiarvoa, summaa, minimiä ja maksimia laskettaessa tyhjäarvot jätetään huomioimatta Keskimääräinen opintoviikkomäärä select avg(opintoviikot) from kurssi; Keskiarvoa ja summaa laskettaessa on yleensä syytä ottaa mukaan kaikki sarakkeen arvot Lukumääriä laskettaessa voi erilaisten arvojen laskeminenkin tulla kyseeseen Monellako eri paikkakunnalla opiskelijat asuvat? select count(distinct kaupunki) from opiskelija; Yhteenvetofuntion sisältävään kyselyyn ei saa mukaan dataa niiltä yksittäisiltä riveiltä, joilta funktio lasketaan Minkä kurssien opintoviikkomäärä on suurin? EI siis ole mahdollista: select nimi, max(opintoviikot) from kurssi; yksityiskohta Select nimi, opintoviikot from kurssi where opintoviikot>= ALL (select opintoviikot from kurssi); antaa oikean vastauksen Seuraavan pitäisi myös toimia: select nimi,maksi (select max(opintoviikot) maksi from kurssi) as m where opintoviikot =maksi; alikysely Harri Laine 1

Jos kyselyyn liitetään ryhmittelymääre (Group by) muuttuu tuolosrivien muodostusperiaate jälleen: muodostetaankin yksi tulosrivi kutakin ryhmää kohti group by määreessä luetellaan sarakkeet, joiden perusteella ryhmittely tehdään kaikki ne rivit, joilla on sama arvo luetelluissa sarakkeissa muodostavat ryhmän ryhmät muodostetaan sen jälkeen kun on ensin sovellettu where-ehtoa rivien karsintaan. Group by A Taulu X A B C D 1 4 6 7 1 1 4 2 1 5 5 2 2 4 8 7 2 3 5 1 3 1 5 2 3 2 4 6 Ryhmä a=1 Ryhmä a=2 Select A, sum(b) from X group by A; A B 1 10 2 7 3 3 Group by -lausetta käytettäessä tulostietoluettelossa voi olla yhteenvetofunktioiden lisäksi vain niitä sarakkeita, jotka esiintyvät group by -lauseessa. (kaikkien ei tarvitse olla mukana, mutta yleensä ne ovat) Kurssien harjoitusryhmiin ilmoittautuneiden opiskelijoiden lukumäärät ilmoittautuminen where ilmoittautuminen.kurssikoodi= kurssi.koodi ; Ongelma: tyhjät ryhmät eivät tule mukaan! Miksi? ilmoittautuminen union (select nimi, ryhmanro, 0 harjoitusryhma H, where koodi=h.kurssikoodi and (koodi,h.ryhmanro) not in (select kurssikoodi, ryhmanro )); tuottaa tyhjätkin - Miksi näin monimutkaista? kurssi 1132 1133 1135 Pariton putoaa ilmoittautuminen 1132 1 A 1132 1 B 1132 2 C 1135 1 D 1135 1 E 1135 1 F Ryhmät näiden where-ehdon täyttävien perusteella Harri Laine 2

Ulkoliitosta käyttäen kysely onnistuisi myös select nimi, h.ryhmanro, count(distinct opisknro) 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 tässä ei voi käyttää count(*) koska tyhjästäkin ryhmästä tulee rivi Ryhmäkohtaisen rivin mukaanottamista tulokseen voidaan rajoittaa having määreellä. Having-ehto kuten where-ehto, mutta se perustuu ryhmäkohtaisesti lasketun yhteenvetofunktion arvoon Ryhmät, joihin on ilmoittautunut yli 20 opiskelijaa ilmoittautuminen having count(*) >20; Ryhmät muodostetaan aina where-ehdon soveltamisen jälkeen Käytännössä ryhmien muodostaminen tarkoittaa tulostaulun järjestämistä ryhmitysattribuuttien perusteella Order by -järjestäminen suoritetaan viimeiseksi Harjoitusryhmät ilmoittautumismäärän mukaan laskevassa järjestyksessä ilmoittautuminen order by count(*) desc; Millä kurseilla on suurin keskimääräinen ryhmäkoko select nimi, H.ryhmanro, max(avg(count(*))) harjoitusryhma H, ilmoittautuminen I where koodi=h.kurssikoodi and H.kurssikoodi=I.kurssikoodi and H.ryhmanro=I.ryhmanro group by nimi, H.ryhmanro * Ajettuna Oraclessa: VIRHE rivillä 1: ORA-00937: tämä ei ole yhden ryhmän koostefunktio YHTEENVETOFUNKTIOITA EI VOI KETJUTTAA Harri Laine 3

Kurssin ryhmien koot (vain ei-tyhjät ryhmät) select kurssikoodi,ryhmanro,count(*) lkm group by kurssikoodi, ryhmanro tuotaa testikannassa: KURSSIKOODI RYHMANRO LKM ----------- ----------------- ---------- 1134 1 6 1134 2 4 1134 3 3 1135 1 6 1135 2 5 1135 3 2 1136 1 6 1137 1 5 Kurssien keskimääräiset ryhmäkoot select koodi, nimi, avg(lkm) (select kurssikoodi,ryhmanro,count(*) lkm group by kurssikoodi, ryhmanro) A where koodi= A.kurssikoodi group by koodi, nimi alikysely Testikannasta ed. kysely tuo tuloksen KOODI NIMI AVG(LKM) ---------- ------------------------- ---------- 1134 Informaatiojärjestelmät 4,33333333 1135 Java ohjelmointi 4,33333333 1136 Oliotietokannat 6 1137 Tietorakenteet 5 select koodi, nimi, avg(lkm) (select kurssikoodi,ryhmanro,count(*) lkm group by kurssikoodi, ryhmanro) A where koodi= A.kurssikoodi group by koodi, nimi having avg(lkm)>= ALL (select avg(lkm) (select kurssikoodi,ryhmanro,count(*) lkm group by kurssikoodi, ryhmanro) A where koodi= A.kurssikoodi group by koodi) Edellinen kysely Tulos samasta testikannasta KOODI NIMI AVG(LKM) ----- ------------------------------ ---------- 1136 Oliotietokannat 6 select avg(lkm) (select kurssikoodi,ryhmanro,count(*) lkm group by kurssikoodi, ryhmanro) A where koodi= A.kurssikoodi group by koodi tulos tästä on AVG(LKM) ---------- 4,33333333 4,33333333 6 5 Ryhmitysperuste koodi ei ole mukana tuloksessa Harri Laine 4

Huom. edelliset kyselyt toimivat täysin oikein vain, jos kaikkiin ryhmiin on ilmoittautuneita, sillä tyhjät ryhmät putoavat pois jo ilmoittautujalukumäärien laskennasta. Kovin monimutkaisia kyselyjä, kuten edellinen, voi helpottaa käyttämällä näkymiä (views) eli johdettuja tauluja Näkymä on kyselyn avulla määritelty taulu. Määrittely: create view taulunimi [(sarakkeet)] as kysely; sarakkeet on luettelo sarakenimiä jos luettelo on mukana, siinä täytyy olla yhtä monta nimeä kuin kyselyssä tulossarakkeita jos luettelo puuttuu, sarakkeet nimetään kyselyn mukaisesti Esim. Create view tyhja_ryhma (kurssikoodi, nimi, ryhmanro) as select kurssikoodi, nimi, ryhmanro harjoitusryhma where koodi= kurssikoodi and (kurssikoodi, ryhmanro) not in (select kurssikoodi, ryhmanro ) Data näkymään saadaan muista tauluista. Näkymän tietoja ei tallenneta kantaan. Kyselyn kohdistuessa näkymään järjestelmä muokkaaa kyselyä siten, että se kohdistuukin näkymän määrittelevässä kyselyssä oleviin tauluihin. Esim. Select * from tyhja_ryhma aiheuttaisi sen määrittelevän kyselyn suorituksen Miksi näkymiä: suojaussyyt käyttäjälle voidaan antaa käyttöoikeus näkymään perustaulun asemesta näin voidaan rajoittaa oikeus esim. vain joihinkin riveihin Oletetaan että opetunnus on opettajan käyttäjätunnus Funktio user antakoon kulloisenkin käyttäjän tunnuksen. Määritellään näkymä: create view oma_kurssi as select * from kurssi where luennoija=user; voidaan määritellä grant select, update on oma_kurssi to public vaikka kuka tahansa voi tehdä kyselyjä näkymään perustuen on taulu tyhjä muille kuin luennoijille Kyselyjen yksinkertaistaminen: piilotetaan monimutkaisuus näkymämäärittelyyn Aiemmin esillä ollut kysely ryhmien ilmoittautujamäärät voitaisiin tyhja-ryhma -näkymää käyttäen esittää: ilmoittautuminen union (select nimi, ryhmanro, 0 from tyhja_ryhma) Harri Laine 5

Edelläolevan voisi määritellä näkymäksi, jolloin kyselyjen teko on jatkossa todella helppoa create view ryhmäkoko (nimi, ryhma, lkm) as ilmoittautuminen union (select nimi, ryhmanro, 0 from tyhja_ryhma); Tietoriippumattomuus Kun ohjelman tietokantaoperaatiot perustuvat näkymiin voidaan tietokannan rakennetta muuttaa, eikä ohjelmaan tarvitse koskea lainkaan - muutetaan vain näkymämäärittelyä siten, että aiemman kaltainen näkymä saadaan myös muuttuneesta kannasta select * from ryhmakoko; Näkymiä voi käyttää kyselyissä kuten tauluja. Myös tietokannan ylläpito näkymien kautta on rajoitetusti mahdollista. 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 taulu [(sarakenimet)] values (arvot) tällä muodolla lisätään yksi rivi ja arvot annetaan vakioina tai vakioihin perustuvina lausekkeina insert into taulu [(sarakenimet)] kysely tällä muodolla kyselyn tulosrivit lisätään tauluun CREATE TABLE kurssi ( koodi numeric(8) NOT NULL, nimi varchar(40) NOT NULL, opintoviikot numeric(5,1) NOT NULL, luennoija varchar(12) NOT NULL, PRIMARY KEY (koodi ), FOREIGN KEY (luennoija) REFERENCES opettaja) insert into kurssi values (1234, Tietokantojen perusteet,2, HLAINE ); lisää tauluun kokonaisen rivin Harri Laine 6

Jos luennoijaa ei tiedetä voidaan lisäys tehdä seuraavasti: Jos luennoijan tunnusta ei tiedetä, voitaisiin lisäys tehdä seuraavasti: insert into kurssi values (1234, Tietokantojen perusteet,2,null); tai insert into kurssi (koodi, nimi, opintoviikot) values (1234, Tietokantojen perusteet,2); sarakeluetteloa käytetään siis silloin kun annetaan vain osa sarakkeista insert into kurssi select (1234, Tietokantojen perusteet, 2,opetunnus) from opettaja where nimi= Laine Harri ; Tämä toimii odotetusti, jos kannassa on vain yksi tämän niminen opettaja, muuten lisäys kaatuu avaimen yksikäsitteisyysvirheeseen, sillä lisäys epäonnistuu, jos se rikkoo eheysehtoja Kurssille Ohjelmoinnin perusteet ilmoittautuneiden opiskelijoiden siirto kurssin Java-ohjelmointi vastaaviin ryhmiin: CREATE TABLE ilmoittautuminen ( kurssikoodi numeric(8) not null, ryhmanro numeric(2) not null, opisknro numeric(5) NOT NULL, ilm_aika date NOT NULL, PRIMARY KEY (opisknro, kurssikoodi), FOREIGN KEY (kurssikoodi, ryhmanro) REFERENCES harjoitusryhma on delete cascade, FOREIGN KEY (opisknro) REFERENCES opiskelija ) Oracle-SQL:llä Insert into ilmoittautuminen select java.kurssikoodi, ryhmanro, opisknro, sysdate from kurssi java, kurssi ohpe, ilmoittautuminen where java.nimi= Java-ohjelmointi and ohpe.nimi= Ohjelmoinnin perusteet and ohpe.koodi=ilmoittautuminen.kurssikoodi; Rivien muutokset (update) update taulu set sarake1=lauseke1 [, ] [where kohteen rajausehdot] samalla kertaa voi muttaa useita sarakkeita, muutetaan kaikki where-ehdon täyttävär rivit jos ehto puuttuu muutetaan kaikki taulun rivit Muutetaan kurssin Java-ohjelmointi opintoviikkomäärä kolmeksi update kurssi set opintoviikot=3 where nimi= Java ohjelmointi ; Muutos epäonnistuu, jos se rikkoo eheysehtoja. Harri Laine 7

Rivien poisto (delete) delete from taulu [where poistettavien rajausehdot ]; Poistetaan kaikki ehdon täyttävät rivit Jos ehto puuttuu poistetaan kaikki rivit Poisto epäonnistuu jos eheysehdot rikkoutuvat (ellei muuta ole määritelty) Poistetaan harjoitusryhmät joihin ei ole ilmoittautuneita: delete from harjoitusryhma where (kurssikoodi, ryhmanro) not in (select kurssikoodi, ryhmanro ); Oraclessa löytyy operaatiot taulun uudelleennimeämiseen ja kopiointiin, esim. create table nimi as select * from toinen_taulu; rename table nimi to uusinimi; Näitä ei löydy standardista. Rivien siirtoa taulusta toiseen tarvitaan esimerkiksi siirrettäessä tietoja aktiivisesta taulusta historiatauluihin. Tämä suoritetaan kopioimalla (lisäämällä) rivit kohdetauluun ja sen jälkeen poistamalla ne lähtötaulusta: insert into ilmohistoria select * from ilmoittautumiset where ilm_aika< 1.1.1999 ; delete from ilmoittautumiset where ilm_aika< 1.1.1999 ; Joissakin järjestelmissä ylläpito-operaatiot voidaan suorittaa myös näkymiin kohdistuvina. Muutos vaikuttaa silloin näkymää vastaavaan perustauluun. Tähän liityy rajoitteita, sillä on useita tilanteita, joissa ei pystytä yksiselitteisesti päättelemään millainen muutos perustauluihin olisi tehtävä Yleensä päivitettävällä näkymällä on yksi perustaulu (ei liitosta) ja taulun pääavaimen on sisällyttävä näkymään Tietokantatapahtumalla tarkoitetaan yhtenä jakamattomana kokonaisuutena pidettävää tietokantaoperaatioiden joukkoa, esimerkiksi tilisiirto: update tili set saldo=saldo-500 where tilinumero=123456; update tili set saldo=saldo+500 where tilinumero=654321; Harri Laine 8

Tkhj takaa, että tapahtuma suoritetaan kokonaan eikä vain osaa siitä (ei siis vain tililtäottoa) ulkopuoliset näkevät vain kokonaisen tapahtuman aiheuttamat muutokset (ulkopuolinen ei voi nähdä tilannetta, jossa tililtä 123456 on otettu 500 mutta tilille 654321 ei sitä ole vielä viety) tapahtuman suorituksen aikana tehdyt muutokset kantaan on peruttavissa siihen asti kunnes tapahtumaan on sitouduttu kun tapahtumaan on sitouduttu (se on valmis) muutokset jäävät pysyviksi ja näkyvät myös muille. Tapahtuma päätetään onnistuneesti komennolla commit [work] (Solidissa work on pakollinen) Tapahtuma voidaan päättää myös perumalla sen aikaansaamat muutokset komennolla rollback [work] Tilisiirtotapahtuma olisi siis update tili set saldo=saldo-500 where tilinumero=123456; update tili set saldo=saldo+500 where tilinumero=654321; commit; Järjestelmät voidaan määritellä toimimaan auto-commit tilassa, jolloin jokaiseen ylläpitooperaatioon sitoudutaan välittömästi (tällöin tilisiirtoa ei voida koota transaktioksi) Normaalitilassa tapahtumia kuitenkin kootaan commit operaatioiden avulla. Kahden commitin välissä olevat operaatiot muodostavat tapahtuman. Yritetään poistaa tyhjät harjoitusryhmät, oletetaan, että ilmoittautumisten viiteavaimeen liittyy on delete cascade -määre commit; select count(*) from ilmoittautumiset; >> 3500 << Ei ole ihan oikein delete from harjoitusryhma where ryhmanro is not null; select count(*) from ilmoittautumiset; >>> 0 <<< (oho!) rollback; select count(*) from ilmoittautumiset; >> 3500 << Harri Laine 9