Repetisjon: Normalformer og SQL

Like dokumenter
Plenum: Nøkler, normalformer og funksjonelle avhengigheter

Løsningsforslag til eksamen i IN2090 Databaser og datamodellering og INF1300 Introduksjon til databaser 6. desember :30 18:30 (4 timer)

Sensorveiledning for IN2090 og INF desember :30 18:30 (4 timer)

God Databasedesign: På vei mot Normalformer

Relasjonsdatabaseteori

Normalformer or Normalisering 1NF, 2NF, 3NF, BCNF

Metaspråket for å beskrive grammatikk

Oppgave: Finn navn og tittel på alle som har arbeidet på prosjektet «Vintersalg»

Datamodellering og databaser SQL, del 2

Databaser: Relasjonsmodellen, del I

SQL Structured Query Language

SQL Structured Query Language. Definere tabeller Skranker Fylle tabeller med data

EKSAMENSFORSIDE Skriftlig eksamen med tilsyn

UNIVERSITETET I OSLO SQL. Structured Query Language. (The intergalactic dataspeak) Institutt for Informatikk. INF Ragnar Normann 1

INF1300 SQL Structured Query Language del 1. Stoff som blir/ble forelest i oktober 2013

Datamodellering og databaser SQL, del 2

SQL Structured Query Language. Repetisjon av select spørringer Nestede select spørringer Mengdeoperasjoner Views Flere operatorer

Institutt for datateknikk. Fag TDT4145 Datamodellering og databasesystemer Løsningsforslag til øving 3: Algebra og SQL

Datamodellering og databaser SQL, del 2

SQL, del 1 - select. Hva er SQL?

Indre select-setninger Nestede select-setninger

SQL Structured Query Language

Relasjoner terminologi

Miniverden og ER- modell

2: Hvilke verdier forekommer i attributtet filmtype i relasjonen filmitem? Lag en oversikt over filmtypene og hvor mange filmer innen hver type.

En lett innføring i foreninger (JOINs) i SQL

EKSAMEN 6102 / 6102N DATABASER

Oppgave 1 (Opprett en database og en tabell)

EKSAMENSFORSIDE Skriftlig eksamen med tilsyn

Alle attributter har NULL som mulig verdi. mulige verdier for integer: NULL, 0, 1, 2, 3...

Integritetsregler i SQL. Primærnøkler

INF1300 Introduksjon til databaser: SQL Structured Query Language. En første introduksjon Lysark til forelesning onsdag 22.

Databaser. - Normalisering -

INF1300 Introduksjon til databaser: SQL Structured Query Language. En første introduksjon Lysark til forelesning mandag 14.

Normalisering. Hva er normalisering?

Normalisering. Hva er normalisering?

INF1300 Introduksjon til databaser

UNIVERSITETET I OSLO SQL. Structured Query Language. (forts.) Institutt for Informatikk. INF Ragnar Normann 1

EKSAMEN DATABASER

Databaser. Relasjonsmodellen 2 Læreboka: Kap. 2 Relasjonsmodellen

D: Ingen trykte eller håndskrevne hjelpemiddel tillatt. Bestemt, enkel kalkulator tillatt.

Løsningsskisse til Eksamensoppgave i TDT4145 Datamodellering og databasesystemer

INF1300 Det meste av resten av SQL. Utleggsark v. 2.0

Relasjoner terminologi. Kopi av lysark fra forelesningen 13. oktober. Legges ut inntil notatet som samler alt om SQL kommer...

SQL, del 1 - select. Hva er SQL?

Join. Intuitivt: Skjøte sammen to relasjoner. Intuitivt: 1. Beregn R S 2. Velg ut de tuplene som tilfredsstiller joinbetingelsen C

Integritetsregler i SQL

LC238D Datamodellering og databaser SQL, del 1 - SELECT

Oppgaver Oppgave a: Sett opp mulige relasjoner

UNIVERSITETET I OSLO SQL. Structured Query Language. (forts.) Institutt for Informatikk. INF Ellen Munthe-Kaas 1

SQL SELECT-FROM-WHERE. Skjemadefinisjon og datainnsetting i SQL. Semantikk bak ein-relasjons-spørring

