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



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

Kyselyn yleisrakenne:

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

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

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-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 - Tietokannan ylläpito. SQL - Tietokannan ylläpito. SQL - Tietokannan ylläpito. SQL - Tietokannan ylläpito. SQL - Tietokannan ylläpito

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

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

4.3.4 SQL kyselyt... 45

SQL-kielen perusteet. Tietokantojen perusteet

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

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

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

SQL - STRUCTURED QUERY LANGUAGE

SELECT-lauseen perusmuoto

5 SQL TIETOKANTAKIELI...33

Relaation tyhjyyden testaaminen

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

TIETOKANTOJEN PERUSTEET MARKKU SUNI

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

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

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

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

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

HELIA 1 (14) Outi Virkki Tiedonhallinta

Liitokset - haut useaan tauluun

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

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

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

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

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

CSE-A1200 Tietokannat

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

HELIA 1 (15) Outi Virkki Tietokantasuunnittelu

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

CSE-A1200 Tietokannat

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

HELIA 1 (14) Outi Virkki Tiedonhallinta

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

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

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

TIETOKANTOJEN PERUSTEET OSIO 11 MARKKU SUNI

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

CS-A1150 Tietokannat CS-A1150 Tietokannat / 43

SQL:N PERUSTEET MARKKU SUNI

Opettajana Mika Sorsa, HAMK:n ammatillisen opettajakoulutuksen opetusharjoittelija

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

3. Taulujen määrittely ja muuttaminen

Opiskeluoikeuksien maaran tiedonkeruu

CS-A1150 Tietokannat CS-A1150 Tietokannat / 44

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

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

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

Tietokantakurssit / TKTL

3. TAULUJEN MÄÄRITTELY JA MUUTTAMINEN

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

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

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

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

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

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

HELIA 1 (11) Outi Virkki Tiedonhallinta

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

Tiedonhallinnan perusteet. Viikko 1 Jukka Lähetkangas

Proseduurit, funktiot ja herättimet - esimerkkeinä Oracle, SQL Server, MySQL ja OCELOT. Jouni Huotari S2008

Tietokannat II -kurssin harjoitustyö

PROSEDUURIT, FUNKTIOT JA HERÄTTIMET - ESIMERKKEINÄ ORACLE, SQL SERVER, MYSQL JA OCELOT JOUNI HUOTARI K2009

Relaatioalgebra. Kyselyt:

Yhdiste, leikkaus, erotus ym.

Helsingin yliopisto/tktl Kyselykielet, s 2006 Relaatiokalkyylit. Harri Laine 1

OUTER JOIN se vanha kunnon kaveri

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

Denormalisointia turvallisesti. Ougf syysseminaari Pörssitalo Helsinki Timo Raitalaakso

Esimerkki. pankkien talletus- ja lainatietokanta: Yhdiste, leikkaus, erotus ym. Leikkaus (intersect) Yhdiste (Union) Erotus (except/minus) Leikkaus

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

TIETOKANNAT: MYSQL & POSTGRESQL Seminaarityö

HELIA 1 (15) Outi Virkki Tietokantasuunnittelu

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

Yleinen SQL. Yleinen SQL. SQL:n kehitys

TIETOKANTOJEN PERUSTEET OSIO 14 MARKKU SUNI

Näkymät ja tiedon suojaus

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

