Basis van databases

Uit de tabel Klant (KlantID, Naam) en de tabel Bestelling (BestelID, KlantID, Bedrag) moeten de namen worden opgevraagd van klanten die nog nooit iets hebben besteld. Welk SQL-statement is juist?

  1. ASELECT Naam FROM Klant WHERE EXISTS (SELECT * FROM Bestelling WHERE Bestelling.KlantID = Klant.KlantID)
  2. BSELECT Naam FROM Klant WHERE NOT EXISTS (SELECT * FROM Bestelling)
  3. CSELECT Naam FROM Klant WHERE NOT EXISTS (SELECT * FROM Bestelling WHERE Bestelling.KlantID = Klant.KlantID)
Antwoord en toelichting tonen

Antwoord: C. SELECT Naam FROM Klant WHERE NOT EXISTS (SELECT * FROM Bestelling WHERE Bestelling.KlantID = Klant.KlantID)

EXISTS is een predicaat dat waar is als de subquery tussen haakjes minstens één rij teruggeeft en onwaar als ze er geen teruggeeft; NOT EXISTS is het omgekeerde. Door in de subquery een kolom van de buitenste tabel te gebruiken, zoals in Bestelling.KlantID = Klant.KlantID, wordt het een gecorreleerde subquery die voor elke rij van de buitenste tabel Klant nagaat of die klant bestellingen heeft. In combinatie met NOT EXISTS blijven alleen de klanten zonder enige bestelling over. Met EXISTS krijg je het omgekeerde: de klanten die wel iets hebben besteld. Zonder een voorwaarde die de subquery aan de klant koppelt, geeft de subquery altijd rijen terug zolang de tabel Bestelling minstens één rij heeft, dus is NOT EXISTS altijd onwaar en heeft het resultaat nul rijen. Hetzelfde resultaat is ook te krijgen met een LEFT OUTER JOIN, door de rijen te selecteren waarin de kolommen aan de kant van Bestelling NULL zijn.

Dit onderwerp oefenen Naar de onderwerppagina

Meer vragen over Basis van databases

  1. Welke beschrijving van een view in een relationele database is juist?
  2. Wat is het belangrijkste doel van de normalisatie van tabellen in een relationele database?
  3. De primaire sleutel van de tabel Bestelling (BestelNr, ArtikelNr, Aantal, KlantNr, Klantnaam) is {BestelNr, ArtikelNr}, en de functionele afhankelijkheden zijn {BestelNr, ArtikelNr} → Aantal, BestelNr → KlantNr en KlantNr → Klantnaam. Wat is het juiste resultaat van de normalisatie van deze tabel tot de derde normaalvorm?
  4. De primaire sleutel van de tabel Medewerker (MedewerkerNr, Naam, Afdelingscode, Afdelingsnaam) is MedewerkerNr, en elke kolom bevat één waarde. De functionele afhankelijkheden zijn MedewerkerNr → Naam, MedewerkerNr → Afdelingscode en Afdelingscode → Afdelingsnaam. Welke uitspraak over de normaalvorm van deze tabel is juist?
  5. In een database die vooral wordt gebruikt om te lezen en te aggregeren, worden tabellen die door normalisatie zijn opgesplitst soms bewust samengevoegd tot één tabel, zodat dezelfde gegevens dubbel worden bewaard (denormalisatie). Welke combinatie van een voordeel en een nadeel van dit ontwerp is juist?