sql underforespørgsler og join
DESCRIPTION
SQL underforespørgsler og Join. SQL – flere tabeller. Indtil videre har vi kun anvendt forespørg-sler på en enkelt tabel Vi er ofte interesserede i at lave fore-spørgsler, der involverer flere tabeller - PowerPoint PPT PresentationTRANSCRIPT
RHS – IT A 2
SQL – flere tabeller
• Indtil videre har vi kun anvendt forespørg-sler på en enkelt tabel
• Vi er ofte interesserede i at lave fore-spørgsler, der involverer flere tabeller
• Vi kan dermed besvare mere komplekse spørgsmål, men forespørgslerne selv bliver også mere komplekse…
RHS – IT A 3
SQL – flere tabeller
• Vi benytter en database med information om film som eksempel
Film filmid titel land år genre oscars
Skuespiller personid navn land født levende oscars
Medvirker filmid personid
RHS – IT A 4
SQL – flere tabeller
filmid titel land år genre oscars
1 E.T. USA 1982 Sci-Fi 4
2 Taxi Frankrig 1998 Komedie 0
3 Sult Danmark 1966 Drama 1
4 Leon Frankrig 1994 Thriller 0
5 Hard Boiled Kina 1992 Action 0
6 1984 UK 1984 Sci-Fi 2
7 Seven USA 1995 Thriller 1
RHS – IT A 5
SQL – flere tabeller
personid navn land født levende oscars
1 John Wayne USA 04-06-1911 nej 2
2 Chow-Yun Fat Kina 12-11-1959 ja 0
3 Karl Stegger Danmark 30-01-1922 nej 0
4 Jean Reno Frankrig 10-10-1949 ja 0
5 Julia Roberts USA 28-09-1964 ja 1
6 Natalie Portman Israel 02-07-1980 ja 0
7 Marc Duret Frankrig 01-08-1966 ja 1
RHS – IT A 6
SQL – flere tabeller
filmid personid
1 1
1 4
1 5
1 7
2 4
2 6
2 7
3 1
3 2
3 3
filmid personid
4 4
4 6
5 2
5 4
5 6
6 5
6 6
7 2
7 4
7 5
RHS – IT A 7
SQL – flere tabeller
• Hvordan kan vi svare på et spørgsmål som dette:
• Hvor mange film er lavet i det land som Marc Duret kommer fra?
• Dette spørgsmål kan ikke besvares med en forespørgsel, der kun berører én tabel
• Informationen er spredt ud i flere tabeller
RHS – IT A 8
SQL – flere tabeller
SELECT land
FROM Skuespiller
WHERE navn = ’Marc Duret’
SELECT COUNT(titel) AS filmCount
FROM Film
WHERE Film.land = ’Frankrig’
Resultat er ’Frankrig’
’Frankrig’ brugt som input
NB!
RHS – IT A 9
SQL – flere tabeller
• Vi kan udføre den første forespørgsel, og bruge resultatet fra den som ”input” til den anden forespørgsel
• Den første forespørgsel bliver til en ”under-forespørgsel”
RHS – IT A 10
SQL – flere tabeller
SELECT COUNT(titel) AS filmCount
FROM Film
WHERE land = (SELECT land
FROM Skuespiller
WHERE navn = ’Marc Duret’)
Ydre forespørgsel
Indre forespørgsel(under-forespørgsel)
RHS – IT A 11
SQL – flere tabeller
• Resultat fra indre forespørgsel bruges som input til ydre forespørgsel
• Den indre forespørgsel producerer – som alle andre forespørgsler – en resultattabel, som bruges af den ydre forespørgsel
• Giver et par komplikationer– Navnesammenfald– Mulighed for mere end et resultat
RHS – IT A 12
SQL – flere tabeller
• Når en forespørgsel involverer flere tabeller, kan der være felter med samme navn i tabellerne
• Vi kan præcisere et feltnavn ved at skrive tabelnavnet foran (med et .)– Film.land (land feltet i Film tabellen)– Skuespiller.land (land feltet i Skuespiller
tabellen)
RHS – IT A 13
SQL – flere tabeller
• Hvad nu hvis en under-forespørgsel giver mere end ét resultat?
SELECT land
FROM Skuespiller
WHERE (oscars > 0)
Resultat:USAFrankrig
RHS – IT A 14
SQL – flere tabeller
• Vi må i så fald bruge IN
SELECT COUNT(titel) AS FilmCount
FROM Film
WHERE land IN (SELECT land
FROM Skuespiller
WHERE (oscars > 0))Øhmm…
RHS – IT A 15
Opgave 6 – SQL
• Brug Filminformation-databasen fra websiten• Kør nedenstående SQL-forespørgsler på databasen
– SELECT titel, år, oscars FROM Film WHERE oscars > (SELECT SUM(oscars)/5 FROM Film)
– SELECT * FROM Film WHERE år > (SELECT MAX(år) FROM Film WHERE (oscars > 0))
• Formulér selv SQL-forespørgsler til at finde nedenstående data :– Find navn og land for skuespillere fra samme land som ’E.T’ er fra
– Find titel og Oscars for film som har vundet mindst lige så mange Oscars som John Wayne har vundet
– Find navn og land for skuespillere som har vundet mindst dobbelt så mange Oscars som gennemsnittet af Oscars vundet af alle skuespillere
RHS – IT A 16
SQL – Join
• En anden tilgangsvinkel til spørgsmål som involverer flere tabeller er join (forening)
• At ”joine” tabeller er en slags ”multiplika-tion” af tabeller
• Simpelt tilfælde: Join uden betingelser:
SELECT *
FROM Film, Skuespiller
RHS – IT A 17
SQL – Join
• Kører vi denne forespørgsel, får vi et resultat på 49 poster…
• 49 = 7 x 7. Alle kombinationer af Film poster (7) og Skuespiller poster (7)
• Alle felter fra begge tabeller er inkluderet
• Som regel er det ikke lige det resultat vi ønsker os…
RHS – IT A 18
SQL – Join
• Som regel vil vi gerne udvælge resultater hvor visse felters værdier matcher
• Eksempel: For alle film, find filmens titel samt navne på alle skuespillere som medvirker i den enkelte film
• Denne information findes jo allerede i Medvirker tabellen (20 poster), men kun i form af talpar (filmid + personid)
RHS – IT A 19
SQL – Join
• Vi har brug for information fra alle tre tabeller i databasen, så et første forsøg på en forespørgsel kunne være
SELECT *
FROM Film, Medvirker, Skuespiller
• Resultat: 980 poster med mange felter…
RHS – IT A 20
SQL – Join
• Vi kan imidlertid nøjes med kun at medtage nogle få felter fra tabellerne:
SELECT Film.titel, Skuespiller.navn
FROM Film, Medvirker, Skuespiller
• Resultat: 980 poster med de ønskede felter
RHS – IT A 21
SQL – Join
• Desuden skal vi kun bruge de poster, hvor den relevante information matcher
• Vi prøver at ”udskifte” tallene i Medvirker tabellen med rigtigt data (titler og navne)
• For at udvælge korrekte titler og personer, skal de tilsvarende id’er (filmid og person-id) matche på tværs af tabellerne
RHS – IT A 22
SQL – Join
• Match id’er for titler og personer:
SELECT Film.titel, Skuespiller.navnFROM Film, Medvirker, SkuespillerWHERE ((Film.filmid = Medvirker.filmid)
AND (Skuespiller.personid = Medvirker.personid))
• Resultat: 20 poster med de rigtige felter!
RHS – IT A 23
SQL – Join
• Dette er et meget normalt ”mønster” for multi-tabel forespørgsler– Tabeller der repræsenterer relationer inde-
holder kun id’er (nøgler i andre tabeller)– ”Rigtigt data” findes i tabeller som repræsen-
terer entiteter (med id’er som nøgle)– ”Rigtigt data” for relationer findes ved brug af
join, hvor der matches på nøglefelter
RHS – IT A 24
Opgave 7 – SQL• Brug Filminformation-databasen fra websiten• Kør nedenstående SQL-forespørgsler på databasen
1) SELECT Film.titel, COUNT(Skuespiller.personid) AS Roller FROM Film, Skuespiller, Medvirker
WHERE (Skuespiller.land = 'Frankrig') AND (Medvirker.personid = Skuespiller.personid) AND (Medvirker.filmid = Film.filmid) GROUP BY Film.titel2) SELECT Film.Genre, SUM(Skuespiller.Oscars) AS totalOscars FROM Film, Skuespiller,
Medvirker WHERE (Skuespiller.levende = ‘ja') AND (Medvirker.personid = Skuespiller.personid) AND (Medvirker.filmid = Film.filmid) GROUP BY Film.genre
• Formulér selv SQL-forespørgsler til at finde nedenstående data:– Find navn, land og film-titel for skuespillere (og film) som medvirker i film fra
deres eget land– Find navn og film-titel for for skuespillere (og film) som ikke har vundet en Oscar,
men har medvirket i en film, som har vundet en Oscar