Esittely latautuu. Ole hyvä ja odota

Esittely latautuu. Ole hyvä ja odota

DO NOT PRINT THIS DOCUMENT SQL -valintaehto CREATE TABLE opettaja ( opetunnus varchar(12) NOT NULL, nimi varchar(40) NOT NULL, puhelin varchar(12), tyohuone.

Samankaltaiset esitykset


Esitys aiheesta: "DO NOT PRINT THIS DOCUMENT SQL -valintaehto CREATE TABLE opettaja ( opetunnus varchar(12) NOT NULL, nimi varchar(40) NOT NULL, puhelin varchar(12), tyohuone."— Esityksen transkriptio:

1 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 TABLE opiskelija ( onumero numeric(5) NOT NULL, nimi varchar(40) NOT NULL, paa_aine varchar(12) NOT NULL, kaupunki varchar(30), aloitusvuosi numeric(4), PRIMARY KEY (onumero ) ) ;

2 SQL-valintaehto n Opettajien nimet: –select nimi from opettaja; n Opiskelijoiden pääaineet –select distinct paa_aine from opiskelija; –(löytyy mm. TKT) n Tietojenkäsittelytieteen pääaineopiskelijoiden nimet –select nimi from opiskelija where paa_aine =‘TKT’;

3 SQL-valintaehto n Espoossa asuvat matematiikan opiskelijat select * from opiskelija where paa_aine=‘MAT’ and kaupunki=‘Espoo’; n Vuosina 1994-1997 opintonsa aloittaneet opiskelijat: select * from opiskelija where aloitusvuosi >=1994 and aloitusvuosi<=1997; tai select * from opiskelija where aloitusvuosi between 1994 and 1997; tai select * from opiskelija where aloitusvuosi in (1994,1995,1996,1997);

4 SQL-valintaehto n Opiskelijat joiden sukunimi on Tele –select * from opiskelija where nimi like ‘Tele %’; –(esimerkkitaulussa nimet ovat muodossa sukunimi+’space’+etunimi) n Opiskelijat, joiden etunimi alkaa L:llä –select * from opiskelija where nimi like ‘% L%’; välilyönti

5 SQL-funktioita n Opettajien sukunimet (Oraclessa) select substr(nimi, 1, instr(nimi,’ ‘)-1) from opettaja; n substr(sarake, alku,pituus) eristää osamerkkijonon –standardissa substring(sarake FROM alku FOR pituus) –Solidissa substring(sarake, alku, pituus) n instring(sarake,merkkijono) antaa upotetun merkkijonon alkukohdan tai 0, jos ei löydy –std:ssa ja Solisissa: position( merkkijono IN sarake)

6 SQL-funktioita n Opettajat, joiden puhelinnumero on parillinen select * from opettaja where substr(puh,length(puh),1) in (‘0’,’2’,’4’,’6’,’8’); tai select * from opettaja where mod(to_number(puh),2)=0;

7 SQL- tuloksen järjestäminen n Järjestetty tulos on käyttäjän kannalta helpommin hahmotettavissa, soveltuu tiedon etsintään n SQL:ssä järjestys saadaan aikaan järjestysmääreellä –order by sarake [ {asc[ending] | desc[ending] }] [, …] –ascending = nouseva järjestys, pienemmät arvot alussa (oletusjärjestys ellei mainita) –descending = laskeva järjestys

8 SQL- tuloksen järjestäminen n Jos järjestysmääressä annetaan useita sarakkeita –järjestetään rivit ensin ensimmäisenä annetun sarakkeen perusteella –seuraavaksi ne rivit, joilla ensimmäisenä annetussa sarakkeessa on sama arvo järjestetään luettelon 2. sarakkeen perusteella –seuraavaksi...

9 Järjestys A B C D 2 4 8 7 1 4 6 7 3 1 5 2 2 3 5 1 1 1 4 2 3 2 4 6 1 5 5 2 Order by A 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 Order by A,B A B C D 1 1 4 2 1 4 6 7 1 5 5 2 2 3 5 1 2 4 8 7 3 1 5 2 3 2 4 6 Order by A desc, B A B C D 3 1 5 2 3 2 4 6 2 3 5 1 2 4 8 7 1 1 4 2 1 4 6 7 1 5 5 2

10 SQL -järjestäminen n Merkkitiedon järjestäminen saattaa olla järjestelmän asetuksista riippuvaa ja toimia eri järjestelmissä eri tavoin –Esim. HY:n Oracle järjestää suomenkielisen aakkosjärjestyksen mukaisesti (V=W) eikä järjestäessään erottele isoja ja pieniä kirjaimia –Usein järjestäminen tapahtuu kuitenkin merkin merkkikoodin mukaisesti

11 Järjestäminen n Opiskelijat pääaineittain opiskeluajan perusteella järjestettynä vanhimmasta nuorimpaan select paa_aine, aloitusvuosi, nimi from opiskelija order by paa_aine, aloitusvuosi; n Järjestyksen määräämiseen käytettävien sarakkeiden on syytä olla tulostietolistan alussa (käyttöliittymätekniset syyt, ei SQL:n vaatimus)

12 SQL-Liitokset n Jos kyselyn from osassa on useampia tauluja, muodostetaan näiden taulujen ristitulo, ellei where-osassa ole ehtoa, joka kytkisi rivit yhteen n Jos where-osassa on rivit yhteenkytkevä ehto on kyseessä liitosoperaatio

13 SQL-Liitokset 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) n Kuka luennoi mitäkin kurssia: select kurssi.nimi, opettaja.nimi from opettaja, kurssi where luennoija=opetunnus order by kurssi.nimi;

