database tull
TRANSCRIPT
DatabaserUMB 23/09 2013
Per Bisseberg
Databasestruktur
Atomære verdier
Verdinødvendighet
Unikhet
Sorterte data
Pekere
Kobling av datasett
Atomære verdier
Sammensatt
Repeterende
Sammensatt og repeterende
Avdkode Avdnavn Etasje_og_areal1 Ost 3 / 100
Avdkode Avdnavn Etasjenr Areal17 Administrasjon 3, 5 600
Avdkode Avdnavn Etasje_og_areal17 Administrasjon 3/400, 5 /200
Verdinødvendighet
Er det nødvendig å fylle ut alle verdier?
◦ NOT NULL
avdkode avdnavn etasjenr areal3 Sko 42 Kjøkken 57 900
Unikhet
Ingen krav, verdiene kan være like
Unik, men kan inneholde “for mange kolonner”
Verdiene må være forskjellige (unike)
En utvalgt blant evt. flere kol. Som er unike
Kandidatnøkkel
Primærnøkkel
Supernøkkel
Sortering og pekere
Vi vil ikke ha sorterte data◦ Vi vil kunne sortere data uavhengig av databasestruktur
◦ Dataene er uansett det samme om de er sortert eller ikke
Relasjonsdatabaser benytter ikke pekere
Kobling av datasett
Fremmednøkkel(FK)◦ FK benyttes til å peke til et element i et annet datasett ved sammenkobling av flere sett med data.
◦ FK skjer på identisk/lik verdi i form av en Primærnøkkel(PK) i det tilkoblete datasett.
Kobling av datasett
Ansattnr Fnavn Enavn Adresse Telefonnr Avdkode* Lønn1000 Anders Andersen Aveien 1 12345678 3 2500001001 Bernt Bertsen Bveien 1 2345678901002 Cesar Cesarsen Cveien 1 345678901 1 3000001003 David Davidsen Dveien 1 456789012 1 4000009834 Edgar Edgarsen Eveien 1 567890123 14 250000
Avdkode Avdnavn Etasjenr Areal1 Ost 4 10014 Hvite potteplanter 5 1000
3 Sko 42 Kjøkken 57 9005 Røde potteplanter 1 50
Integritetsregler
entitetsintegritet
referanseintegritet
Entitetsintegritet
Primærnøkkel(PK)◦ Krav: Not NULL
alle verdier av det valgte kolonne/kombinasjon må være unik.
ingen del av felt/kombinasjon kan være NULL.
◦ Formål: alle forekomster (entiteter = "ting") skal kunne
identifiseres og ha mening.
Hvis ansattnr brukes for å identifisere, vil vi ikke tillate like ansattnr, heller ikke at ansattnr er "ukjent".
Referanseintegritet
Fremmednøkkel(FK)◦ Hvis to tabeller er sammensatt i et Primærnøkkel - Fremmednøkkel-forhold, må alle verdier av fremmednøkkelen
◦ enten: "matche med" en verdi i primærnøkkelen
◦ eller: helt ut være NULL (udefinert, finnes ikke)
◦ NB! Gjelder også sammensatt Primærnøkkel
CREATE TABLE
Sammensatt Primærnøkkel
CREATE TABLE kunde (landskode varchar(2) not null,kundenr integer not null,kundenavn varchar(20) not null, kundeadresse varchar(50),PRIMARY KEY (landskode,kundenr)
);
Fremmednøkkel - Enklest mulig(anbefales ikke):
CREATE TABLE ordre (ordrenr integer not null,ordredato date,kundenr integer not null FOREIGN KEY
REFERENCES kunde(kundenr),kontaktperson varchar(30),PRIMARY KEY (ordrenr)
);
Fremmednøkkeldelen til slutt (nødvendig ved sammensatt PK):
CREATE TABLE ordre (ordrenr int not null,ordredato date,kundenr int not null,landskode varchar(2),kontaktperson varchar(30),PRIMARY KEY (ordrenr, kundenr),FOREIGN KEY (landskode, kundenr) REFERENCES kunde(landskode,kundenr)
);
Fremmednøkkeldelen som egen setning (anbefales)
CREATE TABLE ordre (ordrenr int not null,ordredato date,kundenr int not null,kontaktperson varchar(30),primary key (ordrenr)
);
ALTER TABLE ordreADD CONSTRAINT kunde_fkFOREIGN KEY (kundenr)REFERENCES kunde (kundenr);
Metoder for sikring av referanseintegritet
ON DELETE ON UPDATE
◦ SET NULL
◦ CASCADE
Syntax eks◦ ALTER TABLE ordre
ADD CONSTRAINT kunde_fkFOREIGN KEY (kundenr)REFERENCES kunde (kundenr)
◦ ON DELETE CASCADE;
ON DELETE
Utføres når den refererte verdi slettes.◦ CASCADE vil slette den refererende rad
◦ SET NULL vil sette en null verdi i refererende attributt
A_id A_verdi
101 100000
102 50000
TABELL A TABELL B
B_id B_verdi A_id*
B1 25 101
B2 12 102
ON DELETE CASCADE
A_id A_verdi
101 SLETTES 100000
102 50000
TABELL A
TABELL B
B_id B_verdi A_id
B2 12 102
ON DELETE SET NULL
A_id A_verdi
101 SLETTES 100000
102 50000
TABELL A
TABELL B
B_id B_verdi A_id
B1 25 NULL
B2 12 102
ON UPDATE CASCADE
A_id A_verdi
101 ny verdi = 1001 100000
102 50000
TABELL A
TABELL B
B_id B_verdi A_id
B1 25 1001
B2 12 102
ON UPDATE SET NULL
A_id A_verdi
101 ny verdi = 1001 100000
102 50000
TABELL A
TABELL B
B_id B_verdi A_id
B1 25 NULL
B2 12 102
Aggregering
Aggregeringsfunksjoner
SQL kan også brukes til å telle opp(count), summere (sum), finnemaksimum og minimum (max, min), gjennomsnitt (avg) m.m.
Vi kan benytte aggregeringsfunksjoner på hele datasett eller på grupper av data i settet
Aggregeringsfunksjoner
SELECT COUNT(*) FROM kunde;◦ Returnerer antall rader i kunde entiteten
SELECT AVG(omsetning) FROM kundeWHERE omsetning > 2000000;◦ Returnerer gjennomsnitt av omsetning for kunder med omsetning over 2000000
SELECT MAX(omsetning) FROM kunde;◦ Returnerer høyeste omsetning i kunde entiteten.
Gruppering
Om vi vil begrense datasettet til et mindre utvalg kan vi gruppere.
SELECT gruppekode, SUM(omsetning) FROM kunde GROUP BY gruppekode;◦ Returnerer summen av total omsetning for de
individuelle gruppekodene
SELECT COUNT(*) FROM STUDENTGROUP BY hjemsteds_kommune;◦ Returnerer antall studenter representert fra de
individuelle hjemstedskommunene
ALL/ANY
ALL og ANY brukes på resultatet av en delspørring.
◦ ALL er sann hvis alle i delspørringen oppfyller kriteriet. Usant hvis delspørringen er tom.
◦ ANY er sann hvis noen (en eller flere) oppfyller kravet. Sant hvis delspørringen er tom. SOME er ekvivalent med ANY.
ALL/ANY
SELECT * FROM kundeWHERE kundenr >= ALL (SELECT kundenrFROM kunde);
er det samme som
Select * FROM kundeWHERE kundenr >= (SELECT MAX(kundenr) FROM kunde);
ALL/ANY
SELECT * FROM kundeWHERE kundenr <= ALL (SELECT kundenrFROM kunde);
er det samme som
SELECT * FROM kundeWHERE kundenr <= (select min(kundenr) FROM kunde);
ALL/ANY
SELECT * FROM kundeWHERE kundenr > ANY (SELECT kundenrFROM kunde);
er det samme som
SELECT * FROM kunde WHERE kundenr > (SELECT MIN(kundenr) FROM kunde);
ALL/ANY
Litt vanskeligere spørringer, men her ser vi virkelig nytten av ALL/ANY
SELECT gruppekode FROM kundeGROUP BY gruppekodeHAVING AVG(omsetning)>=ALL (SELECT AVG(omsetning)FROM kundeGROUP BY gruppekode);