/* L?sningsforslag INF1300 Ukesoppgavesett 7 */ /* Diverse oppgaver mot film databasen*/ -- 1) /* Hvilke verdier forekommer i attributtet filmtype i relasjonen filmitem? (7) */ SELECT DISTINCT filmtype FROM filmitem; -- eller SELECT filmtype FROM filmitem GROUP BY filmtype; /* filmtype ---------- VG TV C E V TVS mini (7 rows) */ /* Lag en oversikt over filmtypene og hvor mange filmer innen hver type. (7)*/ SELECT filmtype, COUNT(*) ant FROM filmitem GROUP BY filmtype ORDER BY ant DESC; /* filmtype | ant ----------+-------- C | 549782 E | 446402 TV | 74725 V | 61050 TVS | 52098 VG | 6804 mini | 6769 (7 rows) */ -- 2) /* Om attributtet filmdescr i Filmdescription st?r det at informasjonen som fins, b?rer noe preg av ? v?re lite enhetlig og relativt tilfeldig. Unders?k hvilke verdier som finnes i dette attributtet. (Hint det er 94 forskjellige verdier). */ SELECT DISTINCT filmdescr FROM Filmdescription; -- 3) /* Mange titler har v?rt brukt i flere filmer. Skriv ut en oversikt over titler som har v?rt brukt i mer enn 30 filmer. Bak hver tittel skriv antall ganger den er brukt. Ordne linjene med hyppigst forekommende tittel f?rst. (26 eller 18) */ SELECT title, COUNT(*) AS ant FROM film GROUP BY title HAVING COUNT(*) > 30 ORDER BY ant DESC; /* title | ant ------------------------------+----- Hamlet | 67 Carmen | 55 Eurovision Song Contest, The | 52 Macbeth | 46 Popular Science | 45 (26 rows) */ -- eller om du velger ? gruppere p? filmtype i tillegg. Merk at dette vil gi forskjellige resultat, bare 18 rader i denne. SELECT title, filmtype, COUNT(*) AS ant FROM film NATURAL JOIN filmitem GROUP BY title, filmtype HAVING COUNT(*) > 30 ORDER BY ant DESC; /* title | filmtype | ant ------------------------------+----------+----- Eurovision Song Contest, The | TV | 52 Popular Science | C | 45 Melodi grand prix | TV | 44 Nationaal songfestival | TV | 43 Love | C | 42 ... (18 rows) -- 4) /* Hvilken verdi (fornavn) forekomer hyppigst i firstname-attributtet i tabellen Person? (176030 rader, 40340 eller 16108 for flest fornavn) */ SELECT firstname, COUNT(*) AS sammeFornavn FROM Person GROUP BY firstname ORDER BY sammeFornavn DESC; /* firstname | sammefornavn ---------------------------------------------------+-------------- | 40340 John | 16108 David | 15009 Michael | 14184 Robert | 10020 */ -- ?nsker du ? fjerne de som har tom linje som fornavn s? blir det: SELECT firstname, COUNT(*) AS sammeFornavn FROM Person WHERE firstname <> '' GROUP BY firstname ORDER BY sammeFornavn DESC; firstname | sammefornavn ---------------------------------------------------+-------------- John | 16108 David | 15009 Michael | 14184 Robert | 10020 -- 5) /* Hvilke to fornavn forekommer mer enn 6000 ganger og akkurat like mange ganger? (2 rader) */ -- Flere m?ter ? l?se p? SELECT A.fornavn, A.antall, B.fornavn, B.antall FROM (SELECT firstname fornavn, COUNT(*) antall FROM Person GROUP BY firstname HAVING COUNT(*) > 5999) AS A INNER JOIN (SELECT firstname fornavn, COUNT(*) antall FROM Person GROUP BY firstname HAVING COUNT(*) > 5999) AS B ON A.antall = B.antall AND A.fornavn <> B.fornavn ; /* fornavn | antall | fornavn | antall ---------+--------+---------+-------- Peter | 9151 | Paul | 9151 Paul | 9151 | Peter | 9151 */ -- Eller, som gir akkurat samme resultat SELECT names1.firstname, names1.occurences FROM (SELECT p2.firstname, COUNT(p2.firstname) AS occurences FROM Person p2 GROUP BY p2.firstname HAVING COUNT(p2.firstname) > 6000) AS names1, (SELECT p2.firstname, COUNT(p2.firstname) AS occurences FROM person p2 GROUP BY p2.firstname HAVING COUNT(p2.firstname) > 6000) AS names2 WHERE names1.occurences = names2.occurences AND names1.firstname != names2.firstname; -- 6) /* Hvor mange filmer i filmdatabasen er norske? (1 rad, 2245 verdi) */ SELECT COUNT(*) AS antallNorskeFilmer FROM Filmcountry WHERE country = 'Norway'; /* antallnorskefilmer -------------------- 2245 (1 row) */ -- 7) /* Skriv ut tittel og regiss?r for norske filmer som er produsert f?r 1960. (269) */ SELECT title AS tittel, lastname, firstname FROM Filmcountry NATURAL JOIN Film NATURAL JOIN Filmparticipation NATURAL JOIN Person WHERE country = 'Norway' AND parttype = 'director' AND prodyear < 1960; /* tittel | lastname | firstname ------------------------------------------------------------------+--------------------+---------------- Portrettet | Aabel | Per Portrettet | Skaugen | Borgwall Jeppe p? bjerget | Aabel | Per Jeppe p? bjerget | Ivarson | Harry Storfolk og sm?folk | Ibsen | Tancred Kvinnan bakom allt | Faustman | Hampe ... (269 rows) */ -- 8) /* Hvor mange filmer har Tancred Ibsen regissert? (24) */ SELECT COUNT (DISTINCT filmid) AS tancredIbsenFilmer FROM Filmparticipation NATURAL JOIN Person WHERE lastname = 'Ibsen' AND firstname = 'Tancred' AND parttype = 'director'; /* tancredibsenfilmer -------------------- 24 (1 row) */ -- 9) /* Lag en oversikt over regiss?rer som har regissert mer enn 5 norske filmer. (60) */ SELECT lastname || ', ' || firstname AS navn FROM Filmcountry NATURAL JOIN Film NATURAL JOIN Filmparticipation NATURAL JOIN Person WHERE country = 'Norway' AND parttype = 'director' GROUP BY lastname, firstname HAVING COUNT(*) > 5; /* navn ----------------------------- Andersen, Knut Sand?, Toralf Holst, Marius Heggedal, Jon Breien, Anja Venner?d, Petter ... (60 rows) */ -- 10) /* Lag en oversikt (filmtittel) over norske filmer med mer enn ¨¦n regiss?r. */ SELECT filmid, title FROM Filmcountry NATURAL JOIN Film NATURAL JOIN Filmparticipation NATURAL JOIN Person WHERE country = 'Norway' AND parttype = 'director' GROUP BY filmid, title HAVING COUNT(*) > 1; -- 11) /* Regiss?rer som har regissert alene mer enn 5 norske filmer. (49) */ SELECT lastname || ', ' || firstname AS navn, COUNT(*) AS antall FROM Filmcountry NATURAL JOIN Film NATURAL JOIN Filmparticipation NATURAL JOIN Person WHERE country = 'Norway' AND parttype = 'director' AND filmid NOT IN ( SELECT filmid FROM Filmcountry NATURAL JOIN Film NATURAL JOIN Filmparticipation NATURAL JOIN Person WHERE country = 'Norway' AND parttype = 'director' GROUP BY filmid, title HAVING COUNT(*) > 1 ) GROUP BY lastname, firstname HAVING COUNT(*) > 5 ORDER BY antall DESC; /* navn | antall -----------------------------+-------- Bronken, Per | 23 M¨¹ller, Nils R. | 22 Bohwim, Knut | 18 Skouen, Arne | 16 Caprino, Ivo | 15 */ -- uten den indre selectsetningen SELECT lastname || ', ' || firstname AS navn, COUNT(*) AS antall FROM Filmcountry NATURAL JOIN Film NATURAL JOIN Filmparticipation NATURAL JOIN Person WHERE country = 'Norway' AND parttype = 'director' GROUP BY lastname, firstname HAVING COUNT(*) > 5 ORDER BY antall DESC; /* Skriv selectsetninger som skriver ut en tabell med... */ /* * F?lgende tabeller er benyttet i oppgavene nedenfor: * * film(filmid, title, prodyear) * filmitem(filmid, filmtype) * filmparticipation(partid, personid, filmid, parttype) * person(personid, lastname, firstname, gender) * series(seriesid, maintitle, firstprodyear) **/ -- 12) /* fullstendig tittel og produksjons?r for alle filmer i kampsport -og spenningsfilmserien Rush Hour (1). */ SELECT f.title, f.prodyear FROM film f WHERE f.title LIKE '%Rush Hour%'; /* title | prodyear ----------------------------------------------------------+---------- Rush Hour | 1941 Rush Hour | 1998 Reel Comedy: Rush Hour 2 | 2001 Rush Hour 3 | 2007 Rush Hour | 2006 Rush Hour 2 | 2001 Rush Hour, The | 1974 Sto?zeit - Rush Hour | 1970 Rush Hour, The | 1928 SimCity 4: Rush Hour | 2003 Rush Hour - Due mine vaganti | 2000 Colpo grosso al drago rosso - Rush Hour 2 | 2002 Piece of the Action: Behind the Scenes of 'Rush Hour', A | 1999 Rush Hour | 1970 Reel Comedy: Rush Hour | 1998 (15 rows) */ -- 13) /* tittel, produksjons?r og filmtype for alle kinofilmer som ble produsert i ?ret 1893 (1). */ SELECT f.title, f.prodyear, fi.filmtype FROM film f NATURAL JOIN filmitem fi WHERE f.prodyear = 1893; /* title | prodyear | filmtype ---------------------+----------+---------- Blacksmith Scene | 1893 | C Blacksmith Scene #1 | 1893 | C Blacksmithing Scene | 1893 | C Horse Shoeing | 1893 | C (4 rows) */ -- 14) /* navn p? alle skuespillere (cast) i filmen Baile Perfumado (2). */ SELECT DISTINCT p.firstname || ' ' || p.lastname AS name FROM film f NATURAL JOIN filmparticipation fp NATURAL JOIN person p WHERE fp.parttype LIKE 'cast' AND f.title LIKE 'Baile Perfumado'; /* name ------------------------- Chico D¨ªaz Roger de Renor Germano Haiut Luiz Carlos Vasconcelos John Donovan Cl¨¢udio Mamberti Daniela Mastroianni Duda Mamberti Rut¨ªlio Oliveira Giovanna Gold Geninha da Rosa Borges Manoel Constantino Aramis Trindade Jofre Soares (14 rows) */ -- 15) /* tittel og produksjons?r for alle filmene som Ingmar Bergman har v?rt regiss?r (director) for. Sorter tuplene kronologisk etter produksjons?r (2). */ SELECT f.title, f.prodyear FROM film f NATURAL JOIN filmparticipation fp NATURAL JOIN person p WHERE p.lastname LIKE 'Bergman' AND p.firstname LIKE 'Ingmar' AND fp.parttype LIKE 'director' ORDER BY f.prodyear DESC; /* title | prodyear -----------------------------------------+---------- Saraband | 2003 Bildmakarna | 2000 Larmar och g?r sig till | 1997 --- Skepp till India land | 1947 Det regnar p? v?r k?rlek | 1946 Kris | 1946 (62 rows) */ -- 16) /* produksjons?r for f?rste og siste film Ingmar Bergman regisserte (3). */ SELECT MIN(f.prodyear) AS first, MAX(f.prodyear) AS last FROM film f NATURAL JOIN filmparticipation fp NATURAL JOIN person p WHERE fp.parttype LIKE 'director' AND p.lastname LIKE 'Bergman' AND p.firstname LIKE 'Ingmar'; /* first | last -------+------ 1946 | 2003 (1 row) */ --17) /* ?r og antall tv-serier som ble produsert f?rste gang i 2008 og 2009. En linje for hvert ?r (3). */ SELECT firstprodyear, COUNT(*) FROM series WHERE firstprodyear IN(2008, 2009) GROUP BY firstprodyear; /* firstprodyear | count ---------------+------- 2008 | 70 2009 | 6 (2 rows) */ -- 18) /* tittel og produksjons?r for de filmene hvor mer enn 300 personer har deltatt, uansett hvilken funksjon de har hatt (3). */ SELECT f.title, f.prodyear, COUNT(*) AS participants FROM film f NATURAL JOIN filmparticipation fp GROUP BY f.title, f.prodyear HAVING COUNT(DISTINCT fp.personid) > 300 ORDER BY participants DESC; -- Antatt her at vi ikke trenger ? filtrere bort VG delen av filmtype. -- (GTA: San Andreas er jo tross alt et videospill og ikke en film) /* title | prodyear | participants ---------------------------------+----------+-------------- Around the World in Eighty Days | 1956 | 1312 Stuck on You | 2003 | 452 50 y m¨¢s | 2005 | 382 Ten Commandments, The | 1956 | 381 Malcolm X | 1992 | 356 Grand Theft Auto: San Andreas | 2004 | 348 Producers, The | 2005 | 336 40 ans de la 2, Les | 2004 | 317 3000 sc¨¦narios contre un virus | 1994 | 314 Televisi¨®n cumple contigo, La | 2006 | 308 Live 8 | 2005 | 308 (11 rows) */ -- 19) /* oversikt over regiss?rer som har regissert kinofilmer over et stort tidsspenn. I tillegg til navn, ta med antall kinofilmer og f?rste og siste ?r (prodyear) personen hadde regi. Skriv ut alle som har et tidsintervall p? mer enn 49 ?r mellom f?rste og siste film og sorter dem etter lengden p? dette tidsintervallet. de lengste f?rst. (5). */ SELECT p.firstname || ' ' || p.lastname AS name, COUNT(*) AS produced, MIN(f.prodyear) AS first, MAX(f.prodyear) AS last, MAX(f.prodyear) - MIN(f.prodyear) AS periode FROM film f NATURAL JOIN filmparticipation fp NATURAL JOIN person p WHERE fp.parttype LIKE 'director' GROUP BY p.personid, name HAVING (MAX(f.prodyear) - MIN(f.prodyear) > 49) ORDER BY periode DESC; -- Trenger ? gruppere p? personid i tillegg siden to regiss?rer kan ha samme navn. /* Svar */ /* name | produced | first | last | periode ------------------------------+----------+-------+------+--------- Wladyslaw Starewicz | 35 | 1910 | 2003 | 93 Raoul Walsh | 139 | 1912 | 2003 | 91 Yakov Poselsky | 4 | 1917 | 1996 | 79 --- Ruy Guerra | 16 | 1954 | 2004 | 50 Robert F. Hill | 115 | 1916 | 1966 | 50 Michael Anderson | 39 | 1949 | 1999 | 50 (230 rows) */ -- 20) /* filmid for kinofilmer som har filmtittelen Love (42) */ SELECT fi.filmid FROM filmitem fi INNER JOIN film f ON f.filmid = fi.filmid WHERE fi.filmtype = 'C' AND f.title = 'Love'; /* Svar */ /* filmid --------- 112840 134660 237228 237244 239100 276581 287724 413876 462652 466007 522743 647027 802004 806316 806348 1029356 1106891 1365206 1423388 1567635 1664268 1699132 1699260 1760988 1761020 1786796 1829356 1830828 1992508 1992524 1992540 2376348 2498582 2593036 2593052 2757692 2887356 3388693 4077882 4077930 4077962 4078010 (42 rows) */ -- 21) /* filmid, tittel og antall medregiss?rer (parttype ¡¯director¡¯) (0 der han har regissert alene) for filmer som Ingmar Bergman har regissert. (62) */ WITH ingmarbergmanmovies AS ( SELECT fp.filmid FROM filmparticipation fp INNER JOIN person p ON fp.personid = p.personid WHERE fp.parttype = 'director' AND p.firstname = 'Ingmar' AND p.lastname = 'Bergman' ), ant_regissorer AS ( SELECT fp.filmid, COUNT(*) ant FROM filmparticipation fp WHERE fp.filmid IN (SELECT * FROM ingmarbergmanmovies) AND fp.parttype = 'director' GROUP BY fp.filmid ) SELECT f.filmid, f.title, (ar.ant - 1) AS ant_medregissorer FROM film f INNER JOIN ant_regissorer ar ON f.filmid = ar.filmid; /* Svar */ /* filmid | title | ant_medregissorer --------+-----------------------------------------+------------------- 10242 | Skepp till India land | 0 19285 | Stimulantia | 8 42980 | Hustruskolan | 0 50738 | Fanny och Alexander | 0 206075 | Ansikte mot ansikte | 0 206091 | Ansiktet | 0 225906 | Dr?mspel, Ett | 0 235475 | Sommaren med Monika | 0 236091 | Aus dem Leben der Marionetten | 0 243362 | Dj?vulens ?ga | 0 243378 | Don Juan | 0 243570 | N?ra livet | 0 243634 | Tv? saliga, De | 0 267891 | Ber?ringen | 0 357011 | Gycklarnas afton | 0 409137 | Lektion i k?rlek, En | 0 409297 | Sommarnattens leende | 0 414116 | Trollfl?jten | 0 429202 | Tystnaden | 0 459028 | Serpent's Egg, The | 0 473506 | Sommarlek | 0 513235 | Sista skriket | 0 519011 | Backanterna | 0 526450 | Sjunde inseglet, Det | 0 526715 | Det regnar p? v?r k?rlek | 0 552955 | Dokument Fanny och Alexander | 0 569009 | Hamnstad | 0 571921 | Larmar och g?r sig till | 0 572177 | Saraband | 0 595226 | Bakomfilm smultronst?llet | 0 597467 | Efter repetitionen | 0 654211 | H?stsonaten | 0 712219 | F?ngelse | 0 712347 | F?r?-dokument 1979 | 0 712363 | F?r?dokument 1969 | 0 713275 | F?r att inte tala om alla dessa kvinnor | 0 735845 | Bildmakarna | 0 736069 | Herr Sleeman kommer | 0 736117 | Jungfruk?llan | 0 736133 | Karins ansikte | 0 736149 | Kris | 0 736165 | Kvinnodr?m | 0 736181 | Kvinnors v?ntan | 0 736229 | Markisinnan de Sade | 0 736245 | Misantropen | 0 736261 | Musik i m?rker | 0 736277 | Nattvardsg?sterna | 0 736309 | Ov?der | 0 736325 | Passion, En | 0 736341 | Persona | 0 736357 | Rabies | 0 736373 | Riten | 0 736405 | Scener ur ett ?ktenskap | 0 736469 | Skammen | 0 736501 | Smultronst?llet | 0 736581 | S?nt h?nder inte h?r | 0 736597 | S?som i en spegel | 0 736613 | Till gl?dje | 0 736677 | T?rst | 0 736693 | Vargtimmen | 0 736709 | Venetianskan | 0 736725 | Viskningar och rop | 0 (62 rows) */ -- 22) /* filmid, antall involverte personer, produksjons?r og rating for alle filmer som Ingmar Bergman har regissert. Ordne kronologisk etter produksjons?r. (56) */ WITH ingmarbergmanmovies AS ( SELECT fp.filmid FROM filmparticipation fp INNER JOIN person p ON fp.personid = p.personid WHERE fp.parttype = 'director' AND p.firstname = 'Ingmar' AND p.lastname = 'Bergman' ), crew AS ( SELECT fp.filmid, COUNT(*) as ant FROM filmparticipation fp WHERE fp.filmid IN (SELECT * FROM ingmarbergmanmovies) GROUP BY filmid ) SELECT f.filmid, c.ant, f.prodyear, fr.rank AS rating FROM film f INNER JOIN crew c ON f.filmid = c.filmid INNER JOIN filmrating fr ON fr.filmid = f.filmid WHERE f.filmid IN (SELECT * FROM ingmarbergmanmovies) ORDER BY f.prodyear; /* Svar */ /* filmid | ant | prodyear | rating --------+-----+----------+-------- 526715 | 38 | 1946 | 7.3 736149 | 26 | 1946 | 6.5 10242 | 31 | 1947 | 6.8 569009 | 45 | 1948 | 6.6 736261 | 31 | 1948 | 6 736677 | 34 | 1949 | 6.5 712219 | 36 | 1949 | 6.6 736581 | 38 | 1950 | 7.7 736613 | 33 | 1950 | 7 473506 | 35 | 1951 | 7.5 736181 | 42 | 1952 | 7 235475 | 55 | 1953 | 7.4 357011 | 38 | 1953 | 7.7 409137 | 41 | 1954 | 6.9 736165 | 44 | 1955 | 6.8 409297 | 43 | 1955 | 7.7 736501 | 38 | 1957 | 8.2 526450 | 51 | 1957 | 8.4 243570 | 23 | 1958 | 6.9 206091 | 26 | 1958 | 7.7 736357 | 15 | 1958 | 9.7 243362 | 29 | 1960 | 7.2 736117 | 20 | 1960 | 8 736597 | 10 | 1961 | 8 736277 | 22 | 1962 | 8.1 225906 | 40 | 1963 | 9.1 429202 | 21 | 1963 | 7.9 713275 | 28 | 1964 | 5.9 736341 | 11 | 1966 | 8.1 19285 | 46 | 1967 | 7.5 736693 | 21 | 1968 | 7.8 736469 | 43 | 1968 | 8.4 736325 | 22 | 1969 | 7.7 736373 | 10 | 1969 | 7.2 712363 | 9 | 1970 | 7.5 267891 | 30 | 1971 | 5.6 736725 | 25 | 1972 | 8.1 736405 | 16 | 1973 | 8.4 414116 | 48 | 1975 | 7.9 206075 | 23 | 1976 | 7.4 459028 | 53 | 1977 | 6.1 654211 | 24 | 1978 | 8 712347 | 5 | 1979 | 7.5 236091 | 23 | 1980 | 7.3 50738 | 85 | 1982 | 7.9 42980 | 16 | 1983 | 8.2 597467 | 10 | 1984 | 6.9 736133 | 5 | 1984 | 6.1 243634 | 17 | 1986 | 6.1 552955 | 14 | 1986 | 8 736229 | 18 | 1992 | 6.8 519011 | 28 | 1993 | 7.4 513235 | 9 | 1995 | 8.3 571921 | 25 | 1997 | 6.8 735845 | 7 | 2000 | 7.3 572177 | 9 | 2003 | 7.8 (56 rows) */