Tietokanta projektin alussa: create table kurssin_tila ( NOT NULL VARCHAR2(60) create table kurssin_tyyppi ( create table opintojakson_tyyppi (

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

Tietokannat II -kurssin harjoitustyö

TIEDONHALLINNAN PERUSTEET - SYKSY 2013

Opintopiiritehtävä 3: Verkkohuutokauppa

Helsingin yliopisto/ tktl D Tietokantojen perusteet, s 2000 Relaatioalgebra. Harri Laine 1. Relaatioalgebra.

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

CSE-A1200 Tietokannat

SPARQL(SPARQL Protocol and RDF Query Language)

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

Samanaikaisuuden hallinta. Optiot transaktionaalisissa työnkuluissa

Helsingin yliopisto/ tktl DO Tietokantojen perusteet, s 2000 Relaatioalgebra Harri Laine 1. Relaatioalgebra

Java ja tietokannan käsittely (JDBC)

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

joukko operaatioita, joilla relaatioista voidaan muodostaa uusia relaatioita joukko opin perusoperaatiot yhdiste, erotus, ristitulo, leikkaus

Transkriptio:

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 tulostaulun. 1

SQL -kyselyt Kyselyn from-osassa voi olla useita tauluja Kaikki ne taulut, joiden dataa halutaan mukaan tulokseen on annettava from-osassa Tauluille voidaan from-osassa antaa tilapäinen kyselyn sisäinen nimi (alias, correlation name) from taulu [AS] alias liitettävillä tauluilla on usein samannimisiä sarakkeita, joten taulunimeä on käytettävä tarkenteena - alias voi olla lyhenne, joka vähentää kirjoitusvaivaa 2

Aliasten käyttö Jos sama taulu esiintyy from osassa useaan kertaan, on taulun esiintymät erotettava käyttämällä aliasta Esim.: Kurssiparit, joilla on sama luennoija 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ärjestyksessä 3

Alikyselyt Alikyselyllä tarkoitetaan kyselyyn upotettua toista kyselyä. Upotettua kyselyä voidaan käyttää kyselyn from osassa mutta myös where osassa valintaehtojen operandina. Alikyselykin tuottaa tuloksenaan taulun Alikyselyiden käyttöön valintaehdoissa on omia predikaatteja ja lisätarkenteita, jotka määrittelevät, miten ehdon operandia sovelletaan alikyselyn tulokseen IN; NOT IN; tarkenteet any,some, all; EXISTS, NOT EXISTS 4

Alikyselyt Opettajat, jotka luennoivat jotain kurssia select nimi from opettaja where opetunnus in (select luennoija from kurssi) order by nimi; Opettajat, jotka eivät luennoi mitään kurssia select nimi from opettaja where opetunnus not in (select luennoija from kurssi) order by nimi; alikysely voidaan suorittaa erillään pääkyselystä 5

Alikyselyt Luennoivat opettajat, kytketyllä alikyselyllä select nimi from opettaja where exists (select luennoija from kurssi where luennoija= opettaja.opetunnus) order by nimi; alikysely on evaluoitava erikseen jokaista opettajariviä kohti 6

Alikyselyt Vuoden 92 standardissa from-osaan sallittiin normaalien taulujen myös alikyselyiden tulostaulut from (alikysely) [[as] alias [( sarakeluettelo)] ] alikysely on normaali kysely sarakeluettelo uudelleennimeää alikyselyn tulossarakkeet tästä rakenteesta on hyötyä, jos halutaan yhdistää yksityiskohtaista tietoa ja yhteenvetotietoa tai eri perustein laskettuja yhteenvetotietoja samalle riville. Yksityiskohtien kyselyssä rakennetta ei tarvita. yleensä rakenteen käyttö vain sotkee asioita - VÄLTÄ 7

Alikyselyt Esimerkki: Opiskelija(hetu, nimi, opintoviikot, ) Select nimi, opintoviikot from opiskelija, (select avg(opintoviikot) kaovt from opiskelija) as m where oviikot > m.kaovt; Huom. ei liitosehtoa joten tehdään ristitulo eli jokaiseen opiskelijariviin liitetään opintoviikkojen keskiarvo Kysely tuottaa yhden rivin, jossa vain yksi sarake kaovt, opintoviikkojen keskiarvo 8

Yhteenvetokyselyt 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 9

Yhteenvetokyselyt Opiskelijoiden lukumäärä: select count(*) from opiskelija; Count:n argumenttina 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; 10

Yhteenvetokyselyt Milloin pisimpään opiskelut 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 Kurssien keskimääräinen opintoviikkomäärä select avg(opintoviikot) from kurssi; 11

Yhteenvetokyselyt Yhteenvedon laskenta voidaan rajata vain keskenään erilaisiin arvoihin (projektioon). Tällainen rajaus on yleensä järkevä vain lukumääriä laskettaessa Monellako eri paikkakunnalla opiskelijat asuvat? select count(distinct kaupunki) from opiskelija; 12

Yhteenvetokyselyt Yhteenvetofunktion sisältävään kyselyyn ei voi ottaa 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; yksittäisen rivin dataa miltä riviltä nimi poimittaisiin? 13

Yhteenvetokyselyt Minkä kurssin opintoviikkomäärä on suurin? Toimivia vaihtoehtoja: select nimi, opintoviikot from kurssi where opintoviikot>= ALL (select opintoviikot from kurssi); Select nimi, opintoviikot from kurssi where opintoviikot= (select max(opintoviikot) from kurssi); select nimi,maksi from kurssi, (select max(opintoviikot) maksi from kurssi) as m where opintoviikot =m.maksi; 14

Yhteenvetokyselyt -ryhmät Jos kyselyyn liitetään ryhmittelymääre (Group by) muuttuu tuolosrivien muodostusperiaate jälleen: muodostetaan yksi tulosrivi kutakin ryhmää kohti group by -määreessä luetellaan sarakkeet, joiden arvojen 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. 15

Yhteenvetokyselyt -ryhmät 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 Select A, sum(b) from X group by A; A B 10 7 3 16

Yhteenvetokyselyt -ryhmät Group by -lausetta käytettäessä tulostietoluettelossa voi olla yhteenvetofunktioiden lisäksi vain niitä sarakkeita,jotka esiintyvät group by -lauseessa. Kaikkien ryhmittelyyn käytettyjen sarakkeiden ei tarvitse olla mukana, mutta yleensä ne ovat select koodi, nimi, ryhmanro, count(*) from kurssi, ilmoittautuminen where ilmoittautuminen.kurssikoodi= kurssi.koodi group by koodi, nimi, ryhmanro; Ei anna tyhjien ryhmien ilmoittautujamäärää koska nimi on tulostietolistalla sen pitää olla myös ryhmittelytekijänä vaikka ilman sitä saataisiin samat ryhmät 17

Yhteenvetokyselyt -ryhmät 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 where-ehdon täyttävien perusteella 18

Yhteenvetokyselyt -ryhmät select nimi, ryhmanro, count(*) from kurssi, ilmoittautuminen where ilmoittautuminen.kurssikoodi=kurssi.koodi group by nimi, ryhmanro union vakioarvo (select nimi, ryhmanro, 0 from kurssi, harjoitusryhma H, where koodi=h.kurssikoodi and (koodi,h.ryhmanro) not in (select kurssikoodi, ryhmanro from ilmoittautuminen)); 19

Yhteenvetokyselyt -ryhmät Ryhmäkohtaisen rivin mukaanottamista tulokseen voidaan rajoittaa having määreellä. Having-ehto toimii kuten where-ehto, mutta se perustuu ryhmäkohtaisesti lasketun yhteenvetofunktion arvoon 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; 20

Yhteenvetokyselyt Yhteenvetofunktioilla voi laskea, mutta niitä ei voi ketjuttaa (eli toinen on toisen argumenttina) Millä kurseilla on suurin keskimääräinen ryhmäkoko, ei onnistu seuraavasti 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 * Ajettuna Oraclessa: VIRHE rivillä 1: ORA-00937: tämä ei ole yhden ryhmän koostefunktio 21

Yhteenvetokyselyt -ryhmät select koodi, nimi, opiskelijoita/ryhmia from kurssi, (select kurssikoodi, count(*) opiskelijoita from ilmoittautuminen group by kurssikoodi) as ilm, (select kurssikoodi, count(*) ryhmia from harjoitusryhma group by kurssikoodi) as ryhm where kurssi.koodi= ilm.kurssikoodi and kurssi.koodi= ryhm.kurssikoodi and opiskelijoita/ryhmia = (XXXXX seuraavalla kalvolla) 22

Yhteenvetokyselyt -ryhmät XXXXX= select max(opiskelijoita/ryhmia) from (select kurssikoodi, count(*) opiskelijoita from ilmoittautuminen group by kurssikoodi) as i, (select kurssikoodi, count(*) ryhmia from harjoitusryhma group by kurssikoodi) as ry where i.kurssikoodi = ry.kurssikoodi 23

Näkymät Perustauluja ja johdettuja tauluja. Johdettu taulu eli näkymä (view) määritellään kyselyn avulla CREATE VIEW taulunimi [(sarake1,sarake2, )] AS kysely; Create view miesopiskelijat (hetu, nimi, ovt) as (select hetu, nimi, oviikot from opiskelija where mod((substr(hetu,8,3),2)=1); 111170-123X 24

Näkymät Näkymää käytetään kuten muitakin tauluja; lasketaan kuinka monta ilmoittautumista miespuoliset opiskelijat ovat tehneet syksyllä 2003 Select count(*) From ilmoittautuminen i, miesopiskelijat m where i.hetu=m.hetu and lukuvuosi=2003 and lukukausi= S Todellisuudessa näkymään liittyvä kysely suoritetaan aina kun näkymää käytetään! 25

Miksi näkymiä tarvitaan? Tietoriippumattomuus esim. Create view ilmo as select kurssikoodi, ryhmanro, opisknro, ilm_aika from ilmoittautuminen union select kurssikoodi, ryhmannro, opisknro, ilm_aika from vanhat_ilmoittautumiset; Täsmäsuojaus esim. create view oma_kurssi as select * from kurssi where luennoija=user; Kyselyiden helpottaminen 26

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 27

SQL - Tietokannan ylläpito 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 28

SQL - Tietokannan ylläpito CREATE TABLE kurssi ( koodi numeric(8) NOT NULL, nimi varchar(40) NOT NULL, opintoviikot numeric(5,1) NOT NULL, luennoija varchar(12), PRIMARY KEY (koodi ), FOREIGN KEY (luennoija) REFERENCES opettaja) insert into kurssi values (1234, Tietokantojen perusteet,2, HLAINE ); lisää tauluun kokonaisen rivin 29

SQL - Tietokannan ylläpito Jos luennoijaa ei tiedetä voidaan 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 30

SQL - Tietokannan ylläpito Jos luennoijan tunnusta ei tiedetä, voitaisiin lisäys tehdä seuraavasti (kaikki kyselyn tulosrivit lisätään): 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 31

SQL - Tietokannan ylläpito 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 ) 32

SQL - Tietokannan ylläpito 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; 33

SQL - Tietokannan ylläpito Rivien muutokset (update) update taulu set sarake1=lauseke1 [, ] [where kohteen rajausehdot] samalla kertaa voi muttaa useita sarakkeiden sisältöä, muutetaan kaikki where-ehdon täyttävät rivit jos ehto puuttuu muutetaan kaikki taulun rivit 34

SQL - Tietokannan ylläpito Muutetaan kurssin Java-ohjelmointi opintoviikkomäärä kolmeksi update kurssi set opintoviikot=3 where nimi= Java ohjelmointi ; Muutos epäonnistuu, jos se rikkoo eheysehtoja. 35

SQL - Tietokannan ylläpito 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) 36

SQL - Tietokannan ylläpito Poistetaan harjoitusryhmät joihin ei ole ilmoittautuneita: delete from harjoitusryhma where (kurssikoodi, ryhmanro) not in (select kurssikoodi, ryhmanro from ilmoittautuminen); 37

SQL - Tietokannan ylläpito 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 ; 38

SQL - Tietokantatapahtuma (transaktio) 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; 39

SQL - Tietokantatapahtuma (transaktio) 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. 40

SQL - Tietokantatapahtuma (transaktio) Tapahtuma päätetään onnistuneesti komennolla commit [work] Tapahtuma voidaan päättää myös perumalla sen aikaansaamat muutokset komennolla rollback [work] Tilisiirtotapahtuma olisi kokonaisuudessaan siis update tili set saldo=saldo-500 where tilinumero=123456; update tili set saldo=saldo+500 where tilinumero=654321; commit; 41

SQL - Tietokantatapahtuma (transaktio) 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. 42

SQL - Tietokantatapahtuma (transaktio) Yritetään poistaa tyhjät harjoitusryhmät, oletetaan, että ilmoittautumisten viiteavaimeen liittyy on delete cascade -määre 43

SQL - Tietokantatapahtuma (transaktio) Yritetään poistaa tyhjät harjoitusryhmät, oletetaan, että ilmoittautumisten viiteavaimeen liittyy on delete cascade -määre commit; select count(*) from ilmoittautumiset; >> 3500 << 44

SQL - Tietokantatapahtuma (transaktio) Yritetään poistaa tyhjät harjoitusryhmät, oletetaan, että ilmoittautumisten viiteavaimeen liittyy on delete cascade -määre commit; select count(*) from ilmoittautumiset; >> 3500 << delete from harjoitusryhma where ryhmanro is not null; select count(*) from ilmoittautumiset; >>> 0 <<< (oho!) Ei ole ihan oikein 45

SQL - Tietokantatapahtuma (transaktio) Yritetään poistaa tyhjät harjoitusryhmät, oletetaan, että ilmoittautumisten viiteavaimeen liittyy on delete cascade -määre commit; select count(*) from ilmoittautumiset; >> 3500 << delete from harjoitusryhma where ryhmanro is not null; select count(*) from ilmoittautumiset; >>> 0 <<< (oho!) rollback; select count(*) from ilmoittautumiset; Ei ole ihan oikein >> 3500 << 46

SQL - Tietokantatapahtuma (transaktio) Yritetään poistaa tyhjät harjoitusryhmät, oletetaan, että ilmoittautumisten viiteavaimeen liittyy on delete cascade -määre commit; select count(*) from ilmoittautumiset; >> 3500 << delete from harjoitusryhma where ryhmanro is not null; select count(*) from ilmoittautumiset; >>> 0 <<< (oho!) rollback; select count(*) from ilmoittautumiset; Ei ole ihan oikein >> 3500 << 47