dbsys.info

Løsningsforslag til kapittel 2

Oppgave 1a

All informasjon om filmer produsert i 1988.


SELECT *
FROM Film
WHERE År = 1988

Oppgave 1b

Tittel på amerikanske filmer produsert på 1980-tallet.


SELECT FNr, Tittel
FROM Film
WHERE Land = 'USA' AND År BETWEEN 1980 AND 1989

FNr er tatt med for å skille mellom filmer med samme tittel.

Oppgave 1c

Komedier med aldersgrense under 10 år og spilletid under 130 minutter.


SELECT *
FROM Film
WHERE Sjanger = 'Komedie' AND Alder < 10 AND Tid < 130

Oppgave 1d

Tittel på alle action- og western-filmer.


SELECT FNr, Tittel
FROM Film
WHERE Sjanger = 'Action' OR Sjanger = 'Western'

Oppgave 1e

Alle produksjonsland, sortert og uten gjentakelser.


SELECT DISTINCT Land
FROM Film
ORDER BY Land

Oppgave 1f

Korteste og lengste spilletid innen hver sjanger.


SELECT Sjanger, MIN(Tid) AS Korteste, MAX(Tid) AS Lengste
FROM Film
GROUP BY Sjanger

Oppgave 1g

Antall filmer som ikke er til salgs, altså ikke tilgjengelig for nedlasting.


SELECT COUNT(*) AS IkkeTilSalgs
FROM Film
WHERE Pris IS NULL

Oppgave 1h

Antall filmer under 100 kr.


SELECT COUNT(Pris) AS Billigfilmer
FROM Film
WHERE Pris < 100

Oppgave 1i

Filmer med tittel som slutter på 'now'.


SELECT *
FROM Film
WHERE UCASE(Tittel) LIKE '%NOW'

UCASE fungerer i MySQL, bruk UPPER i Oracle.

Oppgave 1j

Gjennomsnittspris for sjangre med flere enn 2 filmer.


SELECT Sjanger, AVG(Pris) AS Snittpris
FROM Film
GROUP BY Sjanger
HAVING COUNT(*) > 2

Oppgave 1k

Prisspennet innen hver sjanger.


SELECT Sjanger, MAX(Pris)-MIN(Pris) AS Prisspenn
FROM Film
GROUP BY Sjanger

Oppgave 1l

Totalt antall filmer i tabellen og antall filmer til salgs, fordelt på produksjonsland.


SELECT Land, COUNT(*) AS TotaltAntall,
  COUNT(Pris) AS AntallTilSalgs
FROM Film
GROUP BY Land

Oppgave 1m

Antall år siden utgivelse for filmer eldre enn 60 år.

Løsning for MySQL:


SELECT FNr, YEAR(CURDATE())-År AS AntallÅr
FROM Film
WHERE YEAR(CURDATE())-År > 60;

Navn på datofunksjoner varierer fra system til system, se vedlegg A.

Oppgave 2a

Nummer og beskrivelse for hytter med ukepris under kr 4 500 som har 4 eller flere sengeplasser.


SELECT Nr, Beskrivelse
FROM Hytte
WHERE Ukepris < 4500 AND AntallSenger >= 4

Oppgave 2b

Hytter med strøm og dusj, sortert på stigende ukepris. Kolonnene Strøm og Dusj inneholder verdiene 'J' og 'N'.


SELECT Nr, Beskrivelse, AvstandAlpin, AntallSenger, Ukepris
FROM Hytte
WHERE Strøm = 'J' AND Dusj = 'J'
ORDER BY Ukepris

Oppgave 2c

Antall hytter med 2 sengeplasser, 3 sengeplasser, og så videre.


SELECT AntallSenger, COUNT(*) AS AntallHytter
FROM Hytte
WHERE AntallSenger >= 2
GROUP BY AntallSenger

Oppgave 2d

Gjennomsnittlig ukepris for hytter med 4 sengeplasser.


SELECT AVG(Ukepris) AS Snittpris
FROM Hytte
WHERE AntallSenger = 4

Oppgave 2e

Antall hytter mindre enn 500 meter fra alpinbakken.


SELECT COUNT(*) AS AntallHytter
FROM Hytte
WHERE AvstandAlpin < 500

Oppgave 3

Finn skrivefeil i tabellen Vare (gal skrivemåte for gr og stk).

Gram skal forkortes g (uten punktum), så vi kan jo prøve å finne alle varer som inneholder "gr" i Betegnelse:


SELECT *
FROM Vare
WHERE Betegnelse LIKE '%gr%'

Vi får med litt for mange, f.eks. "Sølvgran" som inneholder "gr" i navnet uten at det har noe med vekt å gjøre.

Neste spørring gir færre irrelevante rader ved å utvide mønsteret med "0 ". Hvis vi forutsetter at det alltid kommer et tall som slutter på 0 foran "gr" blir dette en presis spørring, men vi får altså ikke med navn som inneholder f.eks. "35 gr".


SELECT *
FROM Vare
WHERE Betegnelse LIKE '%0 gr%'

For å få med alle tall som enten slutter på 0 eller 5:


SELECT *
FROM Vare
WHERE Betegnelse LIKE '%0 gr%' OR Betegnelse LIKE '%5 gr%'

Vi skulle også finne alle varenavn der "stk" kommer rett etter et tall. Det er mulig å bruke jokernotasjon som over. I MySQL kan vi også bruke såkalte regulære uttrykk med operatoren REGEXP.


SELECT *
FROM Vare
WHERE Betegnelse REGEXP '[0-9]stk'

 

Regulære uttrykk i MySQL