-
Wenn eine Abfrage/ Unterabfrage keine übereinstimmenden Zeilen findet, gibt sie entweder NULL oder überhaupt keinen Wert zurück, also nicht einmal einen NULL-Wert. Nach welchen Kriterien gibt eine Abfrage/ Unterabfrage ein NULL zurück und wann gibt sie keine Ergebnisse zurück, nicht einmal einen NULL-Wert?
-
Gibt eine skalare Unterabfrage immer NULL zurück, wenn keine übereinstimmenden Zeilen gefunden werden? Ich nehme an, dass auch die äußerste skalare Abfrage NULL zurückgibt, wenn keine Zeilen gefunden werden?
-
SELECT Vorname, Nachname, YEAR(Geburtsdatum) FROM Personen WHERE YEAR(Geburtsdatum) IN (SELECT YearReleased FROM Alben);
-
Wenn die Unterabfrage keine Ergebnisse findet, wird die WHERE-Klausel der äußeren Abfrage dann in
WHERE YEAR(Geburtsdatum) IN (null);
übersetzt? -
Wenn die WHERE-Klausel stattdessen in
WHERE YEAR(Geburtsdatum) IN();
übersetzt wird, sollte das nicht ein Fehlerzustand sein, da wie kann der Wert vonYEAR(Geburtsdatum)
mit nichts verglichen werden?
-
Antworten
Zu viele Anzeigen?Die Unterabfrage würde nur dann NULL
zurückgeben, wenn YearReleased
NULL
war, ansonsten gäbe es einen leeren Datensatz, was den von Ihnen erwähnten Fall IN ()
darstellt.
Es ist sehr wichtig, zwischen den beiden zu unterscheiden, da sie völlig unterschiedliche Dinge bedeuten. NULL
zeigt an, dass etwas ausgewählt werden sollte, obwohl dieser Wert ein "Mangel an Wert" anzeigt. Ein leerer Datensatz zeigt an, dass nichts ausgewählt wurde, das den angegebenen Kriterien entsprach.
EDIT: aktualisiert, um Beispielergebnisse anzuzeigen
Die ersten beiden Abfragen dienen lediglich zur Anzeige dessen, was in den beiden Tabellen enthalten ist. Die dritte Abfrage ist Ihre Abfrage und die vierte Abfrage zeigt nur, dass sie ein äquivalentes Ergebnis (keine Zeilen) liefert, wenn Sie die Unterabfrage durch ein NULL
ersetzen. Die letzte Abfrage dient nur dazu zu zeigen, dass die Unterabfrage selbst einfach eine lange Liste von NULL
s zurückgibt.
A. Wenn es keine übereinstimmenden Zeilen gibt, wird das Ergebnis immer leer sein. Es gibt keine spezielle Behandlung für den NULL-Wert.
b. Das stimmt nicht. Wenn es keine übereinstimmenden Zeilen gibt, ist das Ergebnisset per Definition immer leer. Das Ergebnis einer skalaren Funktion ist kein Ergebnisset, daher ist es entweder NULL oder ein anderer Wert.
c.1. Wenn die Unterabfrage keine Zeilen zurückgibt, wird der "IN"-Ausdruck immer falsch zurückgeben. Das Set wird nicht NULL
sein.
c.2. Es ist gültig, JAHR(Geburtsdatum)
mit einem leeren Set zu vergleichen. Es wird einfach immer falsch zurückgeben.
Es gibt verschiedene Arten von Unterabfragen in SQL, und welche Sie erhalten (und das resultierende Verhalten) hängt vom Kontext ab. Wenn die Syntax (Unterabfrage)
verwendet wird, z.B. als Operand in den meisten Ausdruckskontexten, handelt es sich um eine skalare Unterabfrage. Andererseits handelt es sich als rechter Operand des IN
-Operators um eine Tabellenunterabfrage.
Für eine skalare Unterabfrage: Wenn die Unterabfrage keine Zeilen zurückgibt, ist das Ergebnis der skalaren Unterabfrage NULL
. Wenn die Unterabfrage mehr als eine Zeile zurückgibt, liegt ein Fehler vor. Gibt die Unterabfrage eine Zeile zurück, ist das Ergebnis der Wert der (einzigen) Spalte der Abfrage für diese Zeile.
Für eine Tabellenunterabfrage: Wenn die Unterabfrage keine Zeilen zurückgibt, ist das Ergebnis ein leerer Wertesatz, sodass beispielsweise die IN
-Operation immer falsch zurückgeben würde. Andernfalls ist das Ergebnis der Satz der Abfrage der Spalte für alle Zeilen.
Also um Ihre Fragen einzeln anzusprechen:
-
Es hängt vom Kontext der Unterabfrage ab
-
Ja, eine skalare Unterabfrage gibt immer
NULL
zurück, wenn keine Zeilen gefunden werden -
Im Kontext der
IN
-Operation handelt es sich um eine Tabellenunterabfrage und daher bedeutet kein Zeilen keine Werte zum Abgleichen. Beachten Sie jedoch, dass aufgrund der Semantik vonIN
Ihr Query eine Zeile zurückgibt, in der der Spaltenwert selbstNULL
ist, haben Sie einNULL
in Ihrem Vergleichssatz. DieIN
-Operation ist effektiv dasOR
von Gleichheitsvergleichen zwischen dem linken Operanden und jedem einzelnen Wert im rechten Wertesatz. Nullwerte im Satz ergeben "unbekannt" anstelle von wahr oder falsch, und dieIN
-Operation kann daher nur wahr zurückgeben (wenn es eine Übereinstimmung mit einem Nicht-Nullwert im Satz gibt) oder unbekannt (weil der Wert möglicherweise null entspricht oder auch nicht).