14 SQL-Liitokset n Liitos tehdään useimmiten vertaamalla taulun avainta toisessa taulussa olevaan siihen viittaavaan viiteavaimeen. n Muunkinlaiset liitokset toki mahdollisia: n Opiskelijat, jotka toimivat ehkä myös opettajina select opiskelija.nimi from opiskelija, opettaja where opiskelija.nimi=opettaja.nimi order by opiskelija.nimi;

15 SQL-Liitokset n Taulujen järjestyksellä from osassa ei ole merkitystä kyselyn vastauksen kannalta –sillä saattaa olla merkitystä kyselyn suoritusajan kannalta, mutta tämä on järjestelmäkohtaista n Ehtojen järjestyksellä where-osassa ei ole merkitystä kyselyn vastauksen kannalta –silläkin saattaa olla merkitystä kyselyn suoritusajan kannalta, mutta tämä on järjestelmäkohtaista

16 SQL-Liitokset n From-osassa voi olla useita tauluja n Kaikki ne taulut, joiden dataa halutaan mukaan tulokseen on annettava from-osassa n 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

17 SQL-Liitokset –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ä

18 SQL-Liitokset n Vuoden 92 standardissa from-osaan sallittiin normaalien taulujen lisäksi myös kyselyiden tulostaulut ja liitostulokset (ei Oracle 7) n 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, esimerkki myöhemmin yhteenvetotietojen yhteydessä

19 SQL-Liitokset n Liitostulokset from osassa: n from … taulu1 [ ]JOIN taulu2 [ ON ] n = inner | left outer | right outer | full outer n Inner join on normaaliliitos (oletusarvo, jos join type-määrettä ei anneta) select kurssi.nimi, opettaja.nimi from opettaja join kurssi on luennoija=opetunnus order by kurssi.nimi n Tämä on siis toinen tapa esittää liitos n Jos kurssilla ei ole opettajaa, ei tulokseen tule mittään tietoa kurssista