UNIVERSITETET I OSLO SQL. Structured Query Language. (The intergalactic dataspeak) Institutt for Informatikk. INF Ellen Munthe-Kaas 1

Dagens tema: Oppdateringsanomalier Normalformer

INF1300 Det meste av resten av

INF1300 Introduksjon til databaser

Løsningsforslag maskindatabasen på Ifi SQL og normalisering

INF1300 Introduksjon til databaser

SQL 3: Opprette tabeller, datainnsetting og utsnitt

1. SQL datadefinisjon og manipulering

EKSAMEN. Kontroller at oppgavesettet er komplett før du begynner å besvare spørsmålene.

Løsningsskisse til eksamensoppgave i TDT4145 Datamodellering og databasesystemer

Høgskolen i Telemark EKSAMEN 6102 DATABASER Tid: Hjelpemidler: Vedlegg: Eksempeldata til oppgave 1

5602 DATABASER Bokmål/nynorsk. 17 (inkludert denne forsiden) Eksamensresultatene blir offentliggjort på Studentweb.

UNIVERSITETET SQL. Structured Query Language (forts.) Institutt for Informatikk. INF Ellen Munthe-Kaas 1

Eksamensoppgave i TDT4145 Datamodellering og databasesystemer

Oppgave 1 1. Spørring: Resultattabell: 2. Spørring: Resultattabell: 3. Spørring:

UNIVERSITETET I OSLO

INF1300 Introduksjon til databaser

Oppdateringsanomalier Normalformer

INF1300 Introduksjon til databaser: SQL Structured Query Language

Løsningsforlag for oblig 1, databaser 2010

Løsningsforslag for Eksamensoppgave i TDT4145 Datamodellering og databasesystemer

INF1300 Introduksjon til databaser

IN2090 Databaser og datamodellering. Databasedesign og normalformer

1. Innføring i bruk av MySQL Query Browser

Relasjonsdatabasedesign

Relasjonsdatabasedesign

HØGSKOLEN I SØR-TRØNDELAG

Integritetsregler i SQL

Dagens tema: Relasjonsmodellen (funksjonelle avhengigheter og nøkler, integritetsregler) Realisering: Fra ORM til relasjoner

Relasjonsdatabasedesign

Løsningsskisse til eksamensoppgave i TDT4145 Datamodellering og databasesystemer

SQL: Repe)sjon og eksempler Deniz Akkøk Mathias Stang

UNIVERSITETET I OSLO SQL. Structured Query Language. (The intergalactic dataspeak) INF Ellen Munthe-Kaas 1. Institutt for Informatikk

SQL: Datatyper m.m. Evgenij Thorstensen V18. Evgenij Thorstensen SQL: Datatyper m.m. V18 1 / 12

SQL: SELECT-spørringer

Notater: INF1300. Veronika Heimsbakk 8. januar 2013

Skisse til løsning av eksamensoppgave i TDT4145 Datamodellering og databasesystemer

EKSAMEN. Emnekode: ITF Emne: Databaser. Dato: Eksamenstid: Hjelpemidler: Syntaksoversikt (vedlagt oppgaven)

UNIVERSITETET. Relasjonsdatabasedesign

Fag TDT4145 Datamodellering og databasesystemer Løsningsforslag til øving 3: Algebra og SQL

Problemer med Indre joins. Inner joins og manglende verdier med aggregater. Left Outer Join. Outer Joins. Hvor mange har kjøpt hvert produkt?

IN2090 Introduksjon til databaser

D: Ingen trykte eller håndskrevne hjelpemiddel tillatt. Bestemt, enkel kalkulator tillatt.

INF1300 Introduksjon til databaser

Løsningsskisse til Eksamensoppgave i TDT4145 Datamodellering og databasesystemer

Løsning til Eksamensoppgave i TDT4145 Datamodellering og databasesystemer

SELECT DISTINCT Fornavn, Etternavn, Programtittel FROM Program P, Medvirkende M, Deltagelse D. SELECT Tilgjengelighet FROM Program

INF1300 Relasjonsalgebra. Et matematisk fundament for å forstå SQL-setninger

SQL Introduksjonskurs. Oversikt

