Oppgave 7 I denne oppgaven skal vi bruke f?lgende relasjon: Filmgenre (filmid, title, prodyear, genre) Prim?rn?kkelen i tabellen er kombinasjonen av filmid og genre (filmid, genre). Videre vet vi ogs? at filmid bestemmer tittel og produksjons?r for en film. a) Bestem alle supern?klene i relasjonen Filmgenre. Skriv ned alle. b) Bestem alle FDene i relasjonen Filmgenre. c) Hvilken normalform er relasjonen Filmgenre p?? Begrunn svaret ditt. Oppgave 8 En tabell med filmid, filmtittel og produksjons?r for alle filmer som har en tittel som inneholder ordet 'Exam' eller 'Exams'. Unng? og f? med filmer med titler som inneholer ord som 'Example', 'Examen', 'Examination', osv. Du kan anta at filmtitler ikke kan inneholde andre tegn enn bokstaver, tall og skilletegnet blank (space). select filmid, title, prodyear from film where title like 'Exam %' or title like '% Exam %' or title like '% Exam' or title like 'Exams %' or title like '% Exams %' or title like '% Exams'; Oppgave 9 En tabell med titler p? film med antall deltagere per film. Definer tabellen som et et view. Kall viewet Oppg9. Attributtene i viewet skal hete tittel og ant_delt. create view Oppg9 (tittel, ant_delt) as select title, count(distinct personid) from Film natural join Filmparticipation group by filmid, title ; -- gi ogs? full uttelling for count(filmid) eller count(*), selv om noen personer har hatt flere funksjoner i samme film og derfor vil kunne st? flere ganger. Oppgave 10 En tabell med navn p? alle filmer regissert av Joachim Trier. select title from Film natural join Filmparticipation natural join Person where firstname = 'Joachim' and lastname = 'Trier' and parttype ='director'; Oppgave 11 En tabell med alle land som det er produsert film i, ordnet i stigende alfabetisk rekkef?lge. select country c, count(*) a from filmcountry fc group by c order by c ; Oppgave 12 Lag et view med tittel og produksjon?r for alle filmer produsert i Kambodsja (¡¯Cambodia¡¯ i Filmcountry). create view Oppg12 (filmid, tittel, produksjons?r) as select fc.filmid, title, prodyear from film f right join filmcountry fc on f.filmid = fc.filmid where country = 'Cambodia'; -- her har jeg tatt med filmer produsert i Kambodsja som ikke har noen tittel. -- et lite pluss for ? ha med dette Oppgave 13 Samme oversikt, men f? med en kolonne med navn p? regiss?r og antall skuespillere (filmparticipation.parttype = 'cast') for hver film. select A.filmid, title, aar, director, B.ant_skuespillere from ( select c.filmid filmid, c.title, c.prodyear aar, firstname || ' ' || lastname as director from Person P natural join Filmparticipation FP natural join ( select fc.filmid filmid, title, prodyear from film f right join filmcountry fc on f.filmid = fc.filmid where country = 'Cambodia' ) as c where FP.parttype = 'director' ) as A left outer join ( select filmid, count(*) as ant_skuespillere from Film natural join Filmparticipation where parttype='cast' group by filmid ) as B on A.filmid = B.filmid ; Oppgave 14 Et view med filmer (filmid) som har kun ¨¦n regiss?r. create view Oppg14 (filmid) as select filmid --, count(*) from Filmparticipation X where parttype = 'director' group by filmid having count(*) = 1; Oppgave 15 Oversikt over titler p? filmene med flest regiss?rer. Her var det under eksamen flere sp?rsm?l til hva som mentes med oversikt. Det er ogs? uklart om man kan skrive ut flere enn akkurat de som har maks antall regiss?rer. S? full uttelling til alle som gj?r dette: create view Oppg15 (filmid, antR) as select filmid, count(distinct personid) antR from Filmparticipation X where parttype = 'director' group by filmid order by antR desc; select title from Film F natural join Filmparticipation FP where parttype = 'director' group by filmid, title having count(distinct personid) = ( select max(antR) from Oppg15 ); Foresl?r en B p? denne oppgaven til dem som skriver ut flere filmer med antallet regiss?rer ordnet med flest regiss?rer f?rst. Oppgave 16 Ser vi p? filmproduksjonen pr. ?r, ser vi stort sett en stigning fra ?r til ?r. Men i 1936 var produksjonen 3865 filmer. Da tok det noen ?r f?r den igjen var over det antallet. Skriv en select-setning som skriver ut det f?rste ?ret etter 1936 hvor filmproduksjonen var st?rre enn 3865. select min(prodyear) from ( select prodyear, count(filmid) as antall from film group by prodyear ) as T where prodyear > 1936 and antall > 3865; Oppgave 17 Lag et view som for hvert ?rstall har antall filmer som ble produsert ?ret f?r. create view ProdIFjor as select prodyear +1 as ?rstall, count(filmid) as antall from film group by prodyear ; Oppgave 18 En oversikt over alle produksjons?r hvor filmproduksjonen sank sammenlignet med produksjonen ?ret f?r. Sorter kronologisk (?rstall i stigende rekkef?lge). select prodiAar.prodyear, prodIAar.ant, prodIFjor.ant from ( select prodyear, count(filmid) as ant from film group by prodyear ) as prodIAar join ( select prodyear+1 as pa , count(filmid) as ant from film group by prodyear ) as prodIFjor on prodiaar.prodyear = prodifjor.pa where prodIAar.ant < prodIFjor.ant order by prodiAar.prodyear; select prodiAar.prodyear, prodIAar.ant, prodIFjor.ant from ( select prodyear, count(filmid) as ant from film group by prodyear ) as prodIAar join ( select prodyear+1 as pa , count(filmid) as ant from film group by prodyear ) as prodIFjor on prodiaar.prodyear = prodifjor.pa where prodIAar.ant < prodIFjor.ant order by prodiAar.prodyear; Oppgave 19 Skriv om denne setningen, slik at resultatet blir samme tabell, men bare med ¨¦n select. Du trenger ikke ta hensyn til tuplenes rekkef?lge. (select F.filmid from Film F natural join Filmcountry C) union (select filmid from Film F where not exists (select filmid from Filmcountry where F.filmid = filmid)) L?SNING: select distinct F.filmid from Film F left outer join Filmcountry C on F.filmid=C.filmid; ?Bevis?: fdb=> select * from ( fdb(> ( (select F.filmid fdb(> from Film F natural join Filmcountry C) fdb(> union fdb(> (select filmid fdb(> from Film F fdb(> where not exists (select filmid from Filmcountry fdb(> where F.filmid = filmid) fdb(> ) fdb(> ) fdb(> except fdb(> ( select F.filmid fdb(> from Film F left outer join Filmcountry C fdb(> on F.filmid=C.filmid ) ) as X; filmid -------- (0 rows) fdb=> select * from ( fdb(> ( select F.filmid fdb(> from Film F left outer join Filmcountry C fdb(> on F.filmid=C.filmid ) fdb(> except fdb(> ( (select F.filmid fdb(> from Film F natural join Filmcountry C) fdb(> union fdb(> (select filmid fdb(> from Film F fdb(> where not exists (select filmid from Filmcountry fdb(> where F.filmid = filmid) fdb(> ) fdb(> ) ) as X; filmid -------- (0 rows) select count(X.filmid) from ( (select F.filmid from Film F natural join Filmcountry C) union (select filmid from Film F where not exists (select filmid from Filmcountry where F.filmid = filmid) ) ) as X ; select count(Y.filmid) from ( (select F.filmid from Film F natural join Filmcountry C) union (select filmid from Film F where not exists (select filmid from Filmcountry where F.filmid = filmid) ) ) as Y ; select count(distinct filmid) from Film; select count(filmid) from Film;