20 SQL-Liitokset n Ulkoliitokset –ulkoliitoksella saadaan parittomaksi normaali-liitoksessa jäävät rivit mukaan tulokseen n Kaikki kurssit, luennoijatietoineen: select kurssi.nimi, opettaja.nimi from kurssi left outer join luennoija on luennoija=opetunnus order by kurssi.nimi –nyt luennoijattomatkin kurssit tulevat mukaan, luennoija.nimi saa arvon null select opettaja.nimi, kurssi.nimi from kurssi right outer join luennoija on luennoija=opetunnus order by opettaja.nimi näin saadaan kaikki opettajat, myös ne, jotka eivät luennoi

21 SQL-Liitokset n Tyypillinen virhe liitoksissa on jättää jokin liitosehto pois, jolloin tuloksen rivijoukko tulee huomattvasti suuremmaksi kuin pitäisi n jos from osassa on n kpl liitettäviä tauluja tarvitaan vähintään n-1 liitosehtoa. Taulujen liittäminen voi perustua useaan sarakkeeseen, jolloin ehtolausekkessa tarvittavien alkeisehtojen määrä voi moninkertaistua.

22 SQL-Liitokset n 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. Keskeinen taulu liitokset

23 SQL - liitokset CREATE TABLE harjoitusryhma ( kurssikoodi numeric(4) NOT NULL, ryhmanro numeric(2) NOT NULL, viikonpaiva varchar(12) NOT NULL, alkamisaika numeric(2) NOT NULL, sali varchar(12) NOT NULL, opettaja varchar(12) NOT NULL, PRIMARY KEY (kurssikoodi, ryhmanro), FOREIGN KEY (kurssikoodi) REFERENCES kurssi, FOREIGN KEY (opettaja) REFERENCES opettaja ) ;

24 SQL - liitokset 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, FOREIGN KEY (opisknro) REFERENCES opiskelija )

25 SQL - liitokset n Raportti kurssin ‘Java ohjelmointi’ harjoitusryhmistä 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 order by H.ryhmanro, O.nimi ;

26 SQL - liitokset ilmoittautuminen harjoitusryhma opettaja opiskelija I.kurssikoodi=H.kurssikoodi and I.ryhmanro=H.ryhmanro Ope.Opetunnus=H. Opettaja I.Opisknro=O.onumero kurssi H.kurssikoodi=K.koodi

27 SQL - alikyselyt n Alikyselyllä tarkoitetaan kyselyyn upotettua toista kyselyä. Upotettua kyselyä voidaan käyttää kyselyn from osassa mutta myös where osassa valintaehtojen operandina. n On pidettävä mielessä, että alikyselykin tuottaa tuloksenaan taulun n Alikyselyiden käyttöön valintaehdoissa on omia predikaatteja ja lisätarkenteita, jotka määrittelevät, miten ehdon operandia sovelletaan alikyselyn tulokseen

28 SQL - alikyselyt n Vertailuoperaatio IN –vertailuoperaatiossa a IN B operandi B on joukko, joten sen tilalle alikysely soveltuu suoraan –a in (alikysely) on tosi, jos vakio a tai sarakkeen a arvo sisältyy alikyselyn tulokseen. –Luennoivat opettajat: select nimi from opettaja where opetunnus in (select luennoija in kurssi) order by nimi;

29 SQL - alikyselyt –Luennoimattomat opettajat: select nimi from opettaja where opetunnus not in (select luennoija from kurssi) order by nimi; n Standardin mukaan ja Oraclessa IN vertailun osapuolena voi olla myös sarakeyhdistelmä (Solidissa vain yksittäinen sarake).

30 SQL - alikyselyt n Harjoitusryhmät, joihin ei ole ilmoittautunut ketään select nimi, ryhmanro from kurssi, harjoitusryhma where kurssi.koodi=harjoitusryhma.kurssikoodi and (kurssikoodi, ryhmanro) not in (select kurssikoodi, ryhmanro from ilmoittautuminen) order by nimi, ryhmanro;

