Kunnskapsorganisasjon og gjenfinning 1 Spørring mot databaser: SQL 2 - Spørring mot flere tabeller SQL 2 - flere tabeller 12.11.2014 Dagens program SQL oppgave 2 - løsningsforslag Spørring mot flere tabeller SQL oppgave 1
SQL kort sagt SELECT kolonner - Her velges det hvilke kolonner som skal vises i trefflista - Beregningsfunksjoner utføres også her. FROM tabeller - Her velges det hvilke(n) tabell(er) det skal søkes i. [WHERE betingelser] - Her formuleres betingelsene for søket (valgfri) - Det kan søkes i andre kolonner enn dem som vises i trefflisten (SELECT) [GROUP BY kolonner] - Brukes til å gruppere treffene (valgfri) - Brukes gjerne sammen med beregningsfunksjoner [ORDER BY kolonner]; - Her sorteres treffene (valgfri) SQL oppgave 2 løsningsforslag 2
Spørring mot flere tabeller Ubegrenset antall kolonner Ubegrenset antall tabeller Kobling: primærnøkler og fremmednøkler Join-betingelse Utgangspunktet for spørringer NRK-eksempel Program (ProgramID, Programtittel, Programinfo, Kategori, Varighet, Aldersgrense, Tilgjengelighet, Teksting, Episodenr, sesongid) Innslag (InnslagID, Innslagtittel) Sesong (SesongID, Sesongnavn, Episodeantall, SerieID) Serie (SerieID, Serietittel, Seriebeskrivelse) Medvirkende (MedvirkendeID, Fornavn, Etternavn) Sendetidspunkt (TidspunktID, Kanal, Sendedato, Klokkeslett, ProgramID) Programinnhold (InnslagID, ProgramID, Nummer, Tidskode) Deltagelse (ProgramID, MedvirkendeID, Rolle)
Hente data fra flere tabeller SELECT kolonner FROM tabeller; Spørring mot flere tabeller: bruker komma mellom tabellnavnene Vi vil hente ut en liste over alle programmer og deres sendetidspunkter: Program (ProgramID, Programtittel, Programinfo, Kategori, Varighet, Aldersgrense, Tilgjengelighet, Teksting, Episodenr, sesongid) Sendetidspunkt (TidspunktID, Kanal, Sendedato, Klokkeslett, ProgramID) Forslag til SQL-spørring: SELECT ProgramID, Programtittel, Episodenr, TidspunktID, Kanal, Sendedato, Klokkeslett, ProgramID FROM Program, Sendetidspunkt; SELECT ProgramID, Programtittel, Episodenr, TidspunktID, Kanal, Sendedato, Klokkeslett, ProgramID FROM Program, Sendetidspunkt; ProgramID Programtittel Episodenr TidspunktID Kanal Sendedato Klokkeslett ProgramID 1 Sjokoladesuget7 50 NRK1 12.08.2014 22:15 1 2 Sportsrevyen 7 50 NRK1 12.08.2014 22:15 1 10:1 10 50 NRK1 12.08.2014 22:15 1 1 Sjokoladesuget7 51 NRK1 09.0.2014 19:45 2 2 Sportsrevyen 7 51 NRK1 09.0.2014 19:45 2 10:1 10 51 NRK1 09.0.2014 19:45 2 1 Sjokoladesuget7 52 NRK 02.09.2014 2:25 2 Sportsrevyen 7 52 NRK 02.09.2014 2:25 10:1 10 52 NRK 02.09.2014 2:25 Hva har skjedd her? 4
Kartesisk produkt Resultatet er det kartesiske produktet av de to tabellene. Hver rad i én tabell kombineres med hver rad i en annen tabell Resultattabellens rader: Produktet av radene i de to tabellene (rader i Program) x (rader i Sendetidspunkt) = 9 rader Resultattabellens kolonner: Summen av kolonnene i de to tabellene (kolonner i Program) + 5 (kolonner i Sendetidspunkt) = 8 kolonner Resultat: mange irrelevante rader Riktige rader i tabellen ProgramID Programtittel Episodenr TidspunktID Kanal Sendedato Klokkeslett ProgramID 1 Sjokoladesuget 7 50 NRK1 12.08.2014 22:15 1 2 Sportsrevyen 7 50 NRK1 12.08.2014 22:15 1 10:1 10 50 NRK1 12.08.2014 22:15 1 1 Sjokoladesuget 7 51 NRK1 09.0.2014 19:45 2 2 Sportsrevyen 7 51 NRK1 09.0.2014 19:45 2 10:1 10 51 NRK1 09.0.2014 19:45 2 1 Sjokoladesuget 7 52 NRK 02.09.2014 2:25 2 Sportsrevyen 7 52 NRK 02.09.2014 2:25 10:1 10 52 NRK 02.09.2014 2:25 5
Kvalifiserte kolonnenavn Brukes dersom flere tabeller har kolonner med identisk navn Typisk: primærnøkler og fremmednøkler tabellnavn.kolonnenavn Må brukes i spørringer mot flere tabeller SELECT Program.ProgramID, Programtittel, Episodenr, TidspunktID, Kanal, Sendedato, Klokkeslett, Sendetidspunkt.ProgramID FROM Program, Sendetidspunkt; Løsning: Join-betingelse ProgramID er primærnøkkel i Program og fremmednøkkel i Sendetidspunkt. Riktige rader i kartesisk produkt-tabellen: ProgramID har identiske verdier i de to kolonnene For å hente ut bare radene med identiske verdier: join-betingelse SELECT Program.ProgramID, Programtittel, Episodenr, TidspunktID, Kanal, Sendedato, Klokkeslett, Sendetidspunkt.ProgramID FROM Program, Sendetidspunkt WHERE Program.ProgramID = Sendetidspunkt.ProgramID; 6
Resultat med join-betingelse SELECT Program.ProgramID, Programtittel, Episodenr, TidspunktID, Kanal, Sendedato, Klokkeslett, Sendetidspunkt.ProgramID FROM Program, Sendetidspunkt WHERE Program.ProgramID = Sendetidspunkt.ProgramID; Program. ProgramID Programtittel Episodenr TidspunktID Kanal Sendetidspunkt. Sendedato Klokkeslett ProgramID 1 Sjokoladesuget 7 50 NRK1 12.08.2014 22:15 1 2 Sportsrevyen 7 51 NRK1 09.0.2014 19:45 2 10:1 10 52 NRK 02.09.2014 2:25 Vise ProgramID bare 1 gang Ny spørring: SELECT Program.ProgramID, Programtittel, Episodenr, TidspunktID, Kanal, Sendedato, Klokkeslett FROM Program, Sendetidspunkt WHERE Program.ProgramID = Sendetidspunkt.ProgramID; Program. ProgramID Programtittel Episodenr TidspunktID Kanal Sendedato Klokkeslett 1 Sjokoladesuget 7 50 NRK1 12.08.2014 22:15 2 Sportsrevyen 7 51 NRK1 09.0.2014 19:45 10:1 10 52 NRK 02.09.2014 2:25 7
Hvilke programmer ble vist på NRK1? Datene er lagret i to tabeller: Program (ProgramID, Programtittel, Programinfo, Kategori, Varighet, Aldersgrense, Tilgjengelighet, Teksting, Episodenr, sesongid) Sendetidspunkt (TidspunktID, Kanal, Sendedato, Klokkeslett, ProgramID) SELECT Programtittel, Kanal FROM Program, Sendetidspunkt WHERE Kanal= NRK1 AND Program.ProgramID = Sendetidspunkt.ProgramID; Programtittel Kanal Sjokoladesuget NRK1 Sportsrevyen NRK1 Foreløpig oppsummering Med join-betingelser unngår vi å få det kartesiske produkt som svar på spørringen vår. Én-til-mange sammenhengstype: én join-betingelse. Rekkefølgen på tabellene har ingen betydning. Når flere kolonner har samme navn, må vi bruke kvalifiserte kolonnenavn: tabellnavn.kolonnenavn 8
Mange-til-mange sammenhengstyper Tre relasjoner: De to opprinnelige entitetstypene koblingstabellen To join-betingelser Antallet join-betingelser i en spørring: = antallet tabeller 1 Hvilke medvirkende har deltatt i de forskjellige programmene? Må spørre mot tre tabeller: Program (ProgramID, Programtittel, Programinfo, Kategori, Varighet, Aldersgrense, Tilgjengelighet, Teksting, Episodenr, sesongid) Medvirkende (MedvirkendeID, Fornavn, Etternavn) Deltagelse (ProgramID, MedvirkendeID, Rolle) SELECT Fornavn, Etternavn, Programtittel FROM Program, Medvirkende, Deltagelse WHERE Program.ProgramID = Deltagelse.ProgramID AND Medvirkende.MedvirkendeID = Deltagelse.MedvirkendeID; 9
SELECT Fornavn, Etternavn, Programtittel FROM Program, Medvirkende, Deltagelse WHERE Program.ProgramID = Deltagelse.ProgramID AND Medvirkende.MedvirkendeID = Deltagelse.MedvirkendeID; Fornavn Etternavn Programtittel Kirsten Rokstad Sjokoladesuget Andreas Hagen Sportsrevyen Maria Bello 10:1 Maria Bello 10:1 Maria Bello er både skuespiller og regissør i 10:1 Spørring uten dubletter SELECT DISTINCT Fornavn, Etternavn, Programtittel FROM Program, Medvirkende, Deltagelse WHERE Program.ProgramID = Deltagelse.ProgramID AND Medvirkende.MedvirkendeID = Deltagelse.MedvirkendeID; Fornavn Etternavn Programtittel Kirsten Rokstad Sjokoladesuget Andreas Hagen Sportsrevyen Maria Bello 10:1 10
Hvilke programmer har Maria Bello medvirket i, og med hvilke roller? Aktuelle tabeller: Program (ProgramID, Programtittel, Programinfo, Kategori, Varighet, Aldersgrense, Tilgjengelighet, Teksting, Episodenr, sesongid) Medvirkende (MedvirkendeID, Fornavn, Etternavn) Deltagelse (ProgramID, MedvirkendeID, Rolle) SELECT Programtittel, Fornavn, Etternavn, Rolle FROM Program, Medvirkende, Deltagelse WHERE Fornavn = Maria AND Etternavn = Bello AND Program.ProgramID = Deltagelse.ProgramID AND Medvirkende.MedvirkendeID = Deltagelse.MedvirkendeID; Programtittel Fornavn Etternavn Rolle 10:1 Maria Bello Skuespiller 10:1 Maria Bello Regissør Hvilke innslag inneholder Sjokoladesuget? Tabeller med relevante data: Program (ProgramID, Programtittel, Programinfo, Kategori, Varighet, Aldersgrense, Tilgjengelighet, Teksting, Episodenr, sesongid) Innslag (InnslagID, Innslagtittel) Programinnhold (InnslagID, ProgramID, Nummer, Tidskode) SELECT Programtittel, Innslagtittel FROM Program, Innslag, Programinnhold WHERE Programtittel = Sjokoladesuget AND Program.ProgramID = Programinnhold.ProgramID AND Innslag.InnslagID = Programinnhold.InnslagID; Programtittel Sjokoladesuget Sjokoladesuget Innslagtittel Øyvors hemmelighet På Nobellinstituttet 11
Hvilken tidskode har innslaget Øyvors hemmelighet i Sjokoladesuget? Tabeller med relevante data: Program (ProgramID, Programtittel, Programinfo, Kategori, Varighet, Aldersgrense, Tilgjengelighet, Teksting, Episodenr, sesongid) Innslag (InnslagID, Innslagtittel) Programinnhold (InnslagID, ProgramID, Nummer, Tidskode) SELECT Programtittel, Innslagtittel, Tidskode FROM Program, Innslag, Programinnhold WHERE Programtittel = Sjokoladesuget AND Innslagtittel = Øyvors hemmelighet AND Program.ProgramID = Programinnhold.ProgramID AND Innslag.InnslagID = Programinnhold.InnslagID; Programtittel Innslagtittel Tidskode Sjokoladesuget Øyvors hemmelighet 00:00:16 Spørring mot flere tabeller med en beregningsfunksjon Hvor mange innslag er det i henholdsvis Sjokoladesuget og Sportsrevyen? tabeller med relevant data: Program (ProgramID, Programtittel, Programinfo, Kategori, Varighet, Aldersgrense, Tilgjengelighet, Teksting, Episodenr, sesongid) Innslag (InnslagID, Innslagtittel) Programinnhold (InnslagID, ProgramID, Nummer, Tidskode) SELECT Programtittel, COUNT(Innslag.InnslagID) AS 'Antall innslag' FROM Program, Innslag, Programinnhold WHERE (Programtittel = Sjokoladesuget' OR Programtittel = Sportsrevyen') AND Program.ProgramID = Programinnhold.ProgramID AND Innslag.InnslagID = Programinnhold.InnslagID GROUP BY Programtittel; Programtittel Sjokoladesuget 2 Sportsrevyen 2 Antall innslag 12
Spørring mot flere tabeller med en beregningsfunksjon Vi kan spørre mot deler av tabellene fra en mange til mangesammenhengstype, og dermed forenkle forrige spørring: 2 tabeller med relevant data: Program (ProgramID, Programtittel, Programinfo, Kategori, Varighet, Aldersgrense, Tilgjengelighet, Teksting, Episodenr, sesongid) Programinnhold (InnslagID, ProgramID, Nummer, Tidskode) SELECT Programtittel, COUNT(InnslagID) AS 'Antall innslag' FROM Program, Programinnhold WHERE (Programtittel = Sjokoladesuget' OR Programtittel = Sportsrevyen') AND Program.ProgramID = Programinnhold.ProgramID GROUP BY Programtittel; Programtittel Sjokoladesuget 2 Sportsrevyen 2 Antall innslag Hvilke programmer ble vist 09.0.2014 og hvilke medvirkende hadde de? 4 tabeller med relevant data: Program (ProgramID, Programtittel, Programinfo, Kategori, Varighet, Aldersgrense, Tilgjengelighet, Teksting, Episodenr, sesongid) Medvirkende (MedvirkendeID, Fornavn, Etternavn) Sendetidspunkt (TidspunktID, Kanal, Sendedato, Klokkeslett, ProgramID) Deltagelse (ProgramID, MedvirkendeID, Rolle) SELECT Programtittel, Fornavn, Etternavn FROM Program, Medvirkende, Sendetidspunkt, Deltagelse WHERE Sendedato = 09.0.2014 AND Program.ProgramID = Deltagelse.ProgramID AND Medvirkende.MedvirkendeID = Deltagelse.MedvirkendeID AND Program.ProgramID = Sendetidspunk.ProgramID; Programtittel Fornavn Etternavn Sportsrevyen Andreas Hagen 1
Aliaser Brukes ved mange, lange tabellnavn i komplekse spørringer Defineres rett etter tabellnavnet i FROM Bruker aliaset senere i spørringen Eksempel: SELECT Programtittel, Fornavn, Etternavn FROM Program P, Medvirkende M, Sendetidspunkt S, Deltagelse D WHERE Sendedato = 09.0.2014 AND P.ProgramID = D.ProgramID AND M.MedvirkendeID = D.MedvirkendeID AND P.ProgramID = S.ProgramID; SQL Oppgave Gjennomgang 25. november Lag SQL-spørringene i oppgavene under ved hjelp av phpmyadmin mot databasen Bokormen. 1. Hent ut et adresseregister som inneholder fornavn, etternavn, adresse, postnr og sted for alle medlemmene i Bokormen. 2. Hvilke boktitler er utgitt av Cappelen?. Vis en fordeling av antallet bøker hvert forlag har utgitt. 4. Hent ut en liste som inneholder ISBN og tittel for alle bøkene i databasen, samt ansvarliges fornavn, etternavn og rolle. Listen skal sorteres stigende på tittel (fra A til Å). 5. Hvilke bøker ble tilbudt i de tre bokklubbene som månedens bok i november 2005? Svaret skal vise tittel på boken og klubbnavn og sorteres stigende på klubbnavn. 6. Hvilke boktitler skrevet av Astrid Lindgren er tilbudt i Leselusen? 14