Databases & SQL: oefenvragen met uitleg

Gratis meerkeuzevragen over Databases & SQL met hints en uitleg, op drie niveaus: kernbegrippen en feiten, begrippen toepassen, casussen en analyse.

Gratis oefenopgaveMakkelijk

Welke constraint zorgt ervoor dat een kolom nooit leeg (NULL) kan blijven?

Oefen Databases & SQL gratisOefen nu Databases & SQLElke dag 5 gratis opgaven. Geen creditcard nodig.

Wat je oefent

  1. Makkelijkkernbegrippen en feiten
  2. Gemiddeldbegrippen toepassen
  3. Moeilijkcasussen en analyse

Leer Databases & SQL vanaf nul

1Wat een relationele database is

Een relationele database slaat gegevens op in tabellen. Een tabel lijkt op een spreadsheet: elke rij is één record, elke kolom is één eigenschap.

Een winkel kan een tabel customers hebben met de kolommen id, name en city, en een tabel orders met de kolommen id, customer_id en total.

Een primaire sleutel is een kolom, of een set kolommen, die elke rij uniek identificeert. Ze kan nooit worden herhaald en nooit leeg zijn. Hier is dat de id van elke tabel.

Een vreemde sleutel (foreign key) is een kolom die verwijst naar de primaire sleutel van een andere tabel. In orders zegt customer_id welke klant de bestelling plaatste.

Zo worden tabellen gekoppeld: één klant kan veel bestellingen hebben, maar elke bestelling hoort bij één klant. Dat is een een-op-veel-relatie.

SQL (Structured Query Language) is de taal waarmee je tabellen maakt, gegevens wijzigt en er vragen over stelt.

Zelftoets Wat is een primaire sleutel?
  1. De eerste kolom van elke tabel
  2. Een index die zoekopdrachten sneller maakt
  3. Een kolom die naar een rij in een andere tabel verwijst
  4. Een kolom of set kolommen die elke rij uniek identificeert

Antwoord: Een kolom of set kolommen die elke rij uniek identificeert. Een primaire sleutel is uniek en nooit NULL, dus ze wijst precies één rij aan. Een kolom die naar een andere tabel verwijst, is een vreemde sleutel.

2Gegevens lezen met SELECT

De meeste vragen gaan over de SELECT-opdracht. Ze is opgebouwd uit clausules, altijd in deze volgorde geschreven:

SELECT … FROM … WHERE … GROUP BY … HAVING … ORDER BY …
  • SELECT noemt de kolommen die je wilt. DISTINCT verwijdert dubbele rijen.
  • FROM noemt de tabel, of de tabellen die aan elkaar gekoppeld zijn.
  • WHERE houdt alleen de rijen over die aan een voorwaarde voldoen, bijvoorbeeld WHERE total > 20.
  • GROUP BY stopt rijen met dezelfde waarde in één groep, zodat je per groep kunt tellen of optellen.
  • HAVING houdt alleen de groepen over die aan een voorwaarde voldoen. Ze mag aggregaten gebruiken, wat WHERE niet mag.
  • ORDER BY sorteert het resultaat, standaard oplopend; voeg DESC toe voor hoogste eerst.

De aggregatiefuncties vatten veel rijen samen in één waarde: COUNT, SUM, AVG, MIN en MAX.

De database voert de clausules niet uit in de volgorde waarin je ze schrijft. Ze voert eerst FROM uit, dan WHERE, GROUP BY, HAVING, SELECT en ten slotte ORDER BY.

Andere opdrachten wijzigen gegevens: INSERT voegt rijen toe, UPDATE wijzigt rijen en DELETE verwijdert rijen. CREATE, ALTER en DROP wijzigen de tabellen zelf.

Zelftoets Je wilt alleen de klanten met meer dan 5 bestellingen. Welke clausule filtert op COUNT(*) > 5?
  1. DISTINCT
  2. HAVING
  3. ORDER BY
  4. WHERE

Antwoord: HAVING. De telling bestaat pas nadat de rijen zijn gegroepeerd, en HAVING filtert groepen. WHERE wordt vóór het groeperen uitgevoerd, dus kan geen aggregaat zoals COUNT gebruiken.

3Joins, normalisatie en transacties

Een join combineert rijen van twee tabellen met een voorwaarde, meestal vreemde sleutel = primaire sleutel:

FROM customers c JOIN orders o ON o.customer_id = c.id
  • INNER JOIN (of JOIN) houdt alleen rijen over die in beide tabellen een match hebben.
  • LEFT JOIN houdt elke rij van de linkertabel. Waar geen match is, zijn de kolommen van de rechtertabel NULL.
  • NULL betekent dat een waarde ontbreekt of onbekend is. Toets het met IS NULL, nooit met = NULL.

Normalisatie splitst tabellen zodat elk feit één keer wordt opgeslagen. Zo voorkom je dat hetzelfde feit op meerdere plaatsen moet worden bijgewerkt.

  • 1NF: elke cel bevat één atomaire waarde, zonder herhalende groepen.
  • 2NF: 1NF, en elke niet-sleutelkolom hangt af van de hele sleutel, niet van een deel van een samengestelde sleutel.
  • 3NF: 2NF, en geen enkele niet-sleutelkolom hangt af van een andere niet-sleutelkolom.

