Presentasjon lastes. Vennligst vent

Presentasjon lastes. Vennligst vent

Datamodellering og databaser Else Lervik, oktober 2011 Forelesning 9, uke 41 SQL, del 2 Eksempelbaseside 2 Virtuelle.

Liknende presentasjoner


Presentasjon om: "Datamodellering og databaser Else Lervik, oktober 2011 Forelesning 9, uke 41 SQL, del 2 Eksempelbaseside 2 Virtuelle."— Utskrift av presentasjonen:

1 Datamodellering og databaser http://www.aitel.hist.no/fag/_dmdb/ Else Lervik, oktober 2011 Forelesning 9, uke 41 SQL, del 2 Eksempelbaseside 2 Virtuelle tabeller (views)side 3-6 NULL-verdierside 7-14 UPDATE-setningenside 15-16 INSERT-setningenside 17 DELETE-setningenside 18 Indekserside 19 Læreboka: Side 115-120, 142-150, 169-175, 270-274 Se også http://www.sqlzoo.net/

2 Datamodellering og databaser Else Lervik, oktober 2011 side 2 Eksempelbase prod_nrprod_navnkodevektprod_by 1synålerrød12Lillehammer 2bindersgrønn17Porsgrunn 3skruerblå17Risør 4skruerrød14Lillehammer 5knapperblå12Porsgrunn 6spikerrød19Lillehammer lev_nrlev_navnstatuslev_by 1Svendsen20Lillehammer 2Jensen10Porsgrunn 3Bø30Porsgrunn 4Christiansen20Lillehammer 5Andersen30Arendal lev_nrprod_nrantall 11300 12200 13400 14200 15100 21300 22400 32200 42 44300 45400 leveranse leverandor produkt

3 Datamodellering og databaser Else Lervik, oktober 2011 side 3 Virtuelle tabeller – ”views” – ikke øyeblikksbilder Et view definerer en spørring under et bestemt navn. Syntaks: CREATE VIEW navn AS spørring; Eksempel: create view daarlige_leverandorer as select lev_nr, lev_navn, status from leverandor where status < 30; select * from daarlige_leverandorer; Vi lager ikke en fysisk tabell, men vi gir navn til et vindu mot databasen Kan bruke et view på samme måte som en vanlig fysisk tabell, men det er begrensninger på oppdateringer. Aktuelt for å forenkle spørringer. Aktuelt for å lage spesialtilpassede utsnitt. lev_nrlev_navnstatuslev_by 1Svendsen20Lillehammer 2Jensen10Porsgrunn 3Bø30Porsgrunn 4Christiansen20Lillehammer 5Andersen30Arendal

4 Datamodellering og databaser Else Lervik, oktober 2011 side 4 Oppdatering via virtuelle tabeller (views) Hva skal til for at en skal kunne oppdatere tabeller (insert, delete, update) som vises i et vindu (view)? –SQL-standard: Vinduet må være basert på kun én tabell. Definisjonen må ikke inneholde uttrykk, funksjoner, mengdeoperatorer, de reserverte ordene DISTINCT, GROUP BY eller ORDER BY. –Oracle godtar i visse tilfeller oppdatering av vinduer som er basert på mer enn én tabell –JavaDB støtter ikke oppdatering via view’s i det hele tatt

5 Datamodellering og databaser Else Lervik, oktober 2011 side 5 Oppdatering via virtuelle tabeller (views) (ikke implementert i JavaDB) UPDATE –UPDATE daarlige_leverandorer SET lev_navn = 'Olsen' WHERE lev_nr = 5; DELETE –DELETE FROM daarlige_leverandorer WHERE lev_nr = 4; –(krever: DELETE FROM leveranse WHERE lev_nr = 4; ) INSERT –INSERT INTO daarlige_leverandorer VALUES(8, 'Bye', 40 ); –Opprettes, men vises ikke i den virtuelle tabellen –WITH CHECK OPTION forhindrer at rader som ikke passer inn i den virtuelle tabellen blir lagt inn: –CREATE VIEW daarlige_leverandorer2 AS SELECT lev_nr, lev_navn,status FROM leverandor WHERE status < 30 WITH CHECK OPTION; Forandrer dataene i den fysiske tabellen leverandor.

6 Datamodellering og databaser Else Lervik, oktober 2011 side 6 Oppdatering via virtuelle tabeller basert på mer enn én fysisk tabell (ikke pensum) CREATE VIEW lev_info AS SELECT l.lev_nr, lev_navn, p.prod_nr, prod_navn, leveranse.antall FROM leverandor l, leveranse, produkt p WHERE l.lev_nr = leveranse.lev_nr AND p.prod_nr = leveranse.prod_nr AND p.prod_nr < 3; SELECT * FROM lev_info ; –observer utskrift! Ikke tillatt: UPDATE lev_info SET lev_navn = ’Hansen’ WHERE lev_nr = 2; Tillatt i Oracle: UPDATE lev_info SET antall = 500 WHERE lev_nr = 2 AND prod_nr = 1; UPDATE lev_info SET antall = 700 WHERE lev_nr = 2;