31 SQL - alikyselyt n Muut vertailuoperaatiot ovat yksittäisten arvojen välisiä. Tällaisten osapuolina voi käyttää alikyselyä, jos on varmaa että kysely tuottaa tuloksenaan enintään yhden rivin. Tulee ajoaikainen virhe, jos ei tuotakaan. Tällaisia ovat tyypillisesti yhteenvetokyselyt (myöhemmin) n Lisämääreillä SOME = ANY ja ALL voidaan yksittäisten arvojen vertailuun perustuvaa operaatiota soveltaa arvojoukoon: –SOME = jokin joukon arvo toteuttaa ehdon –ALL = kaikki joukon arvot toteuttavat ehdon

32 SQL - alikyselyt n Luennoivat opettajat: select nimi from opettaja where opetunnus = SOME (select luennoija from kurssi) order by nimi; n ‘ = SOME’ on siis sama kuin ‘IN’ n Mistä kurssista saa eniten opintoviikkoja? select nimi from kurssi where opintoviikot >= ALL (select opintoviikot from kurssi) order by nimi;

33 SQL - alikyselyt n Yksittäisen arvon tyhjyyttä testataan IS NULL tai IS NOT NULL predikaateilla n Alikyselyn tyhjyyden testaamiseen ovat tarjolla EXISTS ja NOT EXISTS predikaatit –Exists (alikysely) on tosi, jos alikysely tuottaa ainakin yhden tulosrivin –Not exists (alikysely) on tosi, jos vastaus on tyhjä eli ei yhtään riviä (ei tarjolla Solidissa) n Kyselyn tyhjyyttä on mielekästä testata vain ns. kytkettyjen alikyselyjen yhteydessä

34 SQL - alikyselyt n Aiemmissa esimerkeissä alikysely on ollut täysin riippumaton sen sisältävästä pääkyselystä (= sen voisi suorittaa erillisenä kyselynä ja sen tulos olisi sama kuin pääkyselyyn upotettuna = se ei viittaa mihinkään pääkyselyn elementtiin) n Kytketyssä alikyselyssä tilanne on toinen: n sitä ei voi suorittaa erillisenä, koska jokin siinä oleva valintaehto tai tulostiedon määritys käyttää hyväkseen pääkyselyn saraketta

35 SQL - alikyselyt n Luennoivat opettajat: select nimi from opettaja where exists (select luennoija from kurssi where luennoija= opettaja.opetunnus) order by nimi; n Tässä alikysely suoritetaan jokaista opettaja- riviä kohden erikseen ja opettajarivi tulee tulokseen, jos alikyselyn tulos ei ole tyhjä.

36 SQL - alikyselyt Luennoijat jotka pitävät harjoituksia kursseillaan (kurssin nimi mukaan) Select O.nimi from opettaja O, kurssi K where O.opetunnus=K.luennoija and O.opetunnus in (select opettaja from harjoitusryhma where kurssikoodi=K.Koodi); Select O.nimi from opettaja O, kurssi K where O.opetunnus=K.luennoija and exists (select ‘A’ from harjoitusryhma where opettaja=o.opetunnus and kurssikoodi=K.Koodi); Select O.nimi from opettaja O, kurssi K where O.opetunnus=K.luennoija and (O.opetunnus,K.koodi) in (select opettaja, kurssikoodi from harjoitusryhma );

37 SQL - alikyselyt n Ketjutus select nimi from opettaja where opetunnus in (select opettaja from harjoitusryhma where kurssikoodi in (select koodi from kurssi where nimi like ‘Java%’)); Java-alkuisten kurssien opettajien nimet.

38 SQL - joukko-opin perusoperaatiot n Kyselyjä voi yhdistää union (yhdiste), intersect (leikkaus) ja except (erotus) operaatioilla. Järjestysmääre koskee koko tulosta. Select …… [union | intersect | except] kysely order by......; –union karsii toistuvat rivit –Oraclessa except:n tilalla minus

39 SQL - joukko-opin perusoperaatiot n Opiskelijat, jotka ovat myös opettajia select nimi from opettaja intersect select nimi from opiskelija order by nimi;