Een transactie groepeert opdrachten tot één eenheid. COMMIT maakt haar definitief en ROLLBACK maakt haar ongedaan. Transacties volgen ACID: atomiciteit (alles of niets), consistentie, isolatie en duurzaamheid.

Zelftoets Een klant heeft geen bestellingen geplaatst. Wat gebeurt er met die klant in customers LEFT JOIN orders?
  1. De klant verschijnt één keer voor elke bestelling in de tabel
  2. De klant verschijnt één keer, met NULL in de bestelkolommen
  3. De klant wordt uit het resultaat weggelaten
  4. De query mislukt met een foutmelding

Antwoord: De klant verschijnt één keer, met NULL in de bestelkolommen. Een LEFT JOIN houdt elke rij van de linkertabel en vult de ontbrekende rechterkant met NULL. De klant weglaten is wat een INNER JOIN doet.

4De methode stap voor stap

Om een query te schrijven, of uit te zoeken wat een gegeven query teruggeeft:

  1. Zoek de tabellen die de gegevens bevatten, en hoe ze door sleutels zijn gekoppeld.
  2. Schrijf FROM met de joins. Kies LEFT JOIN als rijen zonder match moeten blijven.
  3. Voeg WHERE toe voor voorwaarden op afzonderlijke rijen.
  4. Als de vraag “per” of “voor elke” zegt, voeg dan GROUP BY en het aggregaat toe.
  5. Voeg HAVING toe voor voorwaarden op het aggregaat, en dan ORDER BY als de volgorde ertoe doet.
  6. Controleer het resultaat op een klein voorbeeld: som de rijen op na elke clausule, in de volgorde waarin de database ze uitvoert.

Benoem bij een theorievraag eerst het begrip (een sleutel, een jointype, een normaalvorm, een ACID-eigenschap) en kies dan de optie die bij de definitie past.

5Een uitgewerkt voorbeeld

Volg elke stap. Probeer de volgende stap te voorspellen voordat je hem opent.

Uitgewerkt voorbeeld

De tabel customers heeft de rijen (1, Ana), (2, Ben) en (3, Cas). De tabel orders heeft de rijen (id, customer_id) = (10, 1), (11, 1), (12, 2) en (13, 1). Wat geeft deze query terug? SELECT c.name, COUNT(o.id) FROM customers c LEFT JOIN orders o ON o.customer_id = c.id GROUP BY c.name

1

Voer FROM en de join uit

Elke klant wordt gekoppeld aan de bestellingen met zijn id. Ana past bij bestellingen 10, 11 en 13. Ben past bij bestelling 12.

Cas heeft geen bestellingen. Omdat het een LEFT JOIN is, blijft Cas in het resultaat, met NULL voor o.id.

2

Som de gejoinde rijen op

  • Ana, 10
  • Ana, 11
  • Ana, 13
  • Ben, 12
  • Cas, NULL

Dat zijn 5 rijen.

3

Groepeer op naam

GROUP BY c.name maakt drie groepen: Ana met 3 rijen, Ben met 1 rij en Cas met 1 rij.

4

Tel per groep

COUNT(o.id) telt alleen de waarden die niet NULL zijn. Ana krijgt 3 en Ben krijgt 1.

Cas heeft één rij, maar zijn o.id is NULL, dus Cas krijgt 0.

5

Controleer het antwoord

Ana, Ben en Cas hebben samen 3 + 1 + 0 = 4 bestellingen, evenveel als het aantal rijen in orders. Met COUNT(*) zou Cas ten onrechte 1 krijgen, omdat COUNT(*) de rij zelf telt.

Antwoord

Ana 3, Ben 1, Cas 0.

6Veelgemaakte fouten

  • Een aggregaat gebruiken in WHERE. Voorwaarden op COUNT, SUM of AVG horen in HAVING.
  • = NULL schrijven. Elke vergelijking met NULL is onbekend; gebruik IS NULL of IS NOT NULL.
  • Een INNER JOIN gebruiken als rijen zonder match moeten blijven. Gebruik een LEFT JOIN.
  • De joinvoorwaarde vergeten. Zonder ON wordt elke rij met elke rij gekoppeld (een cross join).
  • Een kolom selecteren die niet in GROUP BY staat en ook niet in een aggregaat.
  • DELETE (verwijdert rijen) en DROP TABLE (verwijdert de hele tabel) door elkaar halen.
  • UPDATE of DELETE uitvoeren zonder WHERE. Het verandert elke rij in de tabel.
Zelftoets Een tabel heeft 10 rijen en de kolom col is in elke rij NULL. Wat geeft SELECT COUNT(col) terug?
  1. 0
  2. 10
  3. 1
  4. NULL

Antwoord: 0. COUNT(col) telt alleen waarden die niet NULL zijn, dus het geeft 0. COUNT(*) telt rijen en zou 10 teruggeven.