7 Datamodellering og databaser Else Lervik, oktober 2011 side 7 NULL-verdier NULL betyr at dataverdien mangler. Det er ikke det samme som tallverdien 0 eller et tekstfelt som inneholder bare blanke tegn. Kan spare oss for mye problemer dersom vi kan unngå NULL-verdier. Kan bruke DEFAULT til å angi verdi som skal gjelde dersom spesiell verdi ikke oppgis: CREATE TABLE leverandor( lev_nr INTEGER, lev_navn VARCHAR(15) NOT NULL, status INTEGER DEFAULT 0, lev_by VARCHAR(15) DEFAULT ' ', CONSTRAINT lev_pk PRIMARY KEY(lev_nr)); Merk at i Oracle (ikke i JavaDB) blir den tomme strengen '' tolket som NULL. For at det ikke skal skje må strengen innholde minst ett blankt tegn. DEFAULT-verdiene tas i bruk f.eks. slik: INSERT INTO leverandor(lev_nr, lev_navn) VALUES(1234, 'Svendsen'); Kan vanligvis ikke bruke default-verdier for fremmednøkler.

8 Datamodellering og databaser Else Lervik, oktober 2011 side 8 NULL-verdier, forts lev_nrlev_navnstatuslev_by 1SvendsenNULL 2Jensen10Porsgrunn 3Bø30Porsgrunn 4Christiansen20Lillehammer 5Andersen30Arendal 6JensenNULL 7Hansen40NULL Eksempel – tabellen lev_med_null: CREATE TABLE lev_med_null( lev_nr INTEGER, lev_navn VARCHAR(15) NOT NULL, status INTEGER, lev_by VARCHAR(15), CONSTRAINT lev_med_null_pk PRIMARY KEY(lev_nr)); INSERT INTO lev_med_null SELECT * FROM leverandor; INSERT INTO lev_med_null( lev_nr, lev_navn, status, lev_by) VALUES(6, 'Jensen', NULL, NULL); INSERT INTO lev_med_null( lev_nr, lev_navn, status, lev_by) VALUES(7, 'Hansen', 40, NULL); UPDATE lev_med_null SET status = NULL, lev_by = NULL where lev_nr = 1;

9 Datamodellering og databaser Else Lervik, oktober 2011 side 9 Test på NULL-verdier Test på likhet –select * from lev_med_null where status is null; Test på ulikhet –select * from lev_med_null where status is not null;

10 Datamodellering og databaser Else Lervik, oktober 2011 side 10 Du må alltid ta hensyn til mulige NULL-verdier Eksempel: –Finn alle som helt sikkert ikke er stasjonert på Lillehammer –Select * from lev_med_null where lev_by <> ‘Lillehammer’; –Finn alle som kan være stasjonert på Lillehammer –Select * from lev_med_null where lev_by = ‘Lillehammer’ or lev_by is null; –Vi burde heller hatt en default-veredi som var satt til f.eks. «Ikke plassert». Disse ville vi fått ut i den første spørringen.

11 Datamodellering og databaser Else Lervik, oktober 2011 side 11 COUNT( ), GROUP BY og NULL --COUNT(*) select count(*) from lev_med_null; --COUNT(lev_by) - teller kun ikke-null-verdier select count(lev_by) from lev_med_null; --COUNT(DISTINCT lev_by) select count(distinct lev_by) from lev_med_null; --GROUP BY - null-verdier tilhører en og samme gruppe -- Hvor mange leverandører i hver by? select lev_by, count(*) "antall" from lev_med_null group by lev_by;

12 Datamodellering og databaser Else Lervik, oktober 2011 side 12 DISTINCT, aggregeringsfunksjoner og NULL-verdier ----DISTINCT - alle nullverdier håndteres som like SELECT DISTINCT status FROM lev_med_null; Aggregeringsfunksjoner –--Finn gjennomsnittlig statusverdi –SELECT AVG(status) FROM lev_med_null; –-- svar 26. Regner ikke med null-verdiene –SELECT SUM(status) / COUNT(status) FROM lev_med_null; –-- svar 26. Regner ikke med null-verdiene – –SELECT SUM(status) / COUNT(*) FROM lev_med_null; –-- svar 18. Regner med alle radene

13 Datamodellering og databaser Else Lervik, oktober 2011 side 13 NULL-verdier i beregninger Beregninger med NULL –Verdien av et aritmetisk uttrykk med NULL blir NULL. NULL-verdier er ikke lik noen annen verdi (unntak GROUP BY og DISTINCT der en NULL-verdi behandles som lik med en annen NULL-verdi): –Rader med NULL-verdier i sammenlikningsfeltet blir dermed ikke med i indre forening –Gjelder spesielt der fremmednøkler er NULL –For å få med disse må en bruke LEFT/RIGHT JOIN