40 SQL-yhteenvetofunktiot n SQL:ssä joukko yhteenvetofunktioita (aggregate function, koostefunktio) –AVGkeskiarvo –MINpienin arvo (minimi) –MAXsuurin arvo (maksimi) –SUMsumma –COUNTlukumää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

41 SQL-yhteenvetofunktiot n Opiskelijoiden lukumäärä: –select count(*) from opiskelija; n Count:n parametrina voisi käyttää myös mitä tahansa saraketta tai valiota, tulos olisi sama eli rivien lukumäärä –select count(1) from opiskelija; –select count(onumero) from opiskelija;

42 SQL-yhteenvetofunktiot n Milloin vanhin Helsinkiläinen opiskelija on aloittanut opintonsa? select min(aloitusvuosi) from opiskelija where kaupunki=‘Helsinki’; n Keskiarvoa, summaa, minimiä ja maksimia laskettaessa tyhjäarvot jätetään huomioimatta n Keskimääräinen opintoviikkomäärä –select avg(opintoviikot) from kurssi;

43 SQL-yhteenvetofunktiot n Keskiarvoa ja summaa laskettaessa on yleensä syytä ottaa mukaan kaikki sarakkeen arvot n Lukumääriä laskettaessa voi erilaisten arvojen laskeminenkin tulla kyseeseen n Monellako eri paikkakunnalla opiskelijat asuvat? –select count(distinct kaupunki) from opiskelija;

44 SQL-yhteenvetofunktiot n Yhteenvetofuntion sisältävään kyselyyn ei saa mukaan dataa niiltä yksittäisiltä riveiltä, joilta funktio lasketaan n Minkä kurssien opintoviikkomäärä on suurin? n EI: select nimi, max(opintoviikot) from kurssi; yksityiskohta

45 SQL-yhteenvetofunktiot Select nimi, opintoviikot from kurssi where opintoviikot>= ALL (select opintoviikot from kurssi); n antaa oikean vastauksen n Seuraavan pitäisi myös toimia: select nimi,maksi from kurssi, (select max(opintoviikot) maksi from kurssi) as m where opintoviikot =maksi; alikysely

46 SQL-yhteenvetofunktiot n 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.

47 SQL-yhteenvetofunktiot n Group by A n Taulu X n A B C D n 1 4 6 7 n 1 1 4 2 n 1 5 5 2 n 2 4 8 7 n 2 3 5 1 n 3 1 5 2 n 3 2 4 6 Ryhmä a=2 Ryhmä a=1

48 SQL-yhteenvetofunktiot n Select A, sum(B) from X group by A; A B 110 2 73 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)

49 SQL-yhteenvetofunktiot n Kurssien harjoitusryhmiin ilmoittautuneiden opiskelijoiden lukumäärät select nimi, ryhmanro, count(*) from kurssi, ilmoittautuminen where ilmoittautuminen.kurssikoodi= kurssi.koodi group by nimi, ryhmanro; Ongelma: tyhjät ryhmät eivät tule mukaan! Miksi?

50 SQL-yhteenvetofunktiot 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)); n tuottaa tyhjätkin - Miksi näin monimutkaista?

51 SQL-yhteenvetofunktiot 1132 1133 1135 kurssi 1132 1 A 1132 1 B 1132 2 C 1135 1 D 1135 1 E 1135 1 F ilmoittautuminen Ryhmät näiden where-ehdon täyttävien perusteella Pariton putoaa

52 SQL-yhteenvetofunktiot n Ulkoliitosta käyttäen kysely onnistuisi myös 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 –tässä ei voi käyttää count(*) koska tyhjästäkin ryhmästä tulee rivi

53 SQL-yhteenvetofunktiot n Ryhmäkohtaisen rivin mukaanottamista tulokseen voidaan rajoittaa having määreellä. n Having-ehto kuten where-ehto, mutta se perustuu ryhmäkohtaisesti lasketun yhteenvetofunktion arvoon

54 SQL-yhteenvetofunktiot n 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;