Transkript:

IN2090 databaser og datamodellering Repetisjon: Normalformer og SQL Mathias Stang og Stein Michael Storleer 21. november 2018 1

Agenda Normalformer Funksjonelle avhengigheter Nøkler Finne hvilke normalformer relasjoner tilfredsstiller SQL CREATE TABLE, VIEW, INSERT/UPDATE/DELETE Alle viktige delene av et SELECT-uttrykk JOINs Aggregering Subspørringer, strategier for å sette sammen komplekse spørringer Mengdeoperasjoner 2

Første normalform 1NF Definisjon: Relasjonen inneholder kun atomære verdier Atomære verdier er verdier «vi ikke kan dele opp» Er «adresse» atomær, eller kan vi dele den opp i postnummer/sted? Er en string atomær, eller kan vi dele den opp i flere chars? Egentlig mener vi med atomære verdier at «for vår datamodell, er dette en verdi uten bestanddeler vi bryr oss om» Alle relasjoner vi har jobbet med i IN2090 har vært på 1NF! 3

Relasjoner som bryter 1NF filmid genre title 85908 Action, Sci-Fi, Thriller The Matrix 26103 Action, Sci-Fi Planet of the Apes 1320611 Action, Sci-Fi Planet of the Apes Bryter 1NF fordi genre er en liste av verdier Hvert element i genre kan altså skilles ut som hver sin verdi Variant som tilfredsstiller 1NF filmid genre title 85908 Action The Matrix 85908 Sci-Fi The Matrix 85908 Thriller The Matrix 26103 Action Planet of the Apes 26103 Sci-Fi Planet of the Apes 1320611 Action Planet of the Apes 1320611 Sci-Fi Planet of the Apes 4

Funksjonelle avhengigheter (FD-er) Hvis verdiene i ett attributt A er bestemt av verdiene i et annet attributt X, har vi en funksjonell avhengighet X A Vi sier «X bestemmer A», eller «A er avhengig av X» Eksempel: Person(pid, postnr, poststed) FD: postnr poststed Fordi vi med et gitt postnummer alltid kan avgjøre hva poststed er (postnr 0373 er alltid i Oslo, 7491 alltid Trondheim) I tillegg: pid postnr pid poststed Fordi med en gitt primærnøkkel, kan vi bestemme de andre verdiene Men vi har IKKE en FD posted postnr, fordi med poststed «Oslo», så kan det finnes flere mulige postnumre (0373, 0130, 0010 osv). 5

Eksempel: Nøkler Supernøkkel: En mengde attributter der verdiene i disse attributtene er unike (distinkte) i en relasjon Kandidatnøkkel: En minimal mengde attributter der verdiene er unike. Dvs at ved å fjerne et attributt, er det ikke lenger noen supernøkkel Primærnøkkel: En spesielt utpekt kandidatnøkkel der ingen verdier kan være NULL Nøkkelattributt: Attributter som er med i en kandidatnøkkel Se forelesning 26. sep og 24. okt for flere detaljer. + ukeoppgaver uke 6 og 10 Filmgenre(filmid, genre, title) filmid genre title 85908 Action The Matrix 85908 Sci-Fi The Matrix 85908 Thriller The Matrix 26103 Action Planet of the Apes 26103 Sci-Fi Planet of the Apes 1320611 Action Planet of the Apes 1320611 Sci-Fi Planet of the Apes Supernøkler: {filmid, genre}, {filmid, genre, title} Kandidatnøkkel: {filmid, genre} Primærnøkkel: {filmid, genre} Nøkkelattributter: filmid og genre 6

Normalformer og FD-er For normalformene 2NF, 3NF og BCNF er det FD-ene vi ser på Gitt en relasjon R, med en mengde FD-er på formen X A, der X og A er en mengde attributter, kan vi avgjøre normalformen Eksempel: Relasjonen R er følgende relasjon: Person(pid, postnr, poststed) FD-ene på formen X A: postnr poststed (X er postnr, A er poststed) pid postnr (X er pid, A er postnr) pid poststed (X er pid, A er postnr) 7

