Extra övningar i SQL Följande SQL-satser bygger på exemplen (och databasen) i föreläsningsbilderna från föreläsningen om relationsalgebra. Person pid pnamn längd vikt land Film fnamn Basic Swordfish Michael Face/Off Con Air Entrapment The Truman Show Congo Absolute Power Mystic River Space Cowboys år 00 00 99 99 99 99 999 998 995 99 00 000 regi ssör 5 8 FilmSkådis fnamn Basic Swordfish Michael Face/Off Face/Off Con Air Con Air Entrapment Entrapment The Truman Show The Truman Show Congo Mystic River Mystic River Space Cowboys pid 9 5 8 0 5 8 9 0 5 8 John Travolta Nicolas Cage Sean Connery Ed Harris Jim Carrey Laura Linney Clint Eastwood Gene Hackman John Cusack Sean Penn Kevin Bacon Jennifer Esposito John McTiernan Dominic Sena Nora Ephron Jon Amiel Catherine Zeta-Jones Peter Weir 5 9 8 5 88 5 8 80 5 5 0 9 9 8 0 9 9 8 9 0 8 Scottland Canada England Wales Australia
Ta fram filmer och regissörs namn! SELECT DISTINCT fnamn, pnamn, Person WHERE regissör = pid; Visa filmer gjorda 000 eller 00! SELECT DISTINCT fnamn WHERE år=000 OR år=00; Vilka skådespelare har spelat i filmer från 99? SELECT DISTINCT pnamn FROM Person, FilmSkådis, Film WHERE Person.pid=FilmSkådis.pid AND FilmSkådis.fnamn=Film.fnamn AND år = 99 Eller: SELECT pnamn FROM Person WHERE pid IN (SELECT pid Skådis WHERE fnamn IN (SELECT fnamn WHERE år = 99)) Visa alla regissörer som väger mer än 0! SELECT DISTINCT pnamn, Person WHERE vikt>0 AND regissör=pid Hur många filmer har varje regissör gjort? Visa namn och antal! SELECT pnamn, COUNT(*) AS antal, Person WHERE regissör= pid GROUP BY pnamn
I vilka filmer spelar alla skådespelare från Australien? SELECT fnamn WHERE NOT EXISTS (SELECT * FROM Person WHERE Person.pid IN (SELECT pid Skådis) AND land='australia' AND pid NOT IN (SELECT pid Skådis WHERE FilmSkådis.fnamn=Film.fnamn)) Vilken film har inga skådespelare från? SELECT fnamn WHERE fnamn NOT IN (SELECT Film.fnamn FROM Person, FilmSkådis, Film WHERE land='' AND Person.pid=FilmSkådis.pid AND FilmSkådis.fnamn=Film.fnamn); Från hur många länder finns det skådespelare i varje film? SELECT fnamn, COUNT(DISTINCT land) Skådis, Person WHERE FilmSkådis.pid=Person.pid GROUP BY fnamn Eller om man inte ha COUNT(DISTINCT): SELECT fnamn, COUNT(land) FROM (SELECT DISTINCT fnamn, land Skådis, Person WHERE FilmSkådis.pid=Person.pid) GROUP BY fnamn Hur många skådespelare från varje land finns det i varje film? SELECT fnamn, land, COUNT(pid) Skådis, Person WHERE FilmSkådis.pid=Person.pid GROUP BY fnamn, land
Vilken film har regisserats av en av skådespelarna i filmen? SELECT Film.fnamn, FilmSkådis WHERE Film.fnamn=FilmSkådis.fnamn AND regissör=pid
Följande exempel bygger på samma databas som används i kompendiet "Introduction to Microsoft Access": Tables (primary keys are underlined): Artist (Name, Age, FavouriteComposer, Mentor) Composer (Name) Song (ID, Name, Length, Composer) SongPerformance (Date, Song) ArtistPerformance (Name, Date, Song) CD (ID, Title, Year) CDSongPosition (Position, CDID, Date, Song) Foreign keys (foreign key on the left, referenced key on the right): Artist.FavouriteComposer << Composer.Name Artist.Mentor << Artist.Name Composer.Name << Artist.Name Song.Composer << Composer.Name SongPerformance.Song << Song.ID ArtistPerformance.Name << Artist.Name ArtistPerformance.(Date, Song) << SongPerformance.(Date, Song) CDSongPosition.CDID << CD.ID CDSongPosition.(Date, Song) << SongPerformance.(Date, Song) 5
Vilken artist har en mentor som är yngre än artisten själv? SELECT Artist.Name FROM Artist, Artist AS Mentor WHERE Artist.Mentor = Mentor.Name AND Artist.Age > Mentor.Age Visa titeln och längden i sekunder för alla CD från 000! SELECT CD.Title, SUM(Song.Length) FROM CD, CDSongPosition, Song WHERE CD.Year=000 AND CD.ID=CDSongPosition.CDID AND CDSongPosition.Song=Song.ID GROUP BY CD.Title På vilken CD är alla inspelningar från 00? Här är det enklast att börja med att ta fram det man inte vill ha. Alltså ta fram alla CD med inspelningar från annat är 00. Sedan kan man dra bort dessa CD från alla CD och kvar har vi rätt CD! Man gör på detta sätt för att man vill kontrollera att samtliga inspelningar är från 00. Hade vi letat efter CD med minst en inspelning från 00, hade vi gått direkt efter det vi vill ha. SELECT Title, Year FROM CD WHERE ID NOT IN (SELECT CDID FROM CDSongPosition WHERE NOT (Date BETWEEN #00 0 0# AND #00 #)) Vilken är den längsta låten av varje kompositör? SELECT Song.Composer, Song.Name, Song.Length FROM Song, (SELECT Composer, MAX(Length) AS maxlength FROM Song GROUP BY Composer) AS ComposerMax WHERE Song.Composer=ComposerMax.Composer AND Song.Length=ComposerMax.maxlength Man kan också lösa detta på det här sättet: SELECT Composer, Name, Length FROM Song AS s WHERE Length = (SELECT MAX(length) FROM Song WHERE Composer = s.composer)
På vilken CD finns det en låt av Yanni (composer) på plats och en låt med Madonna på plats? Visa titeln och året! SELECT Title, Year FROM CD WHERE ID IN (SELECT CDID FROM Song, CDSongPosition WHERE Composer = 'Yanni' AND Position = AND ID=Song) AND ID IN (SELECT CDID FROM ArtistPerformance AS ap, CDSongPosition AS cdsp WHERE Name= Madonna AND Position= AND ap.date=cdsp.date AND ap.song=cdsp.song) Hur många låtar ingår i varje CD? SELECT Title, Year, COUNT(*) antal FROM CD, CDSongPosition WHERE ID = CDID GROUP BY Title, Year Vilken artist har spelat Yannis alla låtar? SELECT Name FROM Artist WHERE NOT EXISTS (SELECT * FROM Song WHERE Composer='Yanni' AND ID NOT IN (SELECT Song FROM ArtistPerformance WHERE Name=Artist.Name))