Midtveiseksamen · TDT4145 · Vår 2026

Midtveiseksamen 2026

Del 1-stil · 14 flervalg + 5 langsvar · Total: ~95 poeng

Klikk et alternativ for å låse svaret. På langsvar — skriv selv og åpne fasit-feltet.

Del 1 — Flervalg

Relasjonsalgebra, SQL, ER-modellering, normalformer.

Q1.1 Relational Operators 5 % Kap. 2

Hvilken av de følgende er ikke en basis/fundamental operator i relasjonsalgebraen?

  • A Set intersection.
  • B Set union.
  • C No other alternative is correct.
  • D Selection.
  • E Projection.
Vis fasit
Riktig svar: A

De fundamentale operatorene er σ (selection), π (projection), × (cartesian product), ∪ (union), − (set difference) og ρ (rename). Set intersection kan utledes fra differanse: R ∩ S = R − (R − S).

Pensum: Kap. 2 — Relasjonsalgebra

Q1.2 Keys 5 % Kap. 2

Den minimale mengden av en supernøkkel (superkey) kalles for:

  • A Minimal subkey.
  • B No other alternative is correct.
  • C Candidate key.
  • D Primary key.
  • E Discriminator.
Vis fasit
Riktig svar: C

En kandidatnøkkel er per definisjon en minimal supernøkkel — fjerning av et hvilket som helst attributt gir en mengde som ikke lenger unikt identifiserer rader. Primærnøkkelen er én utvalgt kandidatnøkkel.

Pensum: Kap. 2 — Relasjonsmodellen

Q1.3 Join Types 5 % Kap. 2

Velg alle utsagn fra det følgende som er sanne (multi-select):

  • A The order in which inner joins are written does not affect the result of a query.
  • B A full outer join always results in tuples that contain null values.
  • C The size of the result of a left outer join is always equal to the size of the left relation.
  • D Every natural join operation can be replaced by a combination of the cross product and the selection operator.
  • E The result size of a full outer join is always smaller than that of the cross product.
Vis fasit
Riktig svar: A og D (multi-select)

A — sant: inner join er assosiativ og kommutativ (modulo attributt-rekkefølge).

B — usant: hvis alle rader matcher, vil ingen null-verdier oppstå.

C — usant: én rad i venstre relasjon kan matche flere rader i høyre, så resultatet kan bli større enn venstre relasjon.

D — sant: R ⋈ S ≡ π_attrs(σ_θ(R × S)) (med en passende projeksjon for å fjerne duplikat-kolonner — i denne kursets tradisjon teller dette som «kombinasjon med selection»).

E — usant: hvis R og S er små og ikke matcher, kan |R ⋈_full S| = |R|+|S| {{«}}større{{»}} enn |R|·|S|. Eks: |R|=|S|=1 og ingen match → kryss = 1, full outer = 2.

Pensum: Kap. 2 — Relasjonsalgebra

Q1.4 RA Result 5 % Kap. 2

Følgende tabeller er gitt:

employee
namesalarymanager
Alice40000John
Trevor38000John
Bob35000Trevor
Jim35000Trevor
Dorothy36000Trevor
person
f_namesalarycity
Siobhan40000Trondheim
Marine35000Zurich
Yiyu35000Athens

Hvor mange tupler returnerer det opprinnelige RA-uttrykket (eks: πname(employee ⋈employee.salary = person.salary σcity='Trondheim'(person)))?

Det presise RA-uttrykket fra papireksamen vises ikke i denne digitale versjonen. Fasit her følger den oppgitte løsningen.
Vis fasit
Riktig svar: 1

Med den oppgitte løsningen er svaret 1 tuppel. Den eneste personen i Trondheim er Siobhan med salary=40000; den eneste employee med salary=40000 er Alice — gir én match.

Pensum: Kap. 2 — Relasjonsalgebra

Q1.5 SQL Query Result 1 5 % Kap. 3

Den følgende tabellen er gitt:

employee
namesalarymanager
John50000NULL
Alice40000John
Trevor38000John
Bob35000Trevor
Jim35000Trevor
Dorothy36000Trevor
Samuel36000Alice

Hva er resultatet av:

SELECT count(*)
FROM employee AS a, employee AS b
WHERE a.salary < 40000
Vis fasit
Riktig svar: 35

Antall employees med salary < 40000: Trevor, Bob, Jim, Dorothy, Samuel = 5. WHERE-klausulen filtrerer kun på a; b kjøres som ufiltrert kryssprodukt med alle 7 ansatte. Resultat: 5 × 7 = 35.

Pensum: Kap. 3 — Joins og subqueries

Q1.6 SQL Query Result 2 5 % Kap. 3

Samme employee-tabell som over. Hva er resultatet av:

SELECT b.salary
FROM employee AS a JOIN employee AS b ON (a.manager = b.name)
WHERE a.salary < 36000
ORDER BY b.salary
LIMIT 1
Vis fasit
Riktig svar: 38000

Employees med salary < 36000: Bob (35000) og Jim (35000). Begge har manager = Trevor. Trevor har salary = 38000. ORDER BY + LIMIT 1 gir 38000.

Pensum: Kap. 3 — Joins og subqueries

Q1.7 SQL og Relasjonsalgebra 5 % Kap. 2/3

Skjema: bar(bar_id, name), drink(drink_id, name), serves(bar_id, drink_id, price) der serves.bar_id → bar.bar_id og serves.drink_id → drink.drink_id. Hvilket RA-uttrykk er ekvivalent med:

SELECT bar.name, drink.name
FROM bar, serves, drink
WHERE bar.bar_id = serves.bar_id
  AND drink.drink_id = serves.drink_id
  AND price > 20
  • A πbar.name, drink.nameprice > 20(bar ⋈ serves ⋈ drink))
  • B σprice > 20bar.name, drink.name(bar ⋈ serves ⋈ drink))
  • C πbar.name, drink.name(bar ⋈ serves ⋈ drink) ∩ σprice > 20(serves)
  • D πbar.name, drink.namebar.bar_id = drink.drink_id(bar × serves × drink))
Vis fasit
Riktig svar: A

SQL-spørringen joiner alle tre tabeller på fremmednøkler, filtrerer på price > 20, og projiserer på de to navnekolonnene. Det matcher A.

B prøver å projisere før selection, men da er price borte og selection feiler. C bruker ∩ feilaktig (ulike skjemaer). D bytter join-betingelsen ut med en ulogisk likhet.

Pensum: Kap. 3 — Joins og subqueries

Q1.8 Terminology 5 % Kap. 3

Hvilken term matcher best beskrivelsen:

"A relation that is not part of the conceptual model but is made visible to a user as a 'virtual relation'"

  • A Domain.
  • B No other alternative is correct.
  • C Decomposition.
  • D View.
  • E Assertion.
Vis fasit
Riktig svar: D

En view er en navngitt SELECT-spørring som presenteres for brukeren som en tabell, men som ikke nødvendigvis er materialisert i den underliggende konseptuelle modellen — derav "virtual relation".

Pensum: Kap. 3 — Views, transaksjoner, integritet

Q1.9 SQL Query Processing 5 % Kap. 3

Når et SQL-query (uten nøstede subqueries) prosesseres, hvilken av klausulene utføres til slutt (av de oppgitte)?

  • A WHERE.
  • B SELECT.
  • C GROUP BY.
  • D FROM.
  • E HAVING.
Vis fasit
Riktig svar: B

Logisk evalueringsrekkefølge: FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY. Av alternativene som er listet, er SELECT sist.

Dette forklarer hvorfor man ikke kan referere til SELECT-aliaser i WHERE.

Pensum: Kap. 3 — DDL og spørringer

Q1.10 Transactions (ACID) 5 % Kap. 8

ACID består av Atomicity, Consistency, ?, og Durability. Hva står "I" for?

  • A Isolation.
  • B Indexing.
  • C Integrity.
  • D Irreversibility.
Vis fasit
Riktig svar: A

I i ACID står for Isolation: konkurrente transaksjoner skal oppføre seg som om de kjørte serielt (avhengig av valgt isolasjonsnivå).

Pensum: Kap. 8 — Transaksjoner: teori

Q1.11 Foreign Keys 5 % Kap. 3

Tabellen T:

CREATE TABLE T (
    tid varchar(20),
    attr integer,
    PRIMARY KEY (tid)
)

Du kjører deretter:

CREATE TABLE RT (
    tid varchar(20),
    attr varchar(20),
    PRIMARY KEY (tid),
    FOREIGN KEY (attr) REFERENCES T
)

Hvilken setning er sann?

  • A The query fails because no attribute was given in the foreign key definition.
  • B The query is executed successfully; RT.attr of table RT references T.attr.
  • C No other alternative is correct.
  • D The query fails because T.attr and RT.attr have different domains.
  • E The query is executed successfully; RT.attr references T.tid.
Vis fasit
Riktig svar: E

Når FOREIGN KEY (...) REFERENCES T oppgis uten kolonnenavn på høyresiden, refereres primærnøkkelen til T — som her er tid. T.tid er varchar(20) og RT.attr er varchar(20): domenene matcher, og setningen utføres.

Pensum: Kap. 3 — Views, transaksjoner, integritet

Q1.12 ER to Relations 5 % Kap. 4

Se det aktuelle ER-diagrammet (et typisk M:N-forhold mellom to entiteter, som Person ⨯ Movie via review). Hva er minimum antall relasjoner som trengs for å mappe det til relasjonsmodellen?

ER-figuren vises ikke her. Standardsvaret for det opprinnelige diagrammet (Person—reviews—Movie, M:N) er 3 tabeller.
  • A No other alternative is correct.
  • B The ER diagram cannot be mapped to relations.
  • C 2.
  • D 3.
  • E 1.
Vis fasit
Riktig svar: D

For et M:N-forhold trenger man én tabell per entitet (Person, Movie) pluss én join-tabell for relasjonen (Review). Totalt: 3 tabeller. 1:N kunne ha klart seg med 2; et 1:1-forhold med total deltagelse på én side også 2.

Pensum: Kap. 4 — ER til relasjon

Q1.13 Constraints in ER 5 % Kap. 4

Basert på det samme Person/Movie-review-diagrammet (M:N, ingen total deltagelse, review-tekst er ikke unik), velg alle utsagn som er sanne (multi-select):

ER-figuren vises ikke her. Fasit antar standard-tolkning av M:N med svak relasjon.
  • A A person can review multiple movies; a movie can be reviewed by multiple people.
  • B Each movie must have at least 1 review.
  • C A person cannot submit two separate reviews for the same movie.
  • D Each movie can be reviewed by at most one person.
  • E No two reviews can have the same review text.
Vis fasit
Riktig svar: A og C (multi-select)

A: Stemmer for et standard M:N-forhold. C: Stemmer hvis (person, movie) er nøkkel for review (ingen diskriminator) — typisk antakelse i denne tradisjonen.

B krever total deltagelse (vanligvis ikke gitt). D ville krevd 1:N. E krever et nøkkel-constraint på review-teksten — ikke vist.

Pensum: Kap. 4 — ER-modellen

Q1.14 Normal Forms 5 % Kap. 4

Alle relasjoner som er på BCNF, er også på:

  • A Second normal form.
  • B First, second, and third normal form.
  • C First normal form.
  • D None of the other alternatives.
  • E Third normal form.
Vis fasit
Riktig svar: B

Hierarkiet er BCNF ⊂ 3NF ⊂ 2NF ⊂ 1NF. Alle BCNF-relasjoner oppfyller derfor 1NF, 2NF og 3NF.

A og C/E er ikke feil — bare ufullstendige. B er det mest presise svaret.

Pensum: Kap. 4 — Normalformer

Del 2 — Langsvar

Skriv SQL/DDL selv. Skjemaet er quiz(quiz_id, quiz_title, quiz_max_points), question(quiz_id, quest_num, quest_text, quest_max_points), student(sid, first_name, last_name), answer(sid, quiz_id, question_num, points_gained).

Q2.1 SQL DDL 10 % Kap. 3

Skriv SQL-koden som lager tabellen question slik at:

  • quiz_id og quest_num er av typen integer.
  • quest_max_points er av numeric-typen med maksimalt 2 siffer og ingen desimaler.
  • quest_text er av typen varchar(100).
  • De underlinjede attributtene (quiz_id, quest_num) er primærnøkler.
  • quiz_id er en fremmednøkkel som refererer attributtet med samme navn i quiz.
  • quest_text og quest_max_points kan ikke være NULL.
  • Verdien til quest_max_points skal være innen [0, 20].
Vis fasit
Eksempel-svar:
CREATE TABLE question (
    quiz_id          integer       NOT NULL,
    quest_num        integer       NOT NULL,
    quest_text       varchar(100)  NOT NULL,
    quest_max_points numeric(2,0)  NOT NULL CHECK (quest_max_points BETWEEN 0 AND 20),
    PRIMARY KEY (quiz_id, quest_num),
    FOREIGN KEY (quiz_id) REFERENCES quiz(quiz_id)
);

Pass på at NOT NULL ligger på de to nevnte kolonnene, at numeric(2,0) dekker «maks 2 siffer, ingen desimaler», og at både PK og FK er deklarert riktig.

Pensum: Kap. 3 — DDL og spørringer

Q2.2 SQL Query 1 5 % Kap. 3

Finn alle quiz hvor summen av quest_max_points overskrider quiz_max_points for samme quiz. Skriv ut quiz_id.

Vis fasit
Eksempel-svar:
SELECT q.quiz_id
FROM   quiz q
JOIN   question qu ON qu.quiz_id = q.quiz_id
GROUP BY q.quiz_id, q.quiz_max_points
HAVING SUM(qu.quest_max_points) > q.quiz_max_points;

Du kan også bruke en korrelert subquery: WHERE q.quiz_max_points < (SELECT SUM(quest_max_points) FROM question WHERE quiz_id = q.quiz_id).

Pensum: Kap. 3 — Joins og subqueries

Q2.3 SQL Query 2 5 % Kap. 3

Beregn total poengsum per quiz oppnådd av studenten sid=12345, for quiz hvor tittelen inneholder ordet databases. Skriv ut quiz_id og total poengsum.

Vis fasit
Eksempel-svar:
SELECT a.quiz_id, SUM(a.points_gained) AS total
FROM   answer a
JOIN   quiz   q ON q.quiz_id = a.quiz_id
WHERE  a.sid = 12345
  AND  q.quiz_title LIKE '%databases%'
GROUP BY a.quiz_id;

Bruk ILIKE i PostgreSQL for case-insensitivt søk hvis ønskelig.

Pensum: Kap. 3 — Joins og subqueries

Q2.4 SQL Query 3 5 % Kap. 3

For quiz med quiz_id=4325: skriv ut alle quest_text for spørsmål som har blitt svart av minst én student. Ikke bruk aggregeringsfunksjoner.

Vis fasit
Eksempel-svar:
SELECT DISTINCT q.quest_text
FROM   question q
JOIN   answer   a ON a.quiz_id = q.quiz_id
                  AND a.question_num = q.quest_num
WHERE  q.quiz_id = 4325;

Alternativt med EXISTS: WHERE EXISTS (SELECT 1 FROM answer a WHERE a.quiz_id = q.quiz_id AND a.question_num = q.quest_num).

Pensum: Kap. 3 — Joins og subqueries

Q2.5 SQL Query 4 5 % Kap. 3

Skriv om følgende spørring uten nøstede subqueries:

SELECT first_name, last_name
FROM student
WHERE sid IN (
    SELECT sid
    FROM answer
    WHERE quiz_id = 4326
      AND question_num = 7
      AND points_gained > 10
)
Vis fasit
Eksempel-svar:
SELECT DISTINCT s.first_name, s.last_name
FROM   student s
JOIN   answer  a ON a.sid = s.sid
WHERE  a.quiz_id = 4326
  AND  a.question_num = 7
  AND  a.points_gained > 10;

DISTINCT trengs hvis en student kan ha flere svar som matcher (samme student kunne svart flere ganger). I praksis er (sid, quiz_id, question_num) unik, så DISTINCT er ofte overflødig — men trygt å ha med.

Pensum: Kap. 3 — Joins og subqueries

Slutt på midtveiseksamen 2026.