Normalformene Gitt en relasjon R, med en mengde FD-er på formen X A, der X og A er en mengde attributter 1NF: R inneholder kun atomære verdier/attributter 2NF: X er en supernøkkel i R, eller A er et nøkkelattributt, eller X er ikke en delmengde av noen nøkler i R 3NF: X er en supernøkkel i R, eller A er et nøkkelattributt BCNF: X er en supernøkkel i R Ikke-normalisert lagring 1NF 2NF 3NF BCNF 8

Vi har FD-en X A Nei: X A bryter BCNF Er X en supernøkkel? Er A et nøkkelattributt? Ja: X A oppfyller BCNF Ja: X A bryter BCNF, men oppfyller 3NF 1NF: Bare atomære verdier/attributter 2NF: X er en supernøkkel i R, eller A er et nøkkelattributt, eller X er ikke en delmengde av noen nøkler i R 3NF: X er en supernøkkel i R, eller A er et nøkkelattributt BCNF: X er en supernøkkel i R Nei: X A bryter 3NF Er X en delmengde av en nøkkel? Nei: X A bryter 3NF, men oppfyller 2NF Ja: X A bryter 2NF, men oppfyller 1NF 9

Eksempel Relasjon R: Person(pid, postnr, poststed) FD-ene på formen X A: postnr poststed pid postnr pid poststed 1NF: Bare atomære verdier/attributter 2NF: X er en supernøkkel i R, eller A er et nøkkelattributt, eller X er ikke en delmengde av noen nøkler i R 3NF: X er en supernøkkel i R, eller A er et nøkkelattributt BCNF: X er en supernøkkel i R Avgjør normalformen for hver FD FD-en med den laveste normalformen gir oss normalformen til relasjonen 10

Eksempel 2 Student_emne(id, emnekode, bnavn, karakter) FD-er: id, emnekode bnavn, karakter bnavn, emnekode id, karakter id bnavn bnavn id 1NF: Bare atomære verdier/attributter 2NF: X er en supernøkkel i R, eller A er et nøkkelattributt, eller X er ikke en delmengde av noen nøkler i R 3NF: X er en supernøkkel i R, eller A er et nøkkelattributt BCNF: X er en supernøkkel i R Rettelser (grønt): id, emnekode bnavn er IKKE en triviell FD. Hvilken normalform er relasjonen på? Kravet for en triviell FD er at gitt FD-en X A, så kan ikke A være en delmengde av X. Det ble sagt feil i opptaket. 11

Eksempel 3 Timeliste(ansattnr, uke, år, navn, timer) FD-er: ansattnr, uke, år navn, timer ansattnr navn 1NF: Bare atomære verdier/attributter 2NF: X er en supernøkkel i R, eller A er et nøkkelattributt, eller X er ikke en delmengde av noen nøkler i R 3NF: X er en supernøkkel i R, eller A er et nøkkelattributt BCNF: X er en supernøkkel i R Hvilken normalform er relasjonen på? Flere oppgaver om normalformer: ukeoppgaver uke 12 12

SQL 13

CREATE TABLE CREATE TABLE Datatyper: text/varchar, int, date, time, char(n), boolean PRIMARY KEY på én eller flere verdier NOT NULL UNIQUE (for kandidatnøkler) Fremmednøkler på én eller flere verdier CHECK Flere detaljer i forelesning 26. sep 14

CREATE TABLE: Eksempel Tliste(timelistenr, [status], [beskrivelse]) Tlistelinje(timelistenr, linjenr, timeantall, [beskrivelse], [kumulativt_timeantall]) CREATE TABLE tliste ( timelistenr int primary key, status text check (status = 'aktiv' or status = 'levert' or status = 'utbetalt'), beskrivelse text ); CREATE TABLE tlistelinje ( timelistenr int references tliste(timelistenr), linjenr int, timeantall int not null, beskrivelse text unique, kumulativt_timeantall int, primary key(timelistenr, linjenr) ); 15

CREATE VIEW CREATE VIEW navn AS (select ); Et view lagrer ikke tabellen. I stedet lagrer vi bare spørringen, og hver gang vi ønsker å bruke et view i en spørring, kjøres spørringen til viewet Flere detaljer i forelesning 17. okt 16