14 Datamodellering og databaser Else Lervik, oktober 2010 side 14 NULL-verdier i delspørringer SELECT lev_nr, lev_by FROM lev_med_null WHERE lev_navn > 'B'; LEV_NRLEV_BY --------------- 1 2Porsgrunn 3Porsgrunn 4Lillehammer 6 7 SELECT * from produkt WHERE prod_by IN (SELECT lev_by FROM lev_med_null WHERE lev_navn > 'B'); PROD_NRPROD_NAVNKODEVEKTPROD_BY 1synålerrød12.0Lillehammer 2bindersgrønn17.0Porsgrunn 4skruerrød14.0Lillehammer 5knapperblå12.0Porsgrunn 6spikerrød19.0Lillehammer SELECT * from produkt WHERE prod_by NOT IN (SELECT lev_by FROM lev_med_null WHERE lev_navn > 'B'); Resultat: Ingen rader Spørringen sjekker om prod_by er blant en mengde med byer som også omfatter null-verdier. Vi kan imidlertid ikke si at en prod_by er lik en av disse null-verdiene. Derfor får vi ikke ut prod_nr 3. Spørringen gir ut prod_by hvis den ikke er blant en mengde med byer som også omfatter null-verdier. Disse null-verdiene kan være den byen vi søker etter. Derfor kan vi ikke si at den ikke er det. Derfor får vi ikke ut noe. Det handler om å ta hensyn til at resultatene fra delspørringen kan inneholder en eller flere NULL-verdier.

15 Datamodellering og databaser Else Lervik, oktober 2011 side 15 UPDATE-setningen Produkt 2 skal skifte til fargekode gul, og vekten skal økes med 3: –update produkt set kode = ’gul’, vekt = 3 where prod_nr = 2; Gjør om alle vektene fra gram til kilo –update produkt set vekt = vekt / 1000; Nullstill antall levert for alle leverandører i Porsgrunn: –update leveranse set antall = 0 where lev_nr in (select lev_nr from leverandor where lev_by = ’Porsgrunn’); Sett lev_by til NULL for leverandør 3: –update leverandor set lev_by = null where lev_nr = 3

16 Datamodellering og databaser Else Lervik, oktober 2011 side 16 Endre primærnøkkelverdi Endre leverandør-nummer 3 til 7: –UPDATE leverandor SET lev_nr = 7 WHERE lev_nr = 3; ikke tillatt hvis autonummerert verdi ikke tillatt pga fremmednøkkelverdi i leveranse UPDATE CASCADE ville gjort dette mulig, og også endret alle aktuelle fremmednøkkelverdier dersom primærnøkkelen ikke er et løpenummer, må vi regne med at det før eller senere kan bli aktuelt å forandre på den system uten UPDATE CASCADE –lage ny leverandør-rad, –endre lev_nr i leveranse til å referere til denne nye raden, –slette opprinnelige leverandør-rad – må defineres som én transaksjon

17 Datamodellering og databaser Else Lervik, oktober 2011 side 17 INSERT-setningen Enkle INSERT-setninger –INSERT INTO leverandor(lev_nr, lev_navn, status, lev_by) VALUES(10, 'Åseby', 20, 'Oslo'); –INSERT INTO leverandor(lev_nr, lev_navn) VALUES(DEFAULT, 'Hansen'); For øvrige felt brukes DEFAULT- og NULL-verdier Kopierer data fra en tabell til en annen (aktuelt ved historikk): –CREATE TABLE daarlige_leverandor( lev_nr INTEGER PRIMARY KEY, lev_navn VARCHAR(15) NOT NULL, status INTEGER, lev_by VARCHAR(15)); –INSERT INTO daarlige_leverandor(lev_nr, lev_navn, status, lev_by) SELECT * FROM leverandor WHERE status < 30; Bør vurdere å slette dataene som er kopiert fra tabellen leverandor

18 Datamodellering og databaser Else Lervik, oktober 2011 side 18 DELETE-setningen DELETE FROM leveranse; –sletter alle dataene DELETE FROM leveranse WHERE.... DELETE FROM leverandor WHERE lev_nr = 3; –ikke tillatt hvis leverandøren har leveranse (fremmednøkkelkrav)

19 Datamodellering og databaser Else Lervik, oktober 2011 side 19 Indekser Indekser muliggjør hurtigsøking blant dataene Vanlig at primærnøkler og fremmednøkler indekseres automatisk, se f.eks. NetBeans/JavaDB Indeksen lagret på egen fil –liten fil som ofte får plass i minnet –nøkkelverdi og peker til de fysiske dataene (blokka der dataene er lagret, én diskaksess pr oppslag) Kan ha flere indekser pr tabell Indeksene ofte organisert som B+-tre (se figur side 273) Mulig å opprette ekstra indekser på kolonner som en vet at ofte etterspørres –CREATE INDEX indeksnavn ON tabell(kolonnenavn); –DROP INDEX indeksnavn; Indekser gir raskere søk, men tregere oppdatering


Laste ned ppt "Datamodellering og databaser Else Lervik, oktober 2011 Forelesning 9, uke 41 SQL, del 2 Eksempelbaseside 2 Virtuelle."

Liknende presentasjoner


Annonser fra Google