7Hoe tentamenvragen eruitzien

  • Makkelijk: kernbegrippen en feiten. Wat SELECT, WHERE, ORDER BY of DELETE doen, primaire en vreemde sleutels, wat NULL betekent.
  • Gemiddeld: concepten toepassen. De juiste query voor een taak, WHERE tegenover HAVING, inner tegenover outer joins, de normaalvormen, ACID.
  • Moeilijk: gevallen en analyse. Subqueries, isolatieniveaus en hun anomalieën, BCNF, vensterfuncties, indexen en queryprestaties, SQL-injectie.

Traceer een gegeven query op een paar rijen in de volgorde FROM, WHERE, GROUP BY, HAVING, SELECT, ORDER BY. De meeste valkuilen komen binnen drie rijen naar boven.

Leer het stap voor stap in de appLeer het stap voor stap in de app

Voorbeeldvragen

Voorbeeld 1Makkelijk

Wat doet UNION met de resultaten van twee SELECT-query's?

  1. AKoppelt ze naast elkaar op een sleutel
  2. BHoudt alleen rijen over die in beide voorkomen
  3. CVoegt ze samen tot één resultaat en verwijdert dubbele rijen
  4. DHoudt alleen rijen over die in de eerste query voorkomen maar niet in de tweede
Hints tonen
  1. Beide query's moeten evenveel compatibele kolommen hebben.
  2. Twee foute antwoorden zijn nu doorgestreept. Een van de twee overgebleven antwoorden is goed.
Toon het antwoord en de uitleg

Waarom dit het antwoord is

UNION zet de rijen van beide query's onder elkaar en verwijdert duplicaten; UNION ALL houdt de duplicaten.

Antwoord

C · Voegt ze samen tot één resultaat en verwijdert dubbele rijen
Voorbeeld 2Gemiddeld

Wat geeft SELECT SUM(amount) FROM orders terug als de WHERE-clausule op geen enkele rij past?

  1. AEen fout
  2. B0
  3. CNULL
  4. DEen lege string
Hints tonen
  1. SUM verschilt hier van COUNT.
  2. Twee foute antwoorden zijn nu doorgestreept. Een van de twee overgebleven antwoorden is goed.
Toon het antwoord en de uitleg

Waarom dit het antwoord is

SUM, AVG, MIN en MAX geven NULL terug bij een lege verzameling, terwijl COUNT 0 teruggeeft; COALESCE(SUM(amount), 0) geeft in plaats daarvan 0.

Antwoord

C · NULL
Voorbeeld 3Moeilijk

Wat geeft SELECT name, dept, AVG(salary) OVER (PARTITION BY dept) FROM emp terug?

  1. AAlleen werknemers die meer verdienen dan het gemiddelde van hun afdeling
  2. BElke werknemersrij samen met het gemiddelde salaris van de afdeling
  3. CEen fout, omdat name niet in een GROUP BY staat
  4. DEén rij per afdeling met het gemiddelde salaris
Hints tonen
  1. Vensterfuncties voegen rijen niet samen.
  2. Twee foute antwoorden zijn nu doorgestreept. Een van de twee overgebleven antwoorden is goed.
Toon het antwoord en de uitleg

Waarom dit het antwoord is

Anders dan GROUP BY houdt een vensterfunctie elke invoerrij en voegt een waarde toe die over de partitie is berekend, hier de afdeling.

Antwoord

B · Elke werknemersrij samen met het gemiddelde salaris van de afdeling

Vragen en antwoorden

Databases & SQL: wat is het?

Een relationele database slaat gegevens op in tabellen. Een tabel lijkt op een spreadsheet: elke rij is één record, elke kolom is één eigenschap.

Een winkel kan een tabel customers hebben met de kolommen id, name en city, en een tabel orders met de kolommen id, customer_id en total.

Databases & SQL: hoe leer je het stap voor stap?
  1. Wat een relationele database is
  2. Gegevens lezen met SELECT
  3. Joins, normalisatie en transacties
  4. De methode stap voor stap
  5. Een uitgewerkt voorbeeld
  6. Veelgemaakte fouten
  7. Hoe tentamenvragen eruitzien
Databases & SQL: wat oefen je?
  • Makkelijk: kernbegrippen en feiten
  • Gemiddeld: begrippen toepassen
  • Moeilijk: casussen en analyse

Elke vraag heeft vier antwoordopties en maar één is juist. Kom je vast te zitten? Open eerst een kleine hint en de volledige uitleg pas als je die nodig hebt.

Zo werkt het oefenen

  • Elke vraag heeft vier antwoordopties en maar één is juist.
  • Kom je vast te zitten? Open eerst een kleine hint en de volledige uitleg pas als je die nodig hebt.
  • Je voortgang, fouten en bewaarde opgaven blijven bewaard, zodat je vóór het tentamen kunt herhalen.

Vakken met dit onderwerp

Meer onderwerpen in Informatica

Printbaar werkblad

Oefen Databases & SQL gratisOefen nu Databases & SQLElke dag 5 gratis opgaven. Geen creditcard nodig.