INSERT INTO INSERT INTO <tabell> VALUES ( ) INSERT INTO <tabell> (feltnavn ) VALUES ( ) INSERT INTO <tabell> SELECT FROM UPDATE, DELETE UPDATE <tabell> SET kolonne1 = verdi, kolonne2 = v WHERE DELETE FROM <tabell> WHERE 17

SELECT SELECT [ DISTINCT ] [ * uttrykk [ [ AS ] alias] [,...] ] [ FROM tabelluttrykk ] [ WHERE betingelse ] [ GROUP BY grupperingsattributt [, ] ] [ HAVING betingelse ] [ { UNION INTERSECT EXCEPT } [ ALL ] select ] [ ORDER BY uttrykk [ ASC DESC ] ] [ LIMIT antall ] [ OFFSET start ] 18

Uttrykk i SELECT 1 Uttrykket i SELECT er en liste av uttrykk som spesifiserer hvordan radene skal se ut Uttrykket kan inneholde attributter fra en tabell: SELECT timelistenr, beskrivelse FROM tliste; timelistenr beskrivelse 1 HMS 2 Test 3 Virksomhet 19

Uttrykk i SELECT 2 Vi kan bruke statiske verdier: SELECT timelistenr, "Hei", 123, null FROM tliste; timelistenr?column??column??column? 1 Hei 123 null 2 Hei 123 null 3 Hei 123 null Vi kan spesifisere hva kolonnenavnet skal være: SELECT timelistenr AS nr, 'Hei' AS hilsen, 123 AS tall, null AS "ingenting her" FROM tliste; nr hilsen tall ingenting her 1 Hei 123 null 2 Hei 123 null 3 Hei 123 null 20

Uttrykk i SELECT 3 Vi kan også kombinere disse med funksjonskall, sammensatte uttrykk osv: SELECT timelistenr * 10 AS nr, 'Beskr.: ' beskrivelse, upper(beskrivelse) FROM tliste; nr?column? upper 10 Beskr.: HMS HMS 20 Beskr.: Test TEST 30 Beskr.: Virksomhet VIRKSOMHET 21

Andre funksjoner Dere trenger ikke kunne funksjoner som SUBSTR, LOWER, UPPER Men: Dere må kunne bruke dem om funksjonen blir definert i oppgaveteksten Eksempeloppgave: Skriv ut alle firstname i tabellen person med store bokstaver Tilleggsinformasjon: Funksjonen upper(string) gjør alle bokstaver i en string om til store bokstaver (f.eks. gir upper('ola') resultatet OLA) Da må dere kunne skrive løsningen: SELECT upper(firstname) FROM person; Unntak: Dere må kunne aggregeringsfunksjoner og stringkonkatenering (enten med operatoren eller funksjonen CONCAT) 22

JOIN 23

INNER JOIN A B id navn id navn 1 Martin 1 Ida 2 Ida 2 Mathias 3 Hanne 3 Ole 4 Ole 4 Øyvind SELECT * FROM A INNER JOIN B ON A.navn = B.navn; A.id A.navn B.id B.Navn 2 Ida 1 Ida 4 Ole 3 Ole A B Vi får bare med rader der betingelsen slår til for både tabell A og tabell B. 24

LEFT [OUTER] JOIN A B id navn id navn 1 Martin 1 Ida 2 Ida 2 Mathias 3 Hanne 3 Ole 4 Ole 4 Øyvind SELECT * FROM A LEFT JOIN B ON A.navn = B.navn; A.id A.navn B.id B.Navn 1 Martin null null 2 Ida 1 Ida 3 Hanne null null 4 Ole 3 Ole A B Vi tar med alle rader fra tabell A, samt radene fra tabell B som matcher betingelsen 25

RIGHT [OUTER] JOIN A B id navn id navn 1 Martin 1 Ida 2 Ida 2 Mathias 3 Hanne 3 Ole 4 Ole 4 Øyvind SELECT * FROM A RIGHT JOIN B ON A.navn = B.navn; A.id A.navn B.id B.Navn 2 Ida 1 Ida null null 2 Mathias 4 Ole 3 Ole null null 4 Øyvind A B Motsatt av LEFT JOIN: Vi tar med alle rader fra tabell B, samt radene fra tabell A som matcher betingelsen 26

FULL [OUTER] JOIN A B id navn id navn 1 Martin 1 Ida 2 Ida 2 Mathias 3 Hanne 3 Ole 4 Ole 4 Øyvind SELECT * FROM A FULL OUTER JOIN B ON A.navn = B.navn; A.id A.navn B.id B.Navn 1 Martin null null 2 Ida 1 Ida 3 Hanne null null 4 Ole 3 Ole null null 2 Mathias null null 4 Øyvind A B Vi tar med alle rader fra tabell A og B. Der betingelsen matcher, har radene data fra begge. Hvis det ikke er noen match, blir dataene på manglende side satt til null. 27

id CROSS JOIN A navn 1 Martin 2 Ida 3 Hanne 4 Ole id B navn 1 Ida 2 Mathias 3 Ole 4 Øyvind Gir oss kartesisk produkt. Vi kan etterpå filtrere resultatene, f.eks: SELECT * FROM TabellA, TabellB; WHERE TabellA.navn = TabellB.navn; (implisitt join, tilsvarer INNER JOIN) SELECT * FROM TabellA CROSS JOIN TabellB; Gir samme resultat som: SELECT * FROM TabellA, TabellB; A.id A.navn B.id B.Navn 1 Martin 1 Ida 1 Martin 2 Mathias 1 Martin 3 Ole 1 Martin 4 Øyvind 2 Ida 1 Ida 2 Ida 2 Mathias 2 Ida 3 Ole 2 Ida 4 Øyvind 3 Hanne 1 Ida 3 Hanne 2 Mathias 3 Hanne 3 Ole 3 Hanne 4 Øyvind 28

NATURAL JOIN A B id navn id navn 1 Martin 1 Ida 2 Ida 2 Mathias 3 Hanne 3 Ole 4 Ole 4 Øyvind SELECT * FROM TabellA NATURAL JOIN TabellB; id (0 rader) navn Det finnes ingen rader i A og B der både navn og id er like 29

NATURAL JOIN A B nr navn id navn 1 Martin 1 Ida 2 Ida 2 Mathias 3 Hanne 3 Ole 4 Ole 4 Øyvind SELECT * FROM TabellA NATURAL JOIN TabellB; A.nr B.id Navn 2 1 Ida 4 3 Ole Nesten identisk med INNER JOIN MEN: Merk antall kolonner i resultatet! 30

Operatorer i betingelser (WHERE, HAVING) > < >= <=!= <> + * - / AND, OR LIKE med wildcards % og _ IS NULL, IS NOT NULL [NOT] IN (a, b, c) [NOT] IN (SELECT ) [NOT] EXISTS (SELECT ) Også kjekt å vite om: BETWEEN x AND y ANY og ALL 31

GROUP BY og aggregering Dere må kunne aggregeringsfunksjonene min, max, avg, sum, count. Forskjellen på count(*), count(attr) og count(distinct attr) Forskjellen på WHERE og HAVING Gruppere på ett eller flere attributer For flere detaljer, se forelesning 19. sep 32

Subspørringer Vi kan generelt sette inn subspørringer 3 steder: Der vi vanligvis skriver en tabell: SELECT * FROM tabell a; SELECT * FROM (SELECT x, y FROM tabell) a; I stedet for en liste, kan vi lage en subspørring som returnerer 1 kolonne: SELECT * FROM tabell WHERE attr IN (1, 2, 3); SELECT * FROM tabell WHERE attr IN (SELECT tall FROM ); I stedet for en verdi, kan vi lage en subspørring som returnerer 1 kolonne med 1 rad: SELECT * FROM tabell WHERE rating = 9; SELECT * FROM tabell WHERE rating = (SELECT MAX( ) FROM t); 33

EXISTS vs IN EXISTS bruker vanligvis korrelerte subspørringer Bruk av WITH I stedet for å bruke views, kan man bruke WITH på lignende måte: WITH egensporring AS (SELECT ) SELECT * FROM egensporring 34

Mengdeoperasjoner UNION [ALL] INTERSECT EXCEPT Mengde- vs bagoperasjoner 35