Grundlagen der Datenbanken

Aus einer Kundentabelle (KundenID, Name) und einer Bestelltabelle (BestellID, KundenID, Betrag) sollen die Namen der Kunden ermittelt werden, die noch nie bestellt haben. Welche SQL-Anweisung ist richtig?

  1. ASELECT Name FROM Kunde WHERE EXISTS (SELECT * FROM Bestellung WHERE Bestellung.KundenID = Kunde.KundenID)
  2. BSELECT Name FROM Kunde WHERE NOT EXISTS (SELECT * FROM Bestellung)
  3. CSELECT Name FROM Kunde WHERE NOT EXISTS (SELECT * FROM Bestellung WHERE Bestellung.KundenID = Kunde.KundenID)
Antwort und Erläuterung anzeigen

Antwort: C. SELECT Name FROM Kunde WHERE NOT EXISTS (SELECT * FROM Bestellung WHERE Bestellung.KundenID = Kunde.KundenID)

EXISTS ist ein Prädikat, das wahr ist, wenn die Unterabfrage in Klammern mindestens eine Zeile liefert, und falsch, wenn sie keine liefert; NOT EXISTS ist das Gegenteil. Wird in der Unterabfrage eine Spalte der äußeren Tabelle verwendet, wie bei Bestellung.KundenID = Kunde.KundenID, entsteht eine korrelierte Unterabfrage, die für jede Zeile der äußeren Kundentabelle prüft, ob dieser Kunde Bestellungen hat. In Kombination mit NOT EXISTS bleiben nur Kunden ohne jede Bestellung übrig. Mit EXISTS erhält man umgekehrt die Kunden, die schon bestellt haben. Fehlt eine Bedingung, die die Unterabfrage mit dem Kunden verknüpft, liefert die Unterabfrage immer Zeilen, sobald die Bestelltabelle mindestens eine Zeile hat; NOT EXISTS ist dann stets falsch, und das Ergebnis hat 0 Zeilen. Dasselbe Ergebnis erhält man auch mit einem LEFT OUTER JOIN, indem man die Zeilen auswählt, in denen die Spalten der Bestellseite NULL sind.

Dieses Thema üben Zur Themenseite

Weitere Fragen zu Grundlagen der Datenbanken

  1. Welche Aussage beschreibt einen View in einer relationalen Datenbank richtig?
  2. Was ist der Hauptzweck der Normalisierung von Tabellen in einer relationalen Datenbank?
  3. Der Primärschlüssel einer Auftragstabelle (AuftragsNr, ArtikelNr, Menge, KundenNr, Kundenname) ist {AuftragsNr, ArtikelNr}, und ihre funktionalen Abhängigkeiten sind {AuftragsNr, ArtikelNr} → Menge, AuftragsNr → KundenNr und KundenNr → Kundenname. Welches ist das richtige Ergebnis, wenn diese Tabelle bis zur dritten Normalform normalisiert wird?
  4. Der Primärschlüssel einer Mitarbeitertabelle (MitarbeiterNr, Name, Abteilungscode, Abteilungsname) ist MitarbeiterNr, und jede Spalte enthält nur einen einzigen Wert. Die funktionalen Abhängigkeiten sind MitarbeiterNr → Name, MitarbeiterNr → Abteilungscode und Abteilungscode → Abteilungsname. Welche Aussage über die Normalform dieser Tabelle ist richtig?
  5. In einer Datenbank, die überwiegend zum Lesen und Aggregieren dient, werden normalisierte Tabellen manchmal absichtlich zu einer zusammengeführt, sodass dieselben Daten mehrfach gehalten werden (Denormalisierung). Welche Kombination aus Vorteil und Nachteil dieses Entwurfs ist richtig?