55 SQL-yhteenvetofunktiot n Ryhmät muodostetaan aina where-ehdon soveltamisen jälkeen n Käytännössä ryhmien muodostaminen tarkoittaa tulostaulun järjestämistä ryhmitysattribuuttien perusteella n Order by -järjestäminen suoritetaan viimeiseksi

56 SQL-yhteenvetofunktiot –Harjoitusryhmät ilmoittautumismää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;

57 SQL-yhteenvetofunktiot n Millä kurseilla on suurin keskimääräinen ryhmäkoko 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 YHTEENVETOFUNKTIOITA EI VOI KETJUTTAA

58 SQL-yhteenvetofunktiot Kurssin ryhmien koot (vain ei-tyhjät ryhmät) select kurssikoodi,ryhmanro,count(*) lkm from ilmoittautuminen 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

59 SQL-yhteenvetofunktiot n Kurssien keskimääräiset ryhmäkoot 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 alikysely

60 SQL-yhteenvetofunktiot 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

61 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) SQL-yhteenvetofunktiot Edellinen kysely

62 SQL-yhteenvetofunktiot Tulos samasta testikannasta KOODI NIMI AVG(LKM) ----- ------------------------------ ---------- 1136 Oliotietokannat 6

63 SQL-yhteenvetofunktiot select avg(lkm) from kurssi, (select kurssikoodi,ryhmanro,count(*) lkm from ilmoittautuminen group by kurssikoodi, ryhmanro) A where koodi= A.kurssikoodi group by koodi n tulos tästä on AVG(LKM) ---------- 4,33333333 6 5 Ryhmitysperuste koodi ei ole mukana tuloksessa

64 SQL-yhteenvetofunktiot n Huom. edelliset kyselyt toimivat täysin oikein vain jos kaikkiin ryhmiin on ilmoittautuneita, sillä tyhjät ryhmät putoavat pois jo ilmoittautujalukumäärien laskennasta. n Kovin monimutkaisia kyselyjä kuten edellinen voi helpottaa käyttämällä näkymiä (views) eli johdettuja tauluja

65 SQL-Näkymät (views) n Näkymä on kyselyn avulla määritelty taulu. n Esim. 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 Data näkymään saadaan muista tauluista.

66 SQL-Näkymät (views) n Näkymän tietoja ei tallenneta kantaan. n 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 n aiheuttaisi sen määrittelevän kyselyn suorituksen

67 SQL-Näkymät (views) n 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 update on oma_kurssi to public, jolloin kurssin tietoja pääsee muuttamaan vain sen luennoija

68 SQL-Näkymät (views) –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ää: select nimi, ryhmanro, count(*) from kurssi, ilmoittautuminen where ilmoittautuminen.kurssikoodi=kurssi.koodi group by nimi, ryhmanro union (select nimi, ryhmanro, 0 from tyhja_ryhma)

69 SQL-Näkymät (views) n Edelläolevan voisi määritellä näkymäksi, jolloin kyselyjen teko on jatkossa todella helppoa create view ryhmäkoko (nimi, ryhma, lkm) as select nimi, ryhmanro, count(*) from kurssi, ilmoittautuminen where ilmoittautuminen.kurssikoodi=kurssi.koodi group by nimi, ryhmanro union (select nimi, ryhmanro, 0 from tyhja_ryhma); select * from ryhmakoko;

70 SQL-Näkymät (views) n Näkymän määrittelyn syntaksi: select view taulun_nimi [(sarakkeet)] as kysely; n Näkymiä voi käyttää kyselyissä kuten tauluja. n Myös tietokannan ylläpito näkymien kautta on rajoitetusti mahdollista

71 SQL - Tietokannan ylläpito


Lataa ppt "DO NOT PRINT THIS DOCUMENT SQL -valintaehto CREATE TABLE opettaja ( opetunnus varchar(12) NOT NULL, nimi varchar(40) NOT NULL, puhelin varchar(12), tyohuone."

Samankaltaiset esitykset


Iklan oleh Google