Fødselsdato (dmå) er født har lønn Ansatt (ansnr) Beløp (NKr)+ Telefon (tlfnr) har har betalt skatt Fødselsdato (dmå) er født har lønn Ansatt (ansnr) Beløp (NKr)+ Telefon (tlfnr) har har betalt skatt
Eksempel på relasjonsskjema Ansatt ( ansnr , fdato, lønn, [skatt] ) Telefon ( ansnr , tlfnr ) *Nettolønn ( ansnr , netto ) ::= ansnr , lønn - skatt from Ansatt
create table Ansatt ( ansnr integer primary key, fdato date not null check ( fdato between ’1920-01-01’ and CURRENT_DATE ), lønn decimal(9,2) not null, skatt decimal(9,2) ) create table Telefon ( ansnr integer references Ansatt, tlfnr char(15) not null, primary key (ansnr , tlfnr) ) create view Nettolønn (ansattnr, netto) as select ansattnr, lønn - skatt from Ansatt
Operatorer på sett/mengder For å : Union A B - slå sammen 2 mengder Snitt A B - finne felles undermengde Differanse A - B - finne unik undermengde i A Krever at A og B er union-kompatible : like mange kolonner korresponderende domener Hva representerer mengdene A og B ? Kartesisk produkt (cross join) A x B For å generere alle parkombinasjoner av elementene fra A og B
Operatorer på tabeller Seleksjon T where c Utvalg av rader som tilfredsstiller c Projeksjon T[ a,b,...] Utvalg av kolonnene a,b,... med repeterte rader fjernet. Join A x B where A.a B.b Kombinere kolonner fra forskjellige tabeller ved sammenligning av kolonnene a og b. Natural join A B Sammenligner med = på kolonne med felles navn (og domene). Assosiativ Divisjon A B Finner hvilke rader i A er assosiert med alle rader i B
Structured Query Language Definere datastruktur Implementere relasjonsskjema Tabellskjema Beskrankninger Utledninger Spørre etter informasjon i databasen Oppdatere og vedlikeholde database For relasjonelle databaser Deklarativt, ikke prosedyre språk Forskjellige versjoner av standard
Relasjonsalgebra vs SQL T[a,b,...] select distinct a,b,... from T T where c select * from T where c T[a,b,...] where c select distinct a,b,... from T where c select a,b,... from T where c AxB where A.aB.b select * from A join B where A.aB.b A B select * from A natural join B Union select ... union select ... Snitt select ... intersect select ... Differanse select ... except select ...
Join R1: A a1 a2 a3 B b1 b2 b4 R2 : B b1 b2 b3 C c1 c2 c3 c4 R1 join R2 : A a1 a2 a3 a4 ? B b1 b2 b4 b3 C c1 c2 c3 ? b4 1 2 3 Inner join select * from R1 natural join R2 select * from R1 natural left join R2 select * from R1 natural right join R2 select * from R1 natural full join R2 1 1+2 1+3 1+2+3 Outer join
Beskrankninger Entydighet primary key unique Totale roller not null references Andre check ( betingelse ) i noen tilfeller : spesialdesignet kode
Rmap prosedyre Prioritering : Korrekthet, klarhet, effektivitet Mål : Unngå redundans. Minimalisere antall tabeller 2 hovedsteg : Faktatyper med sammensatt entydighetsbeskrankninger mappes til egne tabeller. Faktatyper med funkjsonelle roller tilknyttet samme entitetstype, grupperes inn i samme tabell, med entitetstypen sin identifikator